Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam...

13
Progressive Indexes: Indexing for Interactive Data Analysis Pedro Holanda CWI, Amsterdam [email protected] Mark Raasveldt CWI, Amsterdam [email protected] Stefan Manegold CWI, Amsterdam [email protected] Hannes M ¨ uhleisen CWI, Amsterdam [email protected] ABSTRACT Interactive exploration of large volumes of data is increasingly common, as data scientists attempt to extract interesting in- formation from large opaque data sets. This scenario presents a difficult challenge for traditional database systems, as (1) nothing is known about the query workload in advance, (2) the query workload is constantly changing, and (3) the sys- tem must provide interactive responses to the issued queries. This environment is challenging for index creation, as tra- ditional database indexes require upfront creation, hence a priori workload knowledge, to be efficient. In this paper, we introduce Progressive Indexing, a novel performance-driven indexing technique that focuses on au- tomatic index creation while providing interactive response times to incoming queries. Its design allows queries to have a limited budget to spend on index creation. The indexing budget is automatically tuned to each query before query processing. This allows for systems to provide interactive answers to queries during index creation while being robust against various workload patterns and data distributions. PVLDB Reference Format: Pedro Holanda, Mark Raasveldt, Stefan Manegold and Hannes uhleisen. Progressive Indexes: Indexing for Interactive Data Analysis. PVLDB, 12(13): 2366-2378, 2019. DOI: https://doi.org/10.14778/3358701.3358705 1. INTRODUCTION Data scientists perform exploratory data analysis to dis- cover unexpected patterns in large collections of data. This process is done with a hypothesis-driven trial-and-error ap- proach [26]. They query segments that could potentially provide insights, test their hypothesis, and either zoom in on the same segment or move to a different one depending on the insights gained. Fast responses to queries are crucial to allow for interactive data exploration. The study by Liu et al. [18] shows that any delay larger than 500ms (the “interactivity threshold”) sig- nificantly reduces the rate at which users make observations This work is licensed under the Creative Commons Attribution- NonCommercial-NoDerivatives 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. For any use beyond those covered by this license, obtain permission by emailing [email protected]. Copyright is held by the owner/author(s). Publication rights licensed to the VLDB Endowment. Proceedings of the VLDB Endowment, Vol. 12, No. 13 ISSN 2150-8097. DOI: https://doi.org/10.14778/3358701.3358705 and generate hypotheses. When dealing with small data sets, providing answers within this interactivity threshold is possible without utilizing indexes. However, exploratory data analysis is often performed on larger data sets as well. In these scenarios, indexes are required to speed up query response times. Index creation is one of the major difficult decisions in database schema design [8]. Based on the expected work- load, the database administrator (DBA) needs to decide whether creating a specific index is worth the overhead in creating and maintaining it. Creating indexes up-front is especially challenging in exploratory and interactive data analysis, where queries are not known in advance, workload patterns change frequently and interactive responses are re- quired. In these scenarios, data scientists load their data and immediately want to start querying it without waiting for index construction. In addition, it is also not certain whether or not creating an index is worth the investment at all. We cannot be sure that the column will be queried frequently enough for the large initial investment of creating a full index to pay off. In spite of these challenges, indexing remains crucial for im- proving database performance. When no indexes are present, even simple point and range selections require expensive full table scans. When these operations are performed on large data sets, indexes are essential to ensure interactive query response times. There are two main strategies that aim to release the DBA of having to manually choose which indexes to create. (1) Automated index selection techniques [1, 7, 30, 10, 6, 4, 19, 27] accomplish this by attempting to find the optimal set of indexes given a query workload, taking into account the benefits of having an index versus the added costs of creating the entire index and maintaining it during modifications to the database. However, these techniques require a priori knowledge of the expected workloads and do not work well when the workload is not known or changes frequently. Hence they are not suitable for interactive data exploration. (2) Adaptive indexing techniques such as database crack- ing [16, 9, 24, 23, 12, 15, 17, 21, 20, 11, 14, 13] are a more promising solution. They focus on automatically and incre- mentally building an index as a side effect of querying the data. An index for a column is only initiated when it is first queried. As the column is queried more, the index is refined until it eventually approaches the performance of a full index. In this way, the cost of creating an index is smeared out over the cost of querying the data many times, though not necessarily equally, and there is a smaller initial overhead 2366

Transcript of Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam...

Page 1: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

Progressive Indexes:Indexing for Interactive Data Analysis

Pedro HolandaCWI, Amsterdam

[email protected]

Mark RaasveldtCWI, Amsterdam

[email protected]

Stefan ManegoldCWI, Amsterdam

[email protected]

Hannes MuhleisenCWI, [email protected]

ABSTRACTInteractive exploration of large volumes of data is increasinglycommon, as data scientists attempt to extract interesting in-formation from large opaque data sets. This scenario presentsa difficult challenge for traditional database systems, as (1)nothing is known about the query workload in advance, (2)the query workload is constantly changing, and (3) the sys-tem must provide interactive responses to the issued queries.This environment is challenging for index creation, as tra-ditional database indexes require upfront creation, hence apriori workload knowledge, to be efficient.

In this paper, we introduce Progressive Indexing, a novelperformance-driven indexing technique that focuses on au-tomatic index creation while providing interactive responsetimes to incoming queries. Its design allows queries to havea limited budget to spend on index creation. The indexingbudget is automatically tuned to each query before queryprocessing. This allows for systems to provide interactiveanswers to queries during index creation while being robustagainst various workload patterns and data distributions.

PVLDB Reference Format:Pedro Holanda, Mark Raasveldt, Stefan Manegold and HannesMuhleisen. Progressive Indexes: Indexing for Interactive DataAnalysis. PVLDB, 12(13): 2366-2378, 2019.DOI: https://doi.org/10.14778/3358701.3358705

1. INTRODUCTIONData scientists perform exploratory data analysis to dis-

cover unexpected patterns in large collections of data. Thisprocess is done with a hypothesis-driven trial-and-error ap-proach [26]. They query segments that could potentiallyprovide insights, test their hypothesis, and either zoom inon the same segment or move to a different one dependingon the insights gained.

Fast responses to queries are crucial to allow for interactivedata exploration. The study by Liu et al. [18] shows that anydelay larger than 500ms (the “interactivity threshold”) sig-nificantly reduces the rate at which users make observations

This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. To view a copyof this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. Forany use beyond those covered by this license, obtain permission by [email protected]. Copyright is held by the owner/author(s). Publication rightslicensed to the VLDB Endowment.Proceedings of the VLDB Endowment, Vol. 12, No. 13ISSN 2150-8097.DOI: https://doi.org/10.14778/3358701.3358705

and generate hypotheses. When dealing with small datasets, providing answers within this interactivity thresholdis possible without utilizing indexes. However, exploratorydata analysis is often performed on larger data sets as well.In these scenarios, indexes are required to speed up queryresponse times.

Index creation is one of the major difficult decisions indatabase schema design [8]. Based on the expected work-load, the database administrator (DBA) needs to decidewhether creating a specific index is worth the overhead increating and maintaining it. Creating indexes up-front isespecially challenging in exploratory and interactive dataanalysis, where queries are not known in advance, workloadpatterns change frequently and interactive responses are re-quired. In these scenarios, data scientists load their dataand immediately want to start querying it without waitingfor index construction. In addition, it is also not certainwhether or not creating an index is worth the investmentat all. We cannot be sure that the column will be queriedfrequently enough for the large initial investment of creatinga full index to pay off.

In spite of these challenges, indexing remains crucial for im-proving database performance. When no indexes are present,even simple point and range selections require expensive fulltable scans. When these operations are performed on largedata sets, indexes are essential to ensure interactive queryresponse times. There are two main strategies that aim torelease the DBA of having to manually choose which indexesto create.

(1) Automated index selection techniques [1, 7, 30, 10, 6, 4,19, 27] accomplish this by attempting to find the optimal setof indexes given a query workload, taking into account thebenefits of having an index versus the added costs of creatingthe entire index and maintaining it during modifications tothe database. However, these techniques require a prioriknowledge of the expected workloads and do not work wellwhen the workload is not known or changes frequently. Hencethey are not suitable for interactive data exploration.

(2) Adaptive indexing techniques such as database crack-ing [16, 9, 24, 23, 12, 15, 17, 21, 20, 11, 14, 13] are a morepromising solution. They focus on automatically and incre-mentally building an index as a side effect of querying thedata. An index for a column is only initiated when it is firstqueried. As the column is queried more, the index is refineduntil it eventually approaches the performance of a full index.In this way, the cost of creating an index is smeared outover the cost of querying the data many times, though notnecessarily equally, and there is a smaller initial overhead

2366

Page 2: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

for starting the index creation. However, since the index isrefined only in the areas targeted by the workload, conver-gence to a full index is not guaranteed and partitions canhave different sizes. The performance of the query degradeswhen a less refined part of the index is queried, resulting inperformance spikes whenever the workload changes.

In this paper, we introduce a new incremental indexingtechnique called Progressive Indexing. It differs from other in-dexing solutions in that the indexing budget (i.e., the amountof time that is spent on index creation and refinement) can becontrolled. We provide two indexing budget flavors: a fixedindexing budget, where the user defines a fixed amount oftime to spend on indexing per query, and an adaptive index-ing budget, where the indexing budget is adapted so that thetotal time spent on query execution remains constant. As aresult, Progressive Indexing complements existing automaticindexing techniques by offering predictable performance anddeterministic convergence independent of the workload.

The main contributions of this paper are:

• We introduce several novel Progressive Indexing tech-niques and investigate their performance, convergence,and robustness in the face of various realistic syntheticworkload patterns and real-life workloads.

• We provide a cost-model for each of the ProgressiveIndexing techniques. The cost models are used toautomatically adapt the indexing budget.

• We experimentally verify that the Progressive Indexingtechniques we propose provide robust and predictableperformance and convergence regardless of the work-load or data distribution.

• We provide a decision tree to assist in choosing anindexing technique for a given scenario.

• We provide Open-Source implementations of each ofthe techniques we describe and their benchmarks.1

Outline. This paper is organized as follows. In Section 2,we investigate related research that has been performed onautomatic/adaptive index creation. In Section 3, we describeour novel Progressive Indexing techniques and discuss theirbenefits and drawbacks. In Section 4, we perform an experi-mental evaluation of each of the novel methods we introduce,and we compare them against adaptive indexing techniques.In Section 5 we draw our conclusions and present a deci-sion tree to assist in choosing which Progressive Indexingtechnique to use. Finally, in Section 6 we discuss futurework.

2. RELATED WORKAutomatic index creation and maintenance has been a

challenging and long-standing problem in database research.Even when the workload pattern is known, selecting theoptimal set of indexes is an NP-Hard problem [8]. When thequerying pattern is not known in advance, optimal a-prioriindex creation is impossible. Automatic indexing techniquescan be grouped into two categories, (1) automatic indexselection and (2) adaptive index creation.

1Our implementations and benchmarks are available athttps://github.com/pdet/ProgressiveIndexing

2.1 Automatic Index SelectionAutomatic index selection techniques [1, 7, 30, 10, 6, 19,

27, 4] attempt to solve the problem by, given an existing(or expected) workload of the system, selecting the set ofindexes that would result in optimal performance. Theproblem with these methods is that they can only be usedwhen the workload of the system is known and stable. Inan environment where the workload is unknown or rapidlychanging, beyond what is known upfront, automatic indexselection techniques do not offer much help. In addition,these techniques require sufficient time and space to investin constructing a large full index upfront.

2.2 Adaptive IndexingAdaptive indexing techniques are an alternative to a priori

index creation. Instead of constructing the index upfront,the index is constructed as a by-product of querying thedata. These techniques are designed for scenarios where theworkload is unknown, and there is no idle time to invest inindex creation. The high investment of creating an up-frontfull index is smeared out over the cost of subsequent queries.

Database Cracking [16] (also known as “Standard Crack-ing”) is the original adaptive indexing technique. It worksby physically reordering the index while processing queries.It consists of two data structures: a cracker column and acracker index. Each incoming query cracks the column intosmaller pieces and then updates the cracker index with thereference to those pieces. As more queries are processed, thecracker index converges towards a full index.

While database cracking accomplishes its mission of con-structing an index as a by-product of querying, it suffersfrom several problems that make it unsuitable for interactivedata analysis: (1) cracking adds a significant overhead overnaive scans in the first iterations of the algorithm, (2) theperformance of cracking is not robust, as sudden changes inworkload cause spikes in performance, and (3) convergencetowards a full index is slow and workload-dependent.

There is a large body of work on extending and improv-ing database cracking. These improvements include betterconvergence towards a full index [9, 24], more predictable per-formance [23, 12], more efficient tuple reconstruction [15, 17,24], better CPU utilization [20], other cracking engines [21,11], predictive query processing [29] and handling updates [14,13]. Below, we give an overview of the work done on improv-ing robustness and general performance.

Cracking Kernels [21, 11] addresses the low CPU effi-ciency caused by the high number of branch mispredictions.It suggests different cracking kernels that reorganize the ele-ments by exploiting either predication, vectorization, SIMDinstructions, or memory rewiring. Haffner et al. [11] presenta decision tree that recommends the most efficient crackingkernel depending on the query selectivity, type size, and dataorganization.

Stochastic Cracking [12] addresses the unpredictableperformance problem by creating partitions using a randompivot element instead of pivoting around the query predicates.The pivot is used to perform arbitrary reorganization stepsfor more robust query performance.

Progressive Stochastic Cracking [12] performs stochas-tic cracking in a partial fashion every iteration. It takes twoinput parameters, the size of the L2 cache and the numberof swaps allowed in one iteration (i.e., a percentage of thetotal column size). When performing stochastic cracking,

2367

Page 3: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

progressive stochastic cracking will only perform at most themaximum allowed number of swaps on pieces larger than theL2 cache. If the piece fits into the L2 cache, it will alwaysperform a complete crack of the piece.

Coarse-Granular Index [24] improves stochastic crack-ing robustness by creating equal-sized partitions when thefirst query is executed. It also allows for the creation of anynumber of partitions instead of limiting the number of parti-tions to two, letting the DBA decide between the trade-offof the higher cost of the first query versus building a morerobust index.

Adaptive Adaptive Indexing [23] is a general-purposealgorithm for adaptive indexing. It has multiple parametersthat can be tuned to mimic the data access of different adap-tive indexing techniques (e.g., database cracking, sidewayscracking, hybrid cracking). It also uses radix partitioningand exploits software managed buffers using nontemporalstreaming stores to achieve better performance [25].

3. PROGRESSIVE INDEXINGIn this section, we introduce Progressive Indexing. The

core features of Progressive Indexing are that (1) the indexingoverhead per query is controllable, both in terms of timeand memory requirements, (2) it offers robust performanceand deterministic convergence regardless of the underlyingdata distribution, workload patterns or query selectivity, and(3) the indexing budget can be automatically tuned so moreexpensive queries spend less extra time on indexing whilecheaper queries spend more.

As a result of the small initial cost, Progressive Indexingoccurs without significantly impacting worst-case query per-formance. Even if the column is only queried once, only asmall penalty is incurred. On the other hand, if the columnis queried hundreds of times, the index will reliably convergetowards a full index and queries will be answered at the samespeed as with an a-priori built full index.

All Progressive Indexing algorithms progress through threecanonical phases to eventually converge to a full B+-treeindex: the creation phase, the refinement phase, and theconsolidation phase. The work for each phase can be dividedbetween multiple queries, keeping the extra indexing effortper query strictly limited.

Creation Phase. The creation phase progressively buildsan initial “crude” version of the index by adding another δfraction of the original column to the index with each query.Query execution during the creation phase is performed inthree steps:

1. Perform an index lookup on the ρ fraction of the datathat has already been indexed;

2. Scan the not-yet-indexed 1− ρ fraction of the originalcolumn;and while doing so,

3. Expand the index by another δ fraction of the totalcolumn.

As the index grows, and the fraction ρ of the indexed dataincreases, an ever-smaller fraction of the base column hasto be scanned, progressively improving query performance.Once all data of the base column has been added to the index,the creation phase is followed by the refinement phase.

Table 1: Parameters for Progressive Indexing Cost Models.System ω cost of sequential page read (s)

κ cost of sequential page write (s)φ cost of random page access (s)γ elements per page

Data set N number of elements in the data set& Query α % of data scanned in partial index

ε % of data scanned in final indexIndex δ % of data to-be-indexed

ρ % of data already indexedλ indexing budget as % of query cost

Progressive h height of the binary search treeQuicksort σ cost of swapping two elements (s)Progressive b number of bucketsRadixsort sb max elements per bucket block

τ cost of memory allocation (s)B+-Tree β tree fanout

Refinement Phase. With the base column no longerrequired to answer queries, we only perform lookups intothe index to answer queries. While doing these lookups, wefurther refine the index, progressively converging towards afully ordered index. In the refinement phase, we focus onrefining parts of the index that are required for query pro-cessing. After these parts have been refined, the refinementprocess starts processing the neighboring parts. Once theindex is fully ordered, the refinement phase is followed bythe consolidation phase.

Consolidation Phase. With the index fully ordered, weprogressively construct a B+-tree from it, since a B+-Treeprovides better data locality and thus is more efficient thanbinary search when executing very selective queries. Oncethe B+-tree is completed, we use it exclusively to answer allsubsequent queries.

Indexing Budget. The value of δ determines how muchtime is spent on constructing the index and hence deter-mines the indexing budget. Instead of letting the user set δthemselves, however, we let the user pick between setting ei-ther a fixed indexing budget or an adaptive indexing budget.For the fixed indexing budget, the user provides a desiredindexing budget tbudget to spend on indexing for the firstquery. We then select the value of δ based on this budget anduse that δ for the remainder of the workload. The adaptiveindexing budget allows the user to specify a desired indexingbudget for the first query tbudget. The first query will thenexecute in time tadaptive = tscan + tbudget. After the firstquery, the value of δ will be adapted such that the query costwill stay equivalent to tadaptive until the index is converged.

Cost Model. We use a cost model to determine howmuch time we can spend on indexing when working withthe adaptive indexing budget. The cost model takes intoaccount the query predicates, the selectivity of the queryand the state of the index in a way that is not sensitive todifferent data distributions or querying patterns and doesnot rely on having any statistics about the data available.The parameters of our progressive indexing cost model aresummarized in Table 1. To allow for robust query executiontimes regardless of the data, we avoid branches in the codeand use predication when possible [22, 3].

In the following sections, we will introduce four Progres-sive Indexing algorithms: Progressive Quicksort, ProgressiveRadixsort (MSD), Progressive Bucketsort (Equi-Height), andProgressive Radixsort (LSD).

2368

Page 4: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

3.1 Progressive QuicksortFigure 1 depicts snapshots of the creation phase, the re-

finement phase, and the consolidation phase of ProgressiveQuicksort. We discuss all three phases in detail in the fol-lowing paragraphs.

Creation PhaseIn the first iteration, we allocate an uninitialized column ofthe same size as the original column and select a pivot. Thepivot is selected by taking the average value of the smallestand largest value of the column. In Figure 1, pivot 10 is theaverage of 1 and 19. If sufficient statistics are available, themedian value of the column could be used instead. Unlikeadaptive indexing, the pivot selection is not impacted by thequery predicates. We then scan the original column and copythe first N ∗ δ elements to either the top or bottom of theindex depending on their relation to the pivot. In this step,we also search for any elements that fulfill the query predicateand afterwards scan the not-yet-indexed 1 − ρ fraction ofthe column to compute the complete answer to the query.In subsequent iterations, we scan either the top, bottom, orboth parts of the index based on how the query predicaterelates to the chosen pivot.

Cost Model. The total time taken in the creation phaseis the sum of (1) the scan time of the base table, (2) the indexlookup time and (3) the additional indexing time. The scantime is given by multiplying the amount of pages we needto scan (N

γ) by the amount of time it takes for a sequential

page access (ω), resulting in tscan = ω ∗ Nγ

. The pivotingtime, i.e., index construction time, consists of scanning thepages of the base table and writing the pivoted elementsto the result array. The pivoting time is therefore obtainedby multiplying the time it takes to scan and write a pagesequentially (κ+ω) by the amount of pages we need to write,resulting in tpivot = (κ+ ω) ∗ N

γ.

The total time taken for the initial indexing process is givenby multiplying the scan time by the fraction of the base tablewe need to scan. Initially, we need to scan the entire basetable, but as the fraction of indexed data (ρ) increases, weneed to scan less. Instead, we scan the index to answer thequery. The amount of data we need to scan in the indexdepends on how the query predicates relate to the pivot. Thefraction of data that we need to scan is given by α, and canbe computed for a given set of query predicates. The total

1619

7

14

1313

1

14

8

911

1

63

63161321819712114914

Original Column

A ≤ 10

10 < A

6

16

2

Uni

nitia

lized

Initialize

32

8914111213

Initialize 2

A ≤ 10

10 < A

A ≤ 7

7 < A

A ≤ 15

15 < A

Refinement

Pivo

t=10

Pivo

t=15

Pivo

t=7

1413

46

123

78

12

1619

Consolidation

Sorte

d

161114

B+ T

ree

A ≤ 10

10 < A Pivo

t=10

7

632

49

111219

16

Figure 1: Progressive Quicksort.

fraction of the data that we scan is 1−ρ+α−δ. The fractionof the data that we index in each step is δ. Hence the totaltime taken is given by ttotal = (1−ρ+α−δ)∗tscan+δ∗tpivot.

Indexing Budget. In this phase, we set delta such that

δ =tbudgettpivot

. For the fixed indexing budget, we select this δ

for the first query and keep on using this δ for the remainderof the workload. For the adaptive indexing budget, we usethis formula to select the δ for each query.

Refinement PhaseWe refine the index by recursively continuing the quicksortin-place in the separate sections. The refinement consistsof swapping elements in-place inside the index around thepivots of the different segments. When the pivoting of asegment is completed, we recursively continue the quicksortin the child segments. We maintain a binary tree of thepivot points. In the nodes of this tree, we keep track ofthe pivot points and how far along the pivoting process weare. To do an index lookup, we use this binary tree to findthe sections of the array that could potentially match thequery predicate and only scan those, effectively reducing theamount of data to be accessed even when the full pivotinghas not been completed yet.

When we reach a node that is smaller than the L1 cache,we sort the entire node instead of recursing any further.After sorting a node entirely, we mark it as sorted. Whentwo children of a node are sorted, the entire node itself issorted, and we can prune the child nodes. As the algorithmprogresses, leaf nodes will keep on being sorted and pruneduntil only a single fully sorted array remains.

Cost Model. In the refinement phase, we no longer needto scan the base table. Instead, we only need to scan thefraction α of the data in the index. However, we now needto (1) traverse the binary tree to figure out the bounds of α,and (2) swap elements in-place inside the index instead ofsequentially writing them to refine the index. The cost fortraversing the binary tree is given by the height of the binarytree h times the cost of a random page access φ, resulting intlookup = h ∗ φ. For the swapping of elements, we performpredicated swapping to allow for a constant cost regardlessof how many elements we need to swap. Therefore the costfor swapping is equivalent to the cost of sequential writing,i.e., tswap = κ ∗ N

γ. The total cost in this phase is therefore

equivalent to ttotal = tlookup + α ∗ tscan + δ ∗ tswap.Indexing Budget. In this phase, we set delta such that

δ =tbudgettswap

for the adaptive indexing budget.

Consolidation PhaseIn the consolidation phase we construct a B+-tree index ontop of our sorted array. In order to progressively constructthe B+-Tree we copy every β element of our sorted array

to a parent level. In total we copy Ncopy =∑logβ (n)

i=1 ( nβi

)

elements. This process is depicted in the consolidation phaseof Figure 1 where β = 4 and the parent node of the arrayindexes every 4th element (i.e., offsets 0, 4, 8 and 12).

Cost Model. In the consolidation phase, we use bi-nary search in the sorted array until the B+-Tree levelsare complete. This results in tlookup = log2 (n) ∗ φ. Toconstruct the B+-Tree we copy every β element from onelevel to the next, therefore the cost of copying the ele-ments is the cost of access a random element from the cur-rent level and sequentially write it to the next, defined by

2369

Page 5: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

tcopy = Ncopy ∗κ∗γ The total cost in this phase is equivalentto ttotal = tlookup + α ∗ tscan + δ ∗ tcopy.

Indexing Budget. In this phase, we set delta such that

δ =tbudgettcopy

for the adaptive indexing budget.

3.2 Progressive Radixsort (MSD)Figure 2 depicts snapshots of the creation phase, the re-

finement phase, and the consolidation phase of ProgressiveRadixsort (MSD). We discuss all three phases in detail inthe following paragraphs.

Creation PhaseIn the creation phase of progressive radixsort, we performthe radixsort partitioning into buckets that are located inseparate memory regions. We start by allocating b emptybuckets. Then, while scanning the original column, we placeN ∗δ elements into the buckets based on their most significantlog2 b bits. We then scan the remaining 1 − ρ fraction ofthe base column. In subsequent iterations, we scan the [0, b]buckets that could potentially contain elements matching thequery predicate to answer the query in addition to scanningthe remainder of the base column.

Bucket Count. Radix clustering performs a randommemory access pattern that randomly writes in b outputbuckets. To avoid excessive cache- and TLB-misses, assumingthat each bucket is at least of the size of a memory page,the number b of buckets, and thus the number of randomlyaccessed memory pages, should not exceed the number ofcache lines and TLB entries, whichever is smaller [2]. Sinceour machine has 512 L1 cache lines and 64 TLB entries, weuse b = 64 buckets.

Bucket Layout. To avoid having to allocate large regionsof sequential data for every bucket, the buckets are imple-mented as a linked list of blocks of memory that each hold upto sb elements. When a block is filled, another block is addedto the list and elements will be written to that block. Thisadds some overhead over sequential reads/writes as everysb elements there will be a memory allocation and randomaccess, and for every element that is added the bounds ofthe current block have to be checked.

Cost Model. In the creation phase, the total time takenis the sum of (1) the scan time of the base table, (2) the indexlookup time and (3) the time it takes to add elements tobuckets. The scan time of the base table is equivalent to the

11

4

1

13

8

14

11

3

16

16

13

3

19

8

1414

1

63141321819712114169

6

2

Initialize Refinement

00…

13

11

17

632

4

12

9

01…

10…

11…

Uni

nitia

lized

19

00.

01.

10.

11.

1

2467

00.

01.

10.

11.

9

12

00…

01…

10…

Refinement

13

8

14

11

3

00.

01.

10.

11.

1

2467

00.

01.

10.

11.

9

12

9

16

13

6

23

78

12

14

19

Original Column

Figure 2: Progressive Radixsort (MSD).

scan time (tscan) given in Section 3.1. Scanning the bucketsfor the already indexed data has equivalent performance toperforming a sequential scan plus the random accesses weneed to perform every sb elements, hence the scan time ofthe buckets is equivalent to tbscan = tscan + φ ∗ N

sb. As we

determine which bucket an element belongs to only basedon the most significant bits, finding the relevant bucket foran element can be done using a single bitshift. As we chosethe bucket count such that all bucket regions can fit incache, the cost of writing elements to buckets is equivalentto the cost of sequentially writing them (κ). We need toperform a memory allocation every sb entries, which has acost of τ . This results in a total cost of bucketing equal totbucket = (κ + ω) ∗ N

γ+ τ ∗ N

sb. The total cost is therefore

ttotal = (1− ρ− δ) ∗ tscan + α ∗ tbscan + δ ∗ tbucket.Indexing Budget. In this phase, we set delta such that

δ =tbudgettbucket

. For the fixed indexing budget, we select this δ

for the first query and keep on using this δ for the remainderof the workload. For the adaptive indexing budget, we usethis formula to select the δ for each query.

Refinement PhaseIn the refinement phase, all elements in the original columnhave been appended to the buckets. In this phase, we re-cursively partition by the next set of log2 b most significantdigits. For each of the buckets, this results in the creationof another set of b buckets in each of the refinement phases,for a total of b ∗ b buckets in the second phase. To avoid theoverhead of managing these buckets to become bigger thanthe overhead of actually performing the radix partitioning,we avoid re-partitioning buckets that fit into the L1 cacheand instead immediately insert the values of these buckets insorted order into the final sorted array, as shown in Figure 2.As the buckets themselves are ordered (i.e., for two buckets biand bi+1, we know ei < ei+1∀ei ∈ bi, ei+1 ∈ bi+1), we knowthe position of each bucket in the final sorted array withouthaving to consider any elements in the other buckets.

We keep track of the buckets using a tree in which thenodes point towards either the leaf buckets or towards aposition in the final sorted array in case the leaf buckets havealready been merged in there. This tree is used to answerqueries on the intermediate structure. When we get a query,we look up which buckets we have to scan based on the mostsignificant bits of the query predicates. We then scan thebuckets or the final index, where required.

When the first iteration of the refinement phase is com-pleted, we recursively continue with the next set of log2 bmost significant digits until all the elements have been mergedand sorted into the final index. At that point, we constructour B+-tree index from the single fully sorted array.

Cost Model. The total time taken for a query is thesum of (1) the time taken to scan the required bucketsto answer the query predicates and (2) the time taken toperform the radix partitioning of the elements. The timetaken to scan the buckets is the same as in the creationphase, α ∗ tbscan. The time taken for the radix partitioningis tbucket = (κ+ ω) ∗ N

γ+ τ ∗ N

sb. The total cost is therefore

ttotal = α ∗ tbscan + δ ∗ tbucket.Indexing Budget. In this phase, we set delta such that

δ =tbudgettbucket

for the adaptive indexing budget.

2370

Page 6: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

3.3 Progressive BucketsortProgressive Bucketsort (Equi-Height) is very similar to

Progressive Radixsort (MSD). The main difference is in theway the initial partitions (buckets) are determined. Insteadof radix clustering, which is fast but yields equally sizedpartitions only with uniform data distributions, we performa value-based range partitioning to yield equally sized parti-tions also with skewed data, at the expense that determiningthe bucket that a value belongs to is more expensive. Figure 3depicts a snapshot of the creation phase and two snapshots ofthe refinement phase. In the following, we discuss these twophases in detail. The consolidation phase is the same as withProgressive Quicksort and Progressive Radixsort (MSD).

Bucket Count. To optimize for writing and reading fromthe buckets, our implementation of progressive bucketsortuses 64 buckets, as discussed in Section 3.2.

Creation PhaseProgressive Bucketsort operates in a very similar way toProgressive Radixsort (MSD). Instead of choosing the bucketan element belongs to based only on the most significantbits, the bucket is chosen based on a set of bounds thatmore-or-less evenly divide the elements of the set into theseparate buckets. These bounds can be obtained either inthe scan to answer the first query or from existing statisticsin the database (e.g., a histogram).

Cost Model. In the creation phase, the cost of thealgorithm is identical to that of Progressive Radixsort (MSD)except that determining which element a bucket belongs tonow requires us to perform a binary search on the bucketboundaries, costing an additional log2 b time per elementwe bucket. This results in the following cost for the initialindexing process ttotal = (1− ρ− δ) ∗ tscan + α ∗ tbscan + δ ∗log2 b ∗ tbucket.

Indexing Budget. In this phase, we set delta such that

δ =tbudget

log2 b∗tbucket. For the fixed indexing budget, we select

this δ for the first query and keep on using this δ for theremainder of the workload. For the adaptive indexing budget,we use this formula to select the δ for each query.

131416

87

16

346

11

4

19

13

76

9

46

12

63141321819712114169

Original Column

3

1

Initialize Refinement

23

12

19

Refinement

A<5

9

11

321

8

12

14

A<5 A < 3

3<=A

5<=A

<10

10<=

A<14

14<=

A<20

21

A < 5

5<=A

Uni

nitia

lized

Sorte

d

A < 10

10<=A

1314

5<=A

<10

10<=

A<14

14<=

A<20 So

rted

A < 8

8<=A

A < 5

5<=A

Figure 3: Progressive Bucket Sort

Refinement PhaseIn the refinement phase, all elements in the original columnhave been appended to the buckets. We then merge thebuckets into a single sorted array. Unlike with ProgressiveRadixsort (MSD), we do not recursively keep on using pro-gressive bucketsort. This is because the overhead of findingand maintaining the equi-height bounds for each of the sub-buckets is too large. Instead, we sort the individual bucketsinto the final sorted list using Progressive Quicksort. Usinga progressive algorithm to sort individual buckets protectsus from performance spikes caused by sorting large buckets.

The buckets are merged into the final sorted index inorder, as such, we always have at most a single iterationof Progressive Quicksort active at a time in which we areperforming swaps. As we are using Progressive Quicksort,the cost model for this phase is equivalent to the cost modelof Progressive Quicksort. After all the buckets have beenmerged and sorted into the final index, we have a single fullysorted array from which we can construct our B+-tree index.

3.4 Progressive Radixsort (LSD)Progressive Radixsort Least Significant Digits (LSD) per-

forms a progressive radix clustering on the least significantbits during the creation phase. Given that this does notresult in a range partitioning, as with radix cluster (MSD),we cannot perform Progressive Quicksort in the individualbuckets to refine them in-place. Instead, we perform out-of-place radix (LSD) clustering also during the refinementphase, to achieve a ”pure” Radixsort (LSD) in a progressivemanner. Figure 4 depicts a snapshot of the creation phaseand two snapshots of the refinement phase. In the following,we discuss these two phases in detail. The consolidationphase is the same as above.

Bucket Count. To optimize for writing and readingfrom the buckets our implementation of progressive radixsort(LSD) uses 64 buckets, as discussed in Section 3.2.

Creation PhaseThe creation phase of this algorithm is similar to the creationphase of Progressive Radixsort (MSD) except that we parti-tion elements based on the least-significant bits instead of themost-significant bits. We can use the buckets that are cre-ated to speed up point queries because we only need to scan

9

193

137

136

14

1

6

2

63141321819712114169

Original Column Initialize Refinement Refinement

…00

8

13

23

…00

…01

…10

…11

14

…01

…10

…113

1

19

12

11

416

9

.00.

..0

1..

.10.

..1

1..

8

12

4

16

6

0….

1….

4

8

16

6

1213

.00.

..0

1..

.10.

..1

1..

1

14

2

7

11

1619

12346

Figure 4: Progressive Radixsort (LSD).

2371

Page 7: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

the bucket in which the query value falls. However, unlikethe buckets created for the Progressive Radixsort (MSD) andProgressive Bucketsort, these intermediate buckets cannot beused to speed up range queries in many situations. Becausethe elements are inserted based on their least-significant bits,the buckets do not form a value-based range-partitioning ofthe data. Consequently, we will have to scan many buckets,depending on the domain covered by the range query.

The cost model for the Progressive Radixsort (LSD) is alsoequivalent to the cost model of the Progressive Radixsort(MSD), except the value of α is likely to be higher for rangequeries (depending on the query predicates) as the elementsthat answer the query predicate are spread in more buckets.As scanning the buckets is slower than scanning the originalcolumn, we also have a fallback that when α == ρ we scanthe original column instead of using the buckets to answerthe query.

Refinement PhaseIn the refinement phase, we move elements from the cur-rent set of buckets to a new set of buckets based on thenext set of significant bits. We repeat this process untilthe column is sorted. How many iterations this takes de-pends on the bucket count and the value domain of thecolumn, which we obtain from the [min,max] values. Wecan compute the amount of required iterations with theformula dlog2(max−min)/log2(b)e. For example, for acolumn with values in the range of [0, 216) and 64 buck-ets, the amount of iterations required before convergence isdlog2(216)/log2(64)e = 3.

Cost Model. In this phase, we scan α fraction of theoriginal buckets to answer the query and move δ fractionof the elements into the new set of buckets. This resultsin the following cost for the refinement process: ttotal =α ∗ tbscan + δ ∗ tbucket.

Indexing Budget. In this phase, we set delta as δ =tbudgettbucket

for the adaptive indexing budget.

4. EXPERIMENTAL EVALUATIONIn this section, we provide an evaluation of the proposed

Progressive Indexing methods and the performance charac-teristics they exhibit. In addition, we provide a comparisonof the performance of the proposed methods with adaptiveindexing methods.

Setup. We implemented all our Progressive Indexingalgorithms in a stand-alone program written in C++. We in-cluded implementations of the adaptive indexing algorithms,provided by the authors, and implemented an adaptive crack-ing kernel algorithm that picks the most efficient kernel whenexecuting a query, following the decision tree from Haffneret al. [11]. Both the progressive indexing algorithms andthe existing techniques were compiled with GNU g++ version7.2.1 using optimization level -O3. All experiments were con-ducted on a machine equipped with 256 GB main memoryand an 8-core Intel Xeon E5-2650 v2 CPU @ 2.6 GHz with20480 KB L3 cache.

4.1 WorkloadsIn the performance evaluation, we use two data sets.SkyServer. The Sloan Digital Sky Survey2 is a project

that maps the universe. The data set and interactive data ex-

2https://www.sdss.org/

(a) Data Distribution

0

108

0 50000 100000 150000

Query (#)

Que

ry R

ange

(b) Workload

Figure 5: Skyserver

ploration query logs are publicly available via the SkyServer3

website. Similar to Halim et al. [12] we focus the benchmarkon the range queries that are applied on the Right Ascensioncolumn of the PhotoObjAll table. The data set containsalmost 600 million tuples, with around 160, 000 range queriesthat focus on specific sections of the domain before movingto different areas. The data and the workload distributionsare shown in Figure 5.

Synthetic. The synthetic data set is composed of twodata distributions, consisting of 108 or 109 8-byte integersdistributed in the range of [0, n), i.e., for 109 the values arein the range of [0, 109). We use two different data sets. Thefirst one is composed of unique integers that are uniformlydistributed, while the second one follows a skewed distri-bution with non-unique integers where 90% of the data isconcentrated in the middle of the [0, n) range. The syntheticworkload consists of 106 queries in the form SELECT SUM(R.A)

FROM R WHERE R.A BETWEEN V1 AND V2. The values for V1

and V2 are chosen based on the workload pattern. The dif-ferent workload patterns and their mathematical descriptionare depicted in Figure 6.

4.2 Impact of Delta (δ)The δ parameter determines the performance character-

istics shown by the Progressive Indexing algorithms. Forδ = 0, no indexing is performed, meaning that algorithmsresort to performing full scans on the data, never convergingto a full index. For δ = 1, the entire creation phase willbe completed immediately during the first query execution.Between these two extremes, we are interested in seeing howdifferent values of the δ parameter influence the performancecharacteristics of the different algorithms.

In order to measure the impact of different δ parameters onthe different algorithms, we execute the SkyServer workloadusing a δ ∈ [0.005, 1]. We measure the time taken for thefirst query, the amount of queries until pay-off, the amountof queries necessary for full convergence, and the total timespent executing the entire workload.

First Query. Figure 7a shows the performance of thefirst query for varying values of δ. The performance of thefirst query degrades as δ increases since each query doesextra work proportional to δ. For every algorithm, however,the amount of extra work done differs.

We can see that Bucketsort is impacted the most by in-creasing δ. This is because determining which bucket anelement falls into costs O(log b) time, followed by a randomwrite for inserting the element into the bucket. Radixsort,despite its similar nature to Bucketsort, is impacted muchless heavily by an increased δ. This is because determiningwhich bucket an element falls into costs constant O(1) time.

3http://skyserver.sdss.org/

2372

Page 8: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

Figure 6: Synthetic Workloads [12].

● ●●

3

6

9

12

0.01 0.10 1.00

δ

Que

ry T

ime

(s)

● P. BucketP. QuickP. Radix (LSD)P. Radix (MSD)

(a) First query.

● ● ● ●

●● ●●●●●●●

0

250

500

750

0.01 0.10 1.00

δ

Que

ry N

umbe

r (#

)

● P. BucketP. QuickP. Radix (LSD)P. Radix (MSD)

(b) Pay-off.

●● ● ● ●●●●●●●0

1000

2000

3000

4000

5000

0.01 0.10 1.00

δ

Que

ry N

umbe

r (#

)

● P. BucketP. QuickP. Radix (LSD)P. Radix (MSD)

(c) Convergence.

●●

● ● ● ● ●●●●●●●

0

250

500

750

0.01 0.10 1.00

δ

Tota

l Tim

e (s

)

● P. BucketP. QuickP. Radix (LSD)P. Radix (MSD)

(d) Cumulative time.

Figure 7: Progressive indexing experiments with varying deltas (X-axes in logarithmic scale).

Quicksort experiences the lowest impact from an increasing δ,as elements are always written to only two memory locations(the top and bottom of the array), the extra sequential writesare not very expensive.

Pay-Off. Figure 7b shows the number of queries requireduntil the Progressive Indexing technique becomes worth theinvestment (i.e., the query number q for which

∑q tprog ≤∑

q tscan) for varying values of δ. We observe that witha very small δ, it takes many queries until the indexingpays off. While a small δ ensures low first query costs, itsignificantly limits the progress of index-creation per query,and consequently the speed-up of query processing. Withincreasing δ, the number of queries required until pay-offquickly drops to a stable level.

We see that Radixsort (LSD) needs a very high amountof queries to pay-off for low values of δ. This is becausethe intermediate index that is created cannot be used toaccelerate wide range queries until the index is converged.When the value of δ is high, the index converges fasterand hence can be utilized to answer range queries earlier.Quicksort also has a high time to pay-off with a low deltabecause the intermediate index can only be used to acceleraterange queries that do not contain the pivots, hence in earlystages of the index the full table often needs to be scanned.Bucketsort and Radixsort (MSD) do not suffer from theseproblems, hence they pay-off fast even with lower values forδ.

Convergence. The δ parameter affects the convergencespeed towards a full index. When δ = 0 the index will never

converge, and a higher value for δ will cause the index toconverge faster as more work is done per query on buildingthe index.

Figure 7c shows the number of queries required until theindex converges towards a full index. We see that Radixsortconverges the fastest, even with a low δ. It is followed byQuicksort and then Bucketsort.

The reason Radixsort converges in so few iterations isbecause it uses radix partitioning, which means that afterdlog2(n)/log2(b)e = dlog2(109)/log2(64)e = 5 partitioningrounds the index is fully converged. The other algorithmsuse quicksort pivoting, which requires more passes over thedata.

Cumulative Time. As we have seen before, a high valuefor δ means that more time is spent on constructing theindex, meaning that the index converges towards a full indexfaster. While earlier queries take longer with a higher valueof δ, subsequent queries take less time. Another interestingmeasurement is the cumulative time spent on answering alarge number of queries. Does the increased investment inindex creation earlier on pay off in the long run?

Figure 7d depicts the cumulative query cost. We can seethat a higher value of δ leads to a lower cumulative time.Converging towards a full index requires the same amount oftime spent on constructing the index, regardless of the valueof δ. However, when δ is higher, that work is spent earlieron (during fewer queries), and queries can benefit from theconstructed index earlier.

Progressive Quicksort and Radixsort (LSD) perform poorlywhen the delta is low. For Quicksort, this is because it will

2373

Page 9: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

take many queries to finish our pivoting in one element.While in Radixsort (LSD) the intermediate index that iscreated cannot be effectively used to answer range queries be-fore it fully converges, meaning a long time until convergenceresults in poor cumulative time. Progressive Bucketsort andRadixsort (MSD) perform better than Progressive Quicksortfor all values of δ, with Radixsort (MSD) slightly outper-forming Bucketsort.

Another observation here is that the cumulative time con-verges rather quickly with an increasing delta. The cumu-lative time with δ = 0.25 and δ = 1 are almost identicalfor all algorithms, while the penalization of the initial querycontinues to increase significantly (recall Figure 7a).

4.3 Cost Model ValidationFor both the fixed indexing budget and the adaptive index-

ing budget, we need the cost models presented in Section 2.2to estimate the actual query processing and index creationcosts. For the fixed indexing budget, we need the cost modelto compute the initial value of δ based on the desired in-dexing budget. For the adaptive indexing budget, we needthe cost model to adapt the value of δ for each query to thecurrent minimum query cost.

In this set of experiments, we experimentally validate ourcost models. In order to use the cost models in practice, weneed to first obtain values for all of the constants that areused, such as the scanning speed and the cost of a cache miss.Since these constants depend on the hardware, we performthese operations when the program starts up and measurehow long it takes to perform these operations. The measuredvalues are then used as the constants in our cost model.

Fixed Indexing Budget. Before diving into the detailsof choosing a variable δ per query for the adaptive indexingbudget, we first experimentally validate our cost models.We run the SkyServer benchmark with a constant δ = 0.25for the entire query sequence and compare the measuredexecution times with the times predicted by our cost models.

Figure 8 shows the results for all four Progressive Index-ing techniques we propose. The graphs clearly depict theindividual phases of our algorithms (cf., Section 3) and showthat significant improvements in query performance happenmostly with the transition from one phase to the next. Giventhat δ determines the fraction of data that is to be consid-ered for index refinement with each query (rather than afraction of the full scan cost), the different techniques depictdifferent per query cost, depending on the respective indexrefinement operations performed as well as the efficiency ofthe respective partially built indexes. The graphs also showthat our cost models predict the actual costs well, accuratelypredicting each phase transition as well as the point whenthe full index has been finalized, and no further indexing isrequired.

Adaptive Indexing Budget. With our cost models val-idated, we now run the SkyServer benchmark with all fourProgressive Indexing techniques with the adaptive indexingbudget. We select tbudget = 0.2∗ tscan, i.e., the indexing bud-get is selected as 20% of the full scan cost. Figure 9 depictsthe results of this experiment for each of the algorithms. Inall graphs, we observe that the total execution time staysclose to constant at a high level, matching the given budgetuntil the index is fully built, and no further refinement isrequired.

In Figure 9a, the measured and predicted time are shown

for the Progressive Quicksort algorithm. Initially, the costmodel accurately predicts the performance of the algorithm.However, close to convergence, the cost model predicts aslightly higher execution time. This is because as the piecesbecome smaller, they start fitting inside the CPU cachesentirely, which results in faster swaps than predicted by ourcost model.

In Figure 9b, the measured and predicted time are shownfor the Progressive Radixsort (MSD) algorithm. In theinitialization phase, the cost model matches the measuredtime initially, but the measured time slightly decreases belowthe cost model as the initialization progresses. This is becausethe data distribution is relatively skewed, which results inthe same buckets being scanned for every query, which willthen be cache resident and faster than predicted. In therefinement phase, there are some minor deviations from thecost model caused by smaller radix partitions fitting in CPUcaches, which our cost model does not accurately predict.

In Figure 9c, the measured and predicted time are shownfor the Progressive Radixsort (LSD) algorithm. The costmodel accurately predicts the performance of the initializa-tion and refinement phases of the algorithm but results inseveral spikes later in the refinement phase. These spikesoccur because the workload we are using consists of very widerange queries. These range queries can only take advantageof the LSD index depending on the exact range queries issued.Because of this, certain queries can be answered much fasterusing the index, whereas others cannot use the index at all.As our cost model is pessimistic, this results in the measuredtime being faster than the predicted time.

In Figure 9d, the measured and predicted time are shownfor the Progressive Bucketsort algorithm. In the initializationphase, the cost model closely matches the measured time.After it, Progressive Quicksort is used to merge the differentbuckets into a single sorted array. The different iterationsof Progressive Quicksort each have small downwards spikeswhen the pieces start fitting inside the CPU caches.

4.4 Adaptive Indexing ComparisonIn the remainder of the experiments section, we will be

comparing the progressive indexing techniques with existingadaptive indexing techniques. In particular, we focus onstandard cracking (STD), stochastic cracking (STC), pro-gressive stochastic cracking (PSTC), coarse granular index(CGI) and adaptive adaptive indexing (AA).

The implementations for the Full Index, Standard Crack-ing, Stochastic Cracking, and Coarse Granular Index wereinspired by the work done in Schuhknecht et al. [24]4. Theimplementation for Progressive Stochastic Cracking was in-spired by the work done in Halim et al. [12]5. Progressivestochastic cracking is run with the allowed swaps set to 10%of the base column. The implementation for the adaptiveadaptive indexing algorithm has been provided to us by theauthors of the Adaptive Adaptive Indexing work [23], andwe use the manual configuration suggested in their paper.

We compare all the progressive indexing techniques that wehave introduced in this work: Progressive Quicksort (PQ),Progressive Bucketsort (PB), Progressive Radixsort LSD(PLSD) and Progressive Radixsort MSD (PMSD). For eachof the techniques, we use an adaptive indexing budget where

4https://infosys.uni-saarland.de/publications/uncracked_pieces_sourcecode.zip5https://github.com/felix-halim/scrack

2374

Page 10: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

1e−05

1e−03

1e−01

1e+01

1 10 100 1000

Query (#)

Tim

e (s

)

MeasuredCost Model

(a) P. Quicksort.

1e−05

1e−03

1e−01

1e+01

1 10 100 1000

Query (#)

Tim

e (s

)

MeasuredCost Model

(b) P. Radixsort (MSD).

1e−05

1e−03

1e−01

1e+01

1 10 100 1000

Query (#)

Tim

e (s

)

MeasuredCost Model

(c) P. Radixsort (LSD).

1e−05

1e−03

1e−01

1e+01

1 10 100 1000

Query (#)

Tim

e (s

)

MeasuredCost Model

(d) P. Bucketsort.

Figure 8: SkyServer Workload with Fixed Indexing Budget (all axes in log scale)

1e−05

1e−03

1e−01

1e+01

1 10 100 1000

Query (#)

Tim

e (s

)

MeasuredCost Model

(a) P. Quicksort.

1e−05

1e−03

1e−01

1e+01

1 10 100 1000

Query (#)

Tim

e (s

)

MeasuredCost Model

(b) P. Radixsort (MSD).

1e−05

1e−03

1e−01

1e+01

1 10 100 1000

Query (#)

Tim

e (s

)

MeasuredCost Model

(c) P. Radixsort (LSD).

1e−05

1e−03

1e−01

1e+01

1 10 100 1000

Query (#)

Tim

e (s

)

MeasuredCost Model

(d) P. Bucketsort.

Figure 9: SkyServer Workload with Adaptive Indexing Budget (all axes in log scale)

we set tbudget = 0.2 ∗ tscan, i.e., the cost of each query willbe equivalent to 1.2 ∗ tscan until convergence.

For reference, we also include the timing results when onlyperforming full scans on the data (FS) and when constructinga full index immediately on the first query (FI). The fullscan implementation uses predication to avoid branches, andthe full index bulk loads the data into a B+-tree after whichthe B+-tree is used to answer subsequent queries.

Metrics. The metrics that we are interested in are thetime taken for the first query, the amount of queries requireduntil convergence, the robustness of each of the algorithmsand the cumulative response time. The robustness we com-pute by taking the variance of the first 100 query times.

SkyServer Workload

Table 2: SkyServer ResultsIndex First Q Convergence Robustness Cumulative

FS 0.75 x 0 118743.7FI 34.10 1 x 121.4

STD 5.26 x 0.290 1082.2STC 4.99 x 0.250 245.6

PSTC 4.89 x 0.240 254.5CGI 5.71 x 0.320 1008.9AA 8.50 x 0.800 188.4PQ 0.90 150 0.002 202.9

PMSD 0.90 119 0.030 157.5PLSD 0.81 368 3.4e-05 377.4

PB 0.83 138 0.009 166.4

In the first part of the experiments section, we execute thefull SkyServer workload using each of the different indexingtechniques. The results for each of the indexing techniquesare shown in Table 2. The algorithms have been divided intothree sections: the baseline, the adaptive indexing techniques,and the progressive indexing techniques.

The results for the baseline techniques are not very sur-prising. The full scan method is the most robust method,as we use predication, and no index is constructed the costof each query is identical. The full scan method is also thecheapest method when it comes to the cost of the first queryas no time is spent on indexing at all. The full scan, how-ever, takes significantly longer to answer the full workloadthan the other methods. Answering the full workload takesalmost 30 hours, whereas all the other techniques finish theentire workload in under 20 minutes. The full index lies atthe other extreme. It takes 50x longer to answer the firstquery while the index is being constructed, however, it hasthe lowest cumulative time as the index can be utilized toquickly answer all of the remaining queries.

For the adaptive indexing techniques, we can see that theirfirst query cost is significantly lower than that of a full index,but still significantly higher than that of a full scan. Each ofthe adaptive indexing methods perform a significant amountof work copying the data and cracking the index on the firstquery that result in a very high cost for the first query. Theydo achieve a significantly faster cumulative time than thefull scans, however, in sum, they take longer than the fullindex to answer the workload. Standard cracking and coarsegranular indexing perform particularly poorly because ofthe sequential nature of the workload, as shown in Figure 5.Stochastic cracking and adaptive indexing perform better asthey do not choose the pivots based on the query predicates.Adaptive adaptive indexing has the best cumulative perfor-mance, which is consistent with the results in Schuhknechtet al. [23].

The progressive indexing methods all have approximatelythe same cost for the first query, which is 1.2x the scancost. This is by design as we set the indexing budgettbudget = 0.2 ∗ tscan for each of the algorithms. The maindifference between the algorithms is the robustness and the

2375

Page 11: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

Index (0.000003)

1.2x Scan (0.9)

10 1000

Query (#)

Que

ry T

ime

(log(

s))

● AA IdxP. QuickP. Stc 10%

Figure 10: Progressive Quicksort vs Adaptive Indexing. (allaxes in log scale)

time until convergence. As we are executing range queries,the Radixsort LSD performs the worst. The LSD partition-ing cannot assist in answering the range queries, and hence,the intermediate index does not speed up the workload priorto convergence. Radixsort MSD performs the best, as thedata set is rather uniformly distributed the radix partitioningworks to very efficiently create a partitioning of the data,which can be immediately utilized to speed up subsequentqueries. For each of the progressive indexing methods, wesee that they converge relatively early in the workload. Aswe have set every query to take 1.2 ∗ tscan until convergence,a significant amount of time can be spent on constructingthe index for each query, especially in later queries whenthe intermediate index can already be used to efficiently ob-tain the answer. We also note that the progressive indexingmethods each have a significantly higher robustness scorethan the adaptive indexing methods. Progressive indexingpresents up to 4 orders of magnitude lower query variancewhen compared to the adaptive indexing techniques. This isachieved by our cost model balancing the per query execu-tion cost to be (almost) the same until convergence, whileadaptive indexing suffers from many performance spikes.

The execution time for each of the queries in the SkyServerworkload is shown in Figure 10. For clarity, we focus on thebest adaptive indexing methods (Adaptive Adaptive Index-ing in terms of cumulative time, and Progressive Stochastic10% in terms of first query cost and robustness) and progres-sive quicksort. We can see that both the adaptive indexingmethods start with a significantly higher first query cost,and then fall quickly. Neither of them sufficiently converges,however, and both continue to have many performance spikes.Progressive quicksort, on the other hand, starts at the speci-fied budget and maintains that query cost until convergence,after which the cost drops to the cost of a full index.

Synthetic WorkloadsIn the second part of our experiments, we execute all syn-thetic workloads described in Section 4.1. All results arepresented in tables, each table is divided into four parts, eachrepresenting one set of experiments. The first three are ondata with 108 elements and use random distribution, skeweddistribution, and only point queries respectively. The finalone is on 109 elements on random distribution. With theexception of point queries and the ZoomIn and SeqZoomInworkloads, all queries have 0.1 selectivity. From the adaptiveindexing techniques, adaptive adaptive indexing presents the

best cumulative time. Hence we select it for comparison. Aspreviously, we set the indexing budget tbudget = 0.2 ∗ tscanfor each progressive indexing algorithm.

Table 3: First query costWorkload PQ PB PLSD PMSD AA

Un

iform

Ran

dom

SeqOver 0.15 0.15 0.14 0.14 1.4ZoomOutAlt 0.15 0.15 0.14 0.14 1.4

Skew 0.15 0.15 0.14 0.14 1.4Random 0.15 0.15 0.14 0.14 1.4

SeqZoomIn 0.15 0.15 0.14 0.14 1.4Periodic 0.15 0.15 0.14 0.14 1.4

ZoomInAlt 0.15 0.15 0.14 0.14 1.4ZoomIn 0.15 0.15 0.14 0.14 1.4

Skew

ed

SeqOver 0.15 0.15 0.14 0.14 1.5ZoomOutAlt 0.15 0.15 0.14 0.13 1.5

Skew 0.15 0.15 0.14 0.13 1.5Random 0.15 0.15 0.13 0.13 1.5

SeqZoomIn 0.15 0.15 0.14 0.13 1.5Periodic 0.15 0.15 0.14 0.13 1.5

ZoomInAlt 0.15 0.15 0.14 0.14 1.5ZoomIn 0.15 0.15 0.14 0.14 1.5

Poin

tQ

uer

y SeqOver 0.15 0.15 0.21 0.14 1.4ZoomOutAlt 0.15 0.15 0.21 0.14 1.4

Skew 0.15 0.15 0.21 0.14 1.4Random 0.15 0.15 0.21 0.14 1.4Periodic 0.15 0.15 0.21 0.14 1.4

ZoomInAlt 0.15 0.15 0.21 0.14 1.4

109

SeqOver 1.5 1.5 1.4 1.7 13.9Skew 1.5 1.5 1.4 1.7 13.8

Random 1.5 1.5 1.4 1.7 25.4

Table 3 depicts the cost of the first query for all algorithms.All progressive indexing algorithms present a similar firstquery cost. Which accounts for approximately 1.2x the scancost, as chosen in our setup. Adaptive indexing has a highercost due to the complete copy of the data and by completinga full partition step in the first query. In general, progressiveindexing has one order of magnitude faster first query costthan adaptive indexing.

Table 4: Cumulative TimeWorkload PQ PB PLSD PMSD AA

Un

iform

Ran

dom

SeqOver 19.0 17.9 48.2 16.2 20.7ZoomOutAlt 20.7 28.3 59.5 26.7 22.1

Skew 18.8 17.7 48.1 15.9 10.1Random 24.7 22.8 53.1 21.1 29.1

SeqZoomIn 22.0 20.9 53.5 19.3 21.1Periodic 23.3 22.0 63.9 20.4 18.4

ZoomInAlt 20.8 23.3 54.2 21.6 21.7ZoomIn 167.0 165.0 210.0 164.0 277.0

Skew

ed

SeqOver 21.8 30.0 59.7 21.7 17.5ZoomOutAlt 21.5 30.2 64.4 63.7 41.1

Skew 17.4 15.3 45.5 17.3 5.7Random 24.0 21.6 51.5 23.8 23.9

SeqZoomIn 23.3 21.2 52.6 23.1 18.3Periodic 23.3 21.3 64.2 23.3 17.0

ZoomInAlt 22.2 25.1 54.8 21.8 33.5ZoomIn 938.0 919.0 934.0 917.0 1655.0

Poin

tQ

uer

y SeqOver 16.7 15.7 13.2 14.0 15.1ZoomOutAlt 17.7 15.8 13.0 14.0 15.5

Skew 16.6 15.5 12.7 13.7 5.6Random 18.4 16.5 13.6 14.7 14.4Periodic 16.8 15.7 13.0 14.3 5.7

ZoomInAlt 17.7 15.9 13.2 14.1 15.2

109

SeqOver 516 493 924 480 653Skew 538 513 885 487 582

Random 773 718 1579 692 1104

Table 4 depicts the cumulative time of fully executing eachworkload. Under uniform random data, we can see that

2376

Page 12: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

progressive indexing outperforms adaptive indexing in mostworkloads, with the exception of the skewed and the peri-odic workload. This comes with no surprise since adaptiveindexing techniques have been designed to refine, and boostaccess, to frequently accessed parts of the data. From theprogressive algorithms, radixsort (MSD) is the fastest sinceradixsort is capable to outperform other techniques underrandomly distributed data.

For the skewed distribution, adaptive indexing outperformsprogressive indexing in almost all workloads, due to its refine-ment strategy. However, progressive indexing outperformsadaptive indexing for ZoomIn/Out workloads, since eachquery accesses a different partition in different boundaries ofthe data, which leads to adaptive indexing accessing largeunrefined pieces in the initial queries. From the progressivealgorithms, bucketsort presents the fastest times since it gen-erates equal-sized partitions for skewed data distributions.

For point queries, radixsort (LSD) outperforms all algo-rithms in all workload since its intermediate index can beused early on to accelerate point queries.

Finally, for the 109 data size, progressive indexing managesto outperform adaptive indexing even for the skewed work-load, the key difference here is that the chunks of unrefineddata are bigger, and progressive indexing actually spendsthe time on fully converging them into small pieces whileadaptive indexing must manage larger pieces of data.

Table 5: RobustnessWorkload PQ PB PLSD PMSD AA

Un

iform

Ran

dom

SeqOver 2.4e-04 5.8e-04 2.2e-05 2.1e-04 0.02ZoomOutAlt 1.7e-04 6.0e-04 2.1e-05 2.1e-04 0.02Skew 2.5e-04 6.2e-04 2.9e-05 2.3e-04 0.02Random 2.1e-04 6.5e-04 2.3e-05 2.0e-04 0.02SeqZoomIn 2.3e-04 5.5e-04 2.6e-05 2.1e-04 0.02Periodic 2.4e-04 6.6e-04 1.9e-05 2.1e-04 0.02ZoomInAlt 2.4e-04 5.4e-04 2.2e-05 2.1e-04 0.02ZoomIn 2.3e-04 3.8e-04 3.1e-05 1.4e-04 0.02

Skew

ed

SeqOver 3.7e-04 7.5e-04 1.6e-05 2.5e-03 0.03ZoomOutAlt 3.1e-04 7.6e-04 1.4e-05 2.7e-04 0.03Skew 3.5e-04 7.9e-04 1.4e-05 2.5e-03 0.03Random 3.4e-04 7.8e-04 1.9e-05 2.5e-03 0.03SeqZoomIn 3.6e-04 8.5e-04 1.4e-05 2.5e-03 0.03Periodic 3.2e-04 8.2e-04 1.5e-05 2.4e-03 0.03ZoomInAlt 3.4e-04 7.5e-04 1.4e-05 2.5e-03 0.02ZoomIn 1.9e-05 2.3e-04 1.4e-05 1.4e-03 0.02

Poin

tQ

uer

y SeqOver 2.4e-04 7.0e-04 1.5e-03 2.2e-04 0.02ZoomOutAlt 1.8e-04 6.3e-04 1.6e-03 2.1e-04 0.02Skew 2.6e-04 6.8e-04 1.6e-03 2.3e-04 0.02Random 2.2e-04 6.6e-04 1.6e-03 2.5e-04 0.02Periodic 2.2e-04 6.8e-04 1.1e-03 2.1e-04 0.02ZoomInAlt 2.3e-04 6.8e-04 1.5e-03 3.3e-04 0.02

109

SeqOver 0.02 0.03 2.8e-04 0.04 2.1Skew 8.1e-03 0.03 1.0e-04 0.03 2.1Random 0.01 0.03 2.4e-04 0.02 7.0

Table 5 presents the robustness of the indexing algorithms.Progressive indexing presents up to four orders of magni-tudes less variance than adaptive indexing. This is due tothe design characteristic of progressive indexing to inflict acontrolled indexing penalty. For uniform random and skeweddistributions, radixsort LSD presents the least variance. Thisis due to out cost model noticing that the intermediate indexcreated by LSD cannot be used to boost query access, henceknowing the precise cost of executing the query (i.e., a fullscan cost). However, for point queries, the intermediateindex from LSD can already be used, which reduces the costmodel accuracy.

Figure 11: Progressive Indexing Decision Tree.

5. CONCLUSIONIn this paper, we introduce Progressive Indexing, a novel

incremental indexing technique that offers robust and pre-dictable query performance under different workloads. Pro-gressive techniques perform indexing within an interactivitythreshold and provide a balance between fast convergence to-wards a full index together with a small performance penaltyfor the initial queries. We propose four different progressiveindexing techniques and develop cost models for all of themthat allow for automatic tuning. We show how they performwith both real and synthetic workloads and compare theirperformance against adaptive indexing techniques. Based onthe main characteristics of each algorithm and the results ofour experimental evaluation, we conclude our work with thedecision tree shown in Figure 11, that provides recommenda-tions on which technique to use in different situations.

6. FUTURE WORKWe point out the following as the main aspects to be

explored in progressive indexing future work:

• Approximate Query Processing. One could alsoresort to using approximate query processing tech-niques [5] to allow for a faster convergence. We canthen build a progressive index as a by-product of theapproximate query processing, leading to better accu-racy and faster responses as the data is queried moreoften.

• Indexing Methods. Other techniques can be adaptedto work progressively with different benefits. For ex-ample, instead of constructing the complete hash table,we only insert n ∗ δ elements and scan the remainderof the column. The partial hash table can be used toanswer point queries on the indexed part of the data.Another example is column imprints [28] where insteadof immediately building imprints for the entire column,only build them for the first fraction δ of the data.

• Interleaving Progressive Strategies. As depictedin our decision tree, different progressive strategiescan be more efficient in different scenarios. When theindexing budget is small, the indexes can take longer tofully converge, and the workload patterns might changedramatically. Detecting these changes and changingthe progressive strategy on-the-fly can be beneficial forthese cases.

7. ACKNOWLEDGMENTSThis work was funded by the Netherlands Organisation

for Scientific Research (NWO), projects “Data Mining onHigh-Volume Simulation Output” (Holanda) and “ProcessMining for Multi-Objective Online Control” (Raasveldt).

2377

Page 13: Progressive Indexes: Indexing for Interactive Data AnalysisPedro Holanda CWI, Amsterdam holanda@cwi.nl Mark Raasveldt CWI, Amsterdam raasveld@cwi.nl Stefan Manegold ... (3) convergence

8. REFERENCES[1] S. Agrawal, S. Chaudhuri, and V. R. Narasayya.

Automated Selection of Materialized Views andIndexes in SQL Databases. In Proceedings of the 26thInternational Conference on Very Large Data Bases,VLDB ’00, pages 496–505, San Francisco, CA, USA,2000. Morgan Kaufmann Publishers Inc.

[2] P. A. Boncz, S. Manegold, and M. L. Kersten. Databasearchitecture optimized for the new bottleneck: Memoryaccess. In VLDB’99, Proceedings of 25th InternationalConference on Very Large Data Bases, September 7-10,1999, Edinburgh, Scotland, UK, pages 54–65, 1999.

[3] P. A. Boncz, M. Zukowski, and N. Nes.MonetDB/X100: Hyper-Pipelining Query Execution.In CIDR, 2005.

[4] N. Bruno. Automated Physical Database Design andTunning. CRC-Press, 2011.

[5] K. Chakrabarti, M. Garofalakis, R. Rastogi, andK. Shim. Approximate query processing using wavelets.The VLDB JournalThe International Journal on VeryLarge Data Bases, 10(2-3):199–223, 2001.

[6] S. Chaudhuri and V. Narasayya. AutoAdmin “What-if”Index Analysis Utility. ACM SIGMOD Record,27(2):367–378, 1998.

[7] S. Chaudhuri and V. R. Narasayya. An Efficient,Cost-Driven Index Selection Tool for Microsoft SQLServer. In VLDB, volume 97, pages 146–155, 1997.

[8] D. Comer. The Difficulty of Optimum Index Selection.ACM Transactions on Database Systems (TODS),3(4):440–445, 1978.

[9] G. Graefe and H. Kuno. Self-selecting, self-tuning,incrementally optimized indexes. In Proceedings of the13th International Conference on Extending DatabaseTechnology, pages 371–381. ACM, 2010.

[10] H. Gupta, V. Harinarayan, A. Rajaraman, and J. D.Ullman. Index Selection for OLAP. In DataEngineering, 1997. Proceedings. 13th InternationalConference on, pages 208–219. IEEE, 1997.

[11] I. Haffner, F. M. Schuhknecht, and J. Dittrich. AnAnalysis and Comparison of Database Cracking Kernels.In Proceedings of the 14th International Workshop onData Management on New Hardware, DAMON ’18,pages 10:1–10:10, New York, NY, USA, 2018. ACM.

[12] F. Halim, S. Idreos, P. Karras, and R. H. Yap.Stochastic Database Cracking: Towards RobustAdaptive Indexing in Main-Memory Column-Stores.PVLDB, 5(6):502–513, 2012.

[13] P. Holanda and E. C. de Almeida. SPST-Index: ASelf-Pruning Splay Tree Index for Caching DatabaseCracking. In EDBT, pages 458–461, 2017.

[14] S. Idreos, M. L. Kersten, and S. Manegold. Updating aCracked Database. In Proceedings of the 2007 ACMSIGMOD International Conference on Management ofData, SIGMOD ’07, pages 413–424, New York, NY,USA, 2007. ACM.

[15] S. Idreos, M. L. Kersten, and S. Manegold.Self-organizing Tuple Reconstruction in Column-stores.SIGMOD, pages 297–308, 2009.

[16] S. Idreos, M. L. Kersten, S. Manegold, et al. DatabaseCracking. In CIDR, volume 3, pages 1–8, 2007.

[17] S. Idreos, S. Manegold, H. Kuno, and G. Graefe.Merging What’s Cracked, Cracking What’s Merged:Adaptive Indexing in Main-Memory Column-Stores.PVLDB, 4(9):586–597, 2011.

[18] Z. Liu and J. Heer. The Effects of Interactive Latencyon Exploratory Visual Analysis. Visualization andComputer Graphics, IEEE Transactions on,20:2122–2131, 12 2014.

[19] A. Pavlo, G. Angulo, J. Arulraj, H. Lin, J. Lin, L. Ma,P. Menon, T. C. Mowry, M. Perron, I. Quah, et al.Self-Driving Database Management Systems. In CIDR,2017.

[20] E. Petraki, S. Idreos, and S. Manegold. HolisticIndexing in Main-memory Column-stores. InProceedings of the 2015 ACM SIGMOD InternationalConference on Management of Data, pages 1153–1166.ACM, 2015.

[21] H. Pirk, E. Petraki, S. Idreos, S. Manegold, andM. Kersten. Database Cracking: Fancy Scan, not PoorMan’s Sort! In Proceedings of the Tenth InternationalWorkshop on Data Management on New Hardware,page 4. ACM, 2014.

[22] K. A. Ross. Conjunctive selection conditions in mainmemory. In Proceedings of the Twenty-first ACMSIGACT-SIGMOD-SIGART Symposium on Principlesof Database Systems, June 3-5, Madison, Wisconsin,USA, pages 109–120, 2002.

[23] F. M. Schuhknecht, J. Dittrich, and L. Linden.Adaptive adaptive indexing. ICDE, 2018.

[24] F. M. Schuhknecht, A. Jindal, and J. Dittrich. TheUncracked Pieces in Database Cracking. PVLDB,7(2):97–108, 2013.

[25] F. M. Schuhknecht, P. Khanchandani, and J. Dittrich.On the surprising difficulty of simple things: the case ofradix partitioning. PVLDB, 8(9):934–937, 2015.

[26] T. Sellam, E. Mller, and M. Kersten. Semi-AutomatedExploration of Data Warehouses. In CIKM, pages1321–1330, 10 2015.

[27] A. Sharma, F. M. Schuhknecht, and J. Dittrich. TheCase for Automatic Database Administration usingDeep Reinforcement Learning. arXiv preprintarXiv:1801.05643, 2018.

[28] L. Sidirourgos and M. Kersten. Column Imprints: ASecondary Index Structure. In Proceedings of the 2013ACM SIGMOD International Conference onManagement of Data, SIGMOD ’13, pages 893–904,New York, NY, USA, 2013. ACM.

[29] E. Teixeira, P. Amora, and J. C. Machado.Metisidx-from adaptive to predictive data indexing. InEDBT, pages 485–488, 2018.

[30] G. Valentin, M. Zuliani, D. C. Zilio, G. Lohman, andA. Skelley. DB2 Advisor: An Optimizer Smart Enoughto Recommend Its Own Indexes. In Data Engineering,2000. Proceedings. 16th International Conference on,pages 101–110. IEEE, 2000.

2378