<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>PhD Workshop, August</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Progressive Indices: Indexing without prejudice</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Informatica Amsterdam</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Netherlands holanda@cwi.nl</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>After 10 Queries</institution>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2018</year>
      </pub-date>
      <volume>27</volume>
      <issue>2018</issue>
      <abstract>
        <p>Database cracking is a method to create partial indices as a side-e ect of processing queries. Cracking e ciently smears out the cost of creating a full index over a stream of queries, creating an index that is over tted to queried parts of the data. This core characteristic of cracking leads to unpredictable performance and unreliable convergence towards a full index. These problems are aggravated when considering updates and multidimensional queries. We envision a new indexing technique, Progressive Indexing that improves database cracking by strictly limiting per-query indexing cost to a budget (e.g., a user-de ned fraction of scan costs), allowing the rst and subsequent queries to complete without heavy penalties. At the same time, all indexing e ort is spent towards predictable convergence towards a full index. We discuss di erent algorithms to deal with multidimensional queries and updates while maintaining a robust and convergent index, we then explore the research space and new challenges that arise from this new technique.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. INTRODUCTION</title>
      <p>
        Index creation is one of the major di cult decisions in
database schema design [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Based on the workload, the
database administrator needs to decide whether creating a
speci c index is worth the overhead of creating and
maintaining it. This considerable up-front cost creates a trade-o
that requires careful consideration and experimentation.
      </p>
      <p>
        Automatic physical design tuning [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] aims to release the
user of having to manually choose which indexes to
create. They attempt to nd the optimal set of indices given
a query workload, by balancing the bene ts of having an
index versus the added costs of creating the index and
maintaining it during modi cations to the database. However,
these tools are not able to work on dynamic systems due to
the unpredictability and lack of idle time for a priori index
creation.
      </p>
      <p>
        Adaptive indexing techniques, such as database
cracking [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ], attempt to solve this problem by presenting an
adaptive partial indexing approach for relational databases.
It works by building a partial index as a co-product of query
processing. The index is built the rst time a column is
queried and is continuously re ned as subsequent queries
are executed. This way the cost of creating an index is
distributed over a stream of queries.
      </p>
      <p>However, database cracking and its variations are not
robust against varying workload patterns. Since the index is
only re ned in the areas targeted by the workload. Queries
that deviate from them will target unre ned sections of the
index, leading to large and unpredictable spikes in performance.
This problem is exacerbated when dealing with updates. In
case the most re ned area is also the most updated, and
multidimensional queries (i.e., queries with selections in multiple
columns) since one must maintain multiple indices, one for
each column.</p>
      <p>To address these needs we propose a novel approach for
incremental indexes, Progressive Indexing. Where every query
that is issued to the database results in a xed re nement
of the index, leading to a robust query execution and full
convergence towards a full index. While maintaining a low
extra cost per query.</p>
      <p>Figure 1 depicts how progressive indexing works.
Considering an unindexed column, a pivot and a budget = 0:1,
we start by indexing a fraction of the data while scanning
the remaining 1 piece of data. After 3 queries, 30% of
our column is already indexed around . The fourth query
starts by performing an index lookup on the fraction of
the data that has already been indexed while scanning the
unindexed 1 piece and expanding the index by another
fraction of the total column. Finally, after 10 queries, we fully
indexed and we continue this process by selecting another .</p>
      <p>Paper Structure. The rest of this paper is structured
as follows. Section 2 provides an overview of related work.
Then, section 3, describes progressive indexing. Section 4
presents a brief proof of concept and experimental analysis.
Finally, in section 5, we discuss our research plan.</p>
    </sec>
    <sec id="sec-2">
      <title>RELATED WORK</title>
      <p>Automatic physical database design has been an active
research eld for the past twenty years. These work resulted
in two di erent areas; self-tuning tools and adaptive indexing.</p>
      <p>
        Self-Tuning Tools [
        <xref ref-type="bibr" rid="ref1 ref16 ref3 ref6">1, 3, 16, 6</xref>
        ] attempt to solve this
problem by automatically recommending a set of indexes to
optimize a known workload of the system. However, these
systems depend on previous workload knowledge and are
only able to create full indexes. Unsuitable for unpredictable
workloads or when there is no idle time to be invested in a
priori index creation.
      </p>
      <p>
        Adaptive Indexing [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] is an alternative to the
selftuning tools. It is especially useful in scenarios where the
workload is unpredictable and there is no idle time to
invest in index creation. It tackles these problems by creating
indexes that are workload dependent in an incremental
fashion. Figure 2 depicts an example of database cracking [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
Query Q1 starts by triggering the creation of the cracker
column(i.e., initially a copy of column A) where the tuples
are clustered in three pieces re ecting the range predicate of
Q1. The result of Q1 is then retrieved as a view on the Piece
colored in red (i.e., 10 &lt; A &lt; 14). Later, query Q2 requires
a re nement of Pieces 1 and 3 (i.e., respectively indexing
A &gt; 7 and A 16), splitting each in two new pieces.
      </p>
      <p>Database cracking has multiple issues: (1) poor
convergence towards a full index, (2) ine cient tuple reconstruction,
(3) unpredictable performance and (4) ine cient updates.
Below we brie y discuss the research that addresses these
issues.</p>
      <p>
        Convergence. Hybrid cracking [
        <xref ref-type="bibr" rid="ref12 ref15 ref5">5, 12, 15</xref>
        ] mitigate the
issue of poor convergence towards a full index by executing
many initial cracking runs with random pivots. Although
this provides better convergence and higher robustness it
greatly impacts the cost of the rst query.
      </p>
      <p>
        Tuple Reconstruction. Sideways cracking [
        <xref ref-type="bibr" rid="ref10 ref15">10, 15</xref>
        ]
address the ine cient tuple reconstruction problem. It
minimizes the tuple reconstruction cost by using a \cracker maps"
data structure. They provide a mapping between attributes
that are combined in queries. However, the strategy is only
applied to tuple reconstruction and not to multidimensional
queries.
      </p>
      <p>
        Robustness. Stochastic cracking [
        <xref ref-type="bibr" rid="ref15 ref7">7, 15</xref>
        ] address the
unpredictable performance problem by creating partitions using
a random pivot element instead of pivoting around the query
predicates. However, the actual cracking still occurs in the
pieces where the query predicates fall into.
      </p>
      <p>
        Generalization. Adaptive adaptive indexing [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]
attempts to be a general-purpose algorithm for adaptive
indexing. It has multiple parameters that can be tuned to mimic
the data access of multiple adaptive indexing techniques (e.g.,
database cracking, sideways cracking, hybrid cracking).
      </p>
      <p>
        Updates. SPST-Index [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] extends the original cracking
work on updates [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] by rotating nodes when they are accessed
in order to cluster cold-data on the leaves. When updates
are executed the leaves are pruned, consequently the index
constraints are relaxed resulting in faster updates. However
this work still alleviates the cost of updates by increasing the
cost of cracking for the subsequent queries, bringing more
unpredictability to the query costs.
3.
      </p>
    </sec>
    <sec id="sec-3">
      <title>PROGRESSIVE INDICES</title>
      <p>The previous section gave us the necessary motivation
for progressive indexing. Motivated by: (1) The workload
dependent pivot selection causes performance spikes and
does not guarantee convergence towards a full index. (2)
Cracking is not able to e ciently handle multidimensional
queries since it must maintain multiple indices and intersect
their points, and (3) the robustness is penalized when dealing
with updates due to partial index removal and the possibility
of updates being focused in re ned cracked pieces.</p>
      <p>We propose progressive indexing. Progressive indexing is
designed to be e cient when dealing with multiple types
of queries and updates without sacri cing robustness or
convergence. We believe that the following modi cations
from adaptive indexing must be taken: (1) the pivot-selection
does not need to be workload dependent, every query must
have a budget to spend on indexing creation or maintenance
and when an indexed piece is smaller than L1 cache it is
fully ordered. (2) Progressive indexing generates a unique
index for multiple columns, and (3) other sorting algorithms,
besides quick-sort adaptations, are exploited in order to
e ciently merge updates while maintaining robustness and
convergence.</p>
      <p>As a result of the small initial cost, progressive indexing
occurs without signi cant impact on query performance and
has a near-immediate return on investment over performing
naive scans. Even if the column is only queried a few times,
progressive indexing will still provide a performance bene t.
On the other hand, if the column is queried thousands of
times, the index will reliably converge towards a full index
and queries will be answered at the same performance as if
a full index had been built.</p>
      <p>Single Column. Figure 3 depicts an example of
progressive quick-sort. In this example, we de ne a budget = 0:5.
Query Q1 starts by triggering the initialize phase from
progressive quick-sort. First, it allocates an uninitialized column
of the same size of the original column and then selects 9 as
a pivot . The original column is scanned and n , where n
is the column size, elements are copied either to the top or
the bottom of the copied column, depending on the pivot,
while doing so we also select the elements that ful ll Q1
predicates. A binary search tree (BST) is also formed to
keep track of the pivot points. The subsequent queries can
already leverage from the sorted data by performing lookups
in the BST. Later, query Q2 triggers the re ne phase fully
indexing the column around . Q3 then select another , and
the re nement process continues until we reach a full index.
The main disadvantage of progressive quick-sort is that fast
convergence relies entirely on good pivot point selection.
1136 Initialize 24</p>
      <p>Refine 12</p>
      <p>Updates. Updates are stored in an extra vector. When
a query is executed this extra column is also fully scanned.
When our original column is fully sorted, we drop the BST,
since we can now perform a binary search on the ordered
column, and start the merging process with the column that
holds the updates. To e ciently merge the updates into our
original column we use progressive merge-sort. Progressive
merge-sort consists of two build phases. In the rst build
phase, one unsorted chunk of size n is sorted, where n
is the column size and is our budget. In order to answer
queries, we perform a binary search in the sorted chunks
while scanning the unsorted data. In the second build phase,
we merge the sorted chunks together using a cascading
twoway merge. Note that we do not necessarily complete a
full merge in one query, as this would result in large drops
in performance when we merge two large chunks together.
Instead, we merge at most n 2 elements and keep track of
how far along the merge we are. After a merge is completed,
we replace the two original chunks with the merged chunk.
Figure 4 depicts the progressive merge-sort algorithm with
= 0:5, in the rst phase half the column is ordered in
a chunk. The second phase orders the remaining of the
column in another chunk and nally both chunks are merged
resulting in a fully ordered column. The main disadvantage
of merge-sort is that while we have many sorted chunks, we
are performing many random accesses, as we are doing a full
binary search in each of the 1= chunks.</p>
      <p>Multi-column. We adapt progressive quick-sort to work
with multidimensional queries by generating a KD-Tree on
top of the columns. In a KD-Tree every level of the tree
consists of only one column. To maintain this property we
interleave our pivots through the columns. Multidimensional
progressive quick-sort can be visualized in gure 5. For
simplicity in our example we set = 1 (i.e., every iteration
fully indexes one pivot). In the rst iteration we select a
= 3 to use as a pivot for column X. Since our = 1 at the
end of the rst query, we will have fully copied the columns
and fully indexed the column X around 3, while keeping the
alignment with column Y . A KD-Tree is then created to
keep track of the indexed pivot. Later, when Q2 is executed
it triggers another iteration of progressive indexing. However,
this time we are going to reorder the column Y over a new
= 5. Since we have already indexed X on 3, we need to
reorder Y in the two pieces of X to maintain the alignment.T
he main disadvantage of multidimensional progressive
quicksort is that it does not provide progressive usage of space,
after fully indexing the rst pivot, we have already made full
copies of all the columns.</p>
    </sec>
    <sec id="sec-4">
      <title>4. PRELIMINARY RESULTS</title>
      <p>In this section, we present a brief experimental analysis
to demonstrate the strong potential bene ts of progressive
indexing.</p>
      <p>Setup. We implemented progressive quick-sort in a
standalone program written in C++ and optimized using level
3. All experiments were conducted on a machine running
Fedora 26, with an Intel Core i7-2600K CPU @ 3.40 GHz
with 8 cores, 16 GB of main memory and 8192 KB L3 cache
size.</p>
      <p>We use an 8-byte integer array with 108 uniformly
distributed values as our dataset. All queries are of the form:
SELECT SUM(R.A) FROM R WHERE R.A BETWEEN V1 AND V2.
All the queries have selectivity equal to 0.1 and we de ne
our budget = 0:1. All the progressive quick-sort pivots are
randomly selected.</p>
      <p>In Figure 6 we depict the per-query performance
evaluation of progressive quick-sort, database cracking, stochastic
cracking, coarse-granular index (i.e., a stochastic cracking
variant), a B+tree as a full index and column scans. We
can observe that adaptive indexing techniques show a very
)
)
s
(g 1.0
o
l
(
e
m
i
TScan
y
r
e
u
Q
Index
0
100</p>
      <p>300
200</p>
      <p>Query (#)
volatile performance with much more spikes throughout our
query stream. This is due to the index re ned by the
workload. One can observe that progressive quick-sort has a more
robust performance but still presents performance spikes
due to the partial index creation depending entirely on the
pivot selection. Additionally one can observe that
progressive quick-sort converges to a full index around query 120,
whereas the adaptive index techniques never converge.</p>
    </sec>
    <sec id="sec-5">
      <title>FUTURE RESEARCH</title>
      <p>Progressive indexing introduces new aspects that were
unexplored by adaptive indexing and that require further
investigation. We envision, as our ultimate goal, the creation
of a formal cost-model with a decision tree that is able to
choose and interleave from di erent progressive indexes. In
order to optimize the query response time without penalizing
robustness or convergence. We describe the following as the
aspects that shall be explored:</p>
      <p>Sorting-algorithms. We discussed two di erent
algorithms adapted to work as progressive indexes.
However, many other well-known algorithms (e.g.,
radixsort, bucket-sort, heap-sort) can be adapted to work in
a progressive fashion as well.</p>
      <p>
        Pivot-selection. Some sorting algorithms (e.g.,
quicksort) require a good pivot point selection. Di erent
strategies can be applied to select a pivot. It can
be workload dependent, data dependent, completely
random or even a mix from all of the above;
Data Structure. Di erent data structures can be
used to exploit modern processes and boost access to
the ordered data, like the ART-tree [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], or even just
having a fully ordered vector and dropping any extra
structure might be bene cial for faster updates;
Index Budget. We used as a budget a xed
userde ned constant from a scan as our budget. However,
this budget can adapt itself to keep a more robust cost,
above the scan, until the index is fully generated and
ready to be completely exploited.
      </p>
      <p>We point out the following as the research steps that we
will follow in the next coming years:
1. Adapt other sorting algorithms to work progressively
and analyze their advantages and disadvantages de
ning a cost-model with a decision tree to unify all
solutions;
6.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>S.</given-names>
            <surname>Agrawal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Chaudhuri</surname>
          </string-name>
          , and
          <string-name>
            <given-names>V. R.</given-names>
            <surname>Narasayya</surname>
          </string-name>
          .
          <source>Automated Selection of Materialized Views and Indexes in SQL Databases. In VLDB</source>
          ,
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>N.</given-names>
            <surname>Bruno</surname>
          </string-name>
          .
          <source>Automated Physical Database Design and Tunning</source>
          . CRC-Press,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>S.</given-names>
            <surname>Chaudhuri</surname>
          </string-name>
          and
          <string-name>
            <given-names>V. R.</given-names>
            <surname>Narasayya</surname>
          </string-name>
          .
          <article-title>An E cient, Cost-Driven Index Selection Tool for Microsoft SQL Server</article-title>
          .
          <source>In VLDB</source>
          , volume
          <volume>97</volume>
          ,
          <year>1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>D.</given-names>
            <surname>Comer</surname>
          </string-name>
          .
          <article-title>The Di culty of Optimum Index Selection</article-title>
          .
          <source>TODS</source>
          ,
          <volume>3</volume>
          (
          <issue>4</issue>
          ):
          <volume>440</volume>
          {
          <fpage>445</fpage>
          ,
          <year>1978</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>G.</given-names>
            <surname>Graefe</surname>
          </string-name>
          and
          <string-name>
            <given-names>H.</given-names>
            <surname>Kuno</surname>
          </string-name>
          .
          <article-title>Self-selecting, self-tuning, incrementally optimized indexes</article-title>
          .
          <source>In EDBT</source>
          , pages
          <volume>371</volume>
          {
          <fpage>381</fpage>
          . ACM,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>H.</given-names>
            <surname>Gupta</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Harinarayan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Rajaraman</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J. D.</given-names>
            <surname>Ullman</surname>
          </string-name>
          .
          <article-title>Index Selection for OLAP</article-title>
          .
          <source>In Data Engineering</source>
          ,
          <year>1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>F.</given-names>
            <surname>Halim</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Idreos</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Karras</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R. H.</given-names>
            <surname>Yap</surname>
          </string-name>
          . Stochastic Database Cracking:
          <article-title>Towards Robust Adaptive Indexing in Main-Memory Column-Stores</article-title>
          .
          <source>VLDB</source>
          ,
          <volume>5</volume>
          (
          <issue>6</issue>
          ):
          <volume>502</volume>
          {
          <fpage>513</fpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>P.</given-names>
            <surname>Holanda</surname>
          </string-name>
          and E. C. de Almeida.
          <article-title>SPST-Index: A Self-Pruning Splay Tree Index for Caching Database Cracking</article-title>
          .
          <source>In EDBT</source>
          , pages
          <volume>458</volume>
          {
          <fpage>461</fpage>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>S.</given-names>
            <surname>Idreos</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. L.</given-names>
            <surname>Kersten</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Manegold</surname>
          </string-name>
          .
          <article-title>Updating a cracked database</article-title>
          .
          <source>In SIGMOD</source>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>S.</given-names>
            <surname>Idreos</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. L.</given-names>
            <surname>Kersten</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Manegold</surname>
          </string-name>
          .
          <article-title>Self-organizing Tuple Reconstruction in Column-stores</article-title>
          .
          <source>SIGMOD</source>
          , pages
          <volume>297</volume>
          {
          <fpage>308</fpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>S.</given-names>
            <surname>Idreos</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. L.</given-names>
            <surname>Kersten</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Manegold</surname>
          </string-name>
          , et al.
          <article-title>Database Cracking</article-title>
          .
          <source>In CIDR</source>
          , volume
          <volume>3</volume>
          , pages
          <issue>1{8</issue>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>S.</given-names>
            <surname>Idreos</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Manegold</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Kuno</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Graefe. Merging</surname>
          </string-name>
          <article-title>What's Cracked, Cracking What's Merged: Adaptive Indexing in Main-Memory Column-Stores</article-title>
          .
          <source>VLDB</source>
          ,
          <volume>4</volume>
          (
          <issue>9</issue>
          ):
          <volume>586</volume>
          {
          <fpage>597</fpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>V.</given-names>
            <surname>Leis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Kemper</surname>
          </string-name>
          , and
          <string-name>
            <given-names>T.</given-names>
            <surname>Neumann</surname>
          </string-name>
          .
          <article-title>The adaptive radix tree: Artful indexing for main-memory databases</article-title>
          .
          <source>In ICDE</source>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>F. M.</given-names>
            <surname>Schuhknecht</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Dittrich</surname>
          </string-name>
          , and
          <string-name>
            <given-names>L.</given-names>
            <surname>Linden</surname>
          </string-name>
          .
          <article-title>Adaptive adaptive indexing</article-title>
          .
          <source>ICDE</source>
          ,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>F. M.</given-names>
            <surname>Schuhknecht</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Jindal</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Dittrich</surname>
          </string-name>
          .
          <article-title>The Uncracked Pieces in Database Cracking</article-title>
          .
          <source>Proc. VLDB Endow</source>
          .,
          <volume>7</volume>
          (
          <issue>2</issue>
          ):
          <volume>97</volume>
          {
          <fpage>108</fpage>
          ,
          <string-name>
            <surname>Oct</surname>
          </string-name>
          .
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>G.</given-names>
            <surname>Valentin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Zuliani</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. C.</given-names>
            <surname>Zilio</surname>
          </string-name>
          ,
          <string-name>
            <surname>G.</surname>
          </string-name>
          <article-title>Lohman, and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Skelley. DB2 Advisor</surname>
          </string-name>
          :
          <article-title>An Optimizer Smart Enough to Recommend Its Own Indexes</article-title>
          .
          <source>In Data Engineering</source>
          ,
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>