Chris Bizer

Andreas Schultz

Contents

  1. Intro
  2. Benchmark Dataset
  3. Benchmark Machine
  4. Benchmark Results
    1. Jena TDB
    2. Sesame (Native)
    3. Virtuoso - Triple Store
    4. D2R Server
    5. Virtuoso - RDF Views
    6. MySQL (SQL)
    7. Virtuoso (SQL)
  5. Store Comparison (Single Client)
  6. Store Comparison (Multiple Clients)
  7. Qualification
  8. Thanks


Document Version: 1.1
Publication Date: 09/17/2008


 

1. Introduction

The Berlin SPARQL Benchmark (BSBM) is a benchmark for comparing the performance of storage systems that expose SPARQL endpoints. Such systems include native RDF stores, Named Graph stores, systems that map relational databases into RDF, and SPARQL wrappers around other kinds of data sources. The benchmark is built around an e-commerce use case, where a set of products is offered by different vendors and consumers have posted reviews about products.

This document presents the results of running the Berlin SPARQL Benchmark - Version 2 against

The stores were benchmarked with datasets ranging from 250,000 triples to 100,000,000 triples.

In oder to set the SPARQL results into context we also report the results of running the SQL version of the benchmark against two relational database management systems (MySQL 5.1.26 and Virtuoso - RDBMS Version 5.0.9).

Note that this document has been superseeded by the new results document for BSBM Version 3.


 

2. Benchmark Dataset

We ran the benchmark using the Triple version and the relational version of the BSMB dataset (benchmark scenario NTR). The benchmark was run for different dataset sizes. The datasets were generated using the BSBM data generator and fulfill the characteristics described in section the BSBM specification.

Details about the benchmark datasets are summarized in the following table:

Number of Triples

250K 1M 25M 100M
Number of Products 666 2,785 70,812 284,826
Number of Producers 14 60 1422 5,618
Number of Product Features 2,860 4,745 23,833 47,884
Number of Product Types 55 151 731 2011
Number of Vendors 8 34 722 2,854
Number of Offers 13,320 55,700 1,416,240 5,696,520
Number of Reviewers 339 1432 36,249 146,054
Number of Reviews 6,660 27,850 708,120 2,848,260
Total Number of Instances
23,922
92,757
2,258,129
9,034,027
Exact Total Number of Triples 250,030 1,000,313 25,000,244 100,000,112
File Size Turtle (unzipped) 22 MB 86 MB 2.1 GB 8.5 GB

There is a RDF triple and a relational representation of the benchmark datasets. Both representations can be downloaded below:

Download Turtle Representation of the Benchmark Datasets

Download MySQL dump of the Benchmark Datasets Important: Test Driver data for all datasets:
(If you generate the datasets by yourself the Test Driver data is generated automatically in directory "td_data")

        Download Test Driver data

 


 

3. Benchmark Machine

The benchmarks were run on a machine with the following specification:

 


 

4. Benchmark Results

This section reports the results of running the BSBM benchmark against three RDF stores, two relational database to RDF wrappers and two relational database systems.

Test Procedure

The load performance of the systems was measured by loading the Turtle representation of the BSBM datasets into the triple stores and by loading the relational representation in the form of MySQL dumps into the RDBMS behind D2R Server. The loaded datasets were forward chained and contained all rdf:type statements for product types. Thus the systems under test did not have to do any inferencing.

The query performance of the systems was measured by running 128 BSBM query mixes (altogether 3200 queries) against the systems over the SPARQL protocol. The test driver and the system under test (SUT) were running on the same machine in order to reduce the influence of network latency. In order to enable the SUTs to load parts of the working set into main memory and to take advantage of query result and query execution plan caching, 32 BSBM query mixes (altogether 800 queries) were executed for warm-up before the actual times were measured.

We applied the following test procedure to each store:

  1. Load data into the store
  2. Restart store
  3. Run first single-client test run (32 mixes warm-up, 128 mixes performance measurement, randomizer seed: 101011)
  4. Run second single-client test run (32 mixes warm-up, 128 mixes performance measurement, randomizer seed: 808080)
  5. Run the three multiple-clients test runs (each run includes 32 mixes warm-up, 128 mixes performance measurement, 4 clients: randomizer seed: 863528, 8 clients: randomizer seed: 888326, 16 clients: randomizer seed: 975932)

The different runs use distinct randomizer seeds for choosing query parameters. This ensures that the test driver produces distinctly parameterized queries over all runs and makes it harder for the stores to apply query caching. Below, we report the better performance figures out of the two single-client runs.

For some test runs, we also recorded the performance of the cold, newly started SUTs. The following table gives an overview of the performance increase between the cold, newly started SUTs and the performance of the SUTs after warm up.

SUT
Dataset
Overall time for the
first warm-up query mix

Average overall time
for the measurement query mixes

Speed-up
factor
Sesame Native
25M
59.337 sec
4.860 sec
12
Virtuoso Triple Store
25M
56.242 sec
1.545 sec
36
Virtuoso RDF Views
100M
8.484 sec
1.942 sec
4
Virtuoso SQL mix
100M
11.171 sec
1.278 sec
8
MySQL SQL mix
100M
42.202 sec
0.667 sec
63

 

4.1 TDB over Joseki3


Jena TDB homepage

4.1.1 Configuration

The following changes were made to the default configuration of the software:


4.1.2 Load Time

The table below summarizes the load times Turtle files (in hh:mm:ss) :

250K 1M 25M 100M
00:00:13 00:00:41 00:16:05 01:33:48



4.1.3 Benchmark Query results: QpS (Queries per Second)

The table below summarizes the query throughput for each type of query over all 128 runs (in QpS):


250K 1M 25M 100M
Query 1 72.47 34.53 2.77 0.62
Query 2 48.06 57.47 46.09 37.41
Query 3 69.80 33.79 2.70 0.66
Query 4 36.28 17.40 1.40 0.36
Query 5 3.38 1.72 0.06 0.02
Query 6 153.25 85.15 0.32 0.08
Query 7 84.67 151.82 10.26 5.74
Query 8 143.33 139.98 11.28 9.50
Query 9 421.66 420.42 99.40 49.23
Query 10 355.41 358.71 18.63 8.60
Query 11 417.44 474.70 84.68 30.56
Query 12 284.36 290.30 71.64 41.11

 

4.1.4 Benchmark Overall results: QMpH for the 1M and 25M datasets for all runs

For the 1M and 25M datasets we ran tests with multiple clients (1, 4, 8 and 16 clients). The results are in Query Mixes per Hour (QMpH) meaning that larger numbers are better.

1
4
8
16
1M
4,114
9,566
9,479
9,651
25M
160
230
357
255

 

4.1.5 Result Summaries


4.1.6 Run Logs (detailed information)

4.2 Sesame (Native) over Tomcat


Sesame homepage

4.2.1 Configuration

Sesame was configured to use the "Native" storage schema. The performance figures for other internal storage schemata will differ from the reported figures.

The following changes were made to the default configuration of the software:

Store Type: Native
Indexes: spoc, posc, opsc
JAVA_OPTS = ... -Xmx6144m ...

 

4.2.2 Load Time

The table below summarizes the load times of theTurtle files (in dd:hh:mm:ss) :

250K 1M 25M 100M
19 03:33 12:43:22 03:06:48:45

 


4.2.3 Benchmark Query results: QpS (Queries per Second)

The table below summarizes the query throughput for each type of query over all 128 runs (in QpS):

250K 1M 25M 100M
Query 1 541.80 532.69 67.13 13.65
Query 2 198.96 195.12 90.85 35.52
Query 3 414.53 427.05 57.37 12.57
Query 4 425.53 269.64 49.03 10.21
Query 5 43.25 26.83 1.54 0.52
Query 6 49.37 12.99 0.54 0.13
Query 7 66.76 237.83 4.84 1.63
Query 8 308.24 330.65 12.82 3.76
Query 9 755.91 854.57 52.87 15.63
Query 10 382.46 379.98 6.78 2.14
Query 11 713.72 797.33 49.75 13.23
Query 12 588.37 672.37 54.20 17.86

 

4.2.4 Benchmark Overall results: QMpH for the 1M and 25M datasets for all runs

For the 1M and 25M datasets we ran tests with multiple clients (1, 4, 8 and 16 clients). The results are in Query Mixes per Hour (QMpH) meaning that larger numbers are better.

1
4
8
16
1M
19,097
24,477
22,079
21,793
25M
899
1,108
1,190
1,192

 

4.2.5 Result Summaries

4.2.6 Run Logs (detailed information)

4.3 Virtuoso Open-Source Edition v5.0.9 Snapshot (Triple Store)


Virtuoso homepage


4.3.1 Configuration

The following changes were made to the default configuration of the software:

MaxCheckpointRemap              = 1000000
NumberOfBuffers = 520000
MaxDirtyBuffers = 320000
MaxMemPoolSize = 0
StopCompilerWhenXOverRunTime = 1
None

4.3.2 Load Time

The table below summarizes the load times of theTurtle files (in hh:mm:ss) :

250K 1M 25M 100M
00:00:05 00:00:25 00:40:27 08:15:16

4.3.3 Benchmark Query results: QpS (Queries per Second)

The table below summarizes the query throughput for each type of query over all 128 runs (in QpS):


250K 1M 25M 100M
Query 1 309.54 307.94 201.91 86.54
Query 2 85.57 76.53 59.45 45.21
Query 3 250.55 243.45 195.12 83.80
Query 4 178.02 176.30 72.31 38.60
Query 5 153.27 111.19 13.07 5.64
Query 6 174.24 56.91 2.20 0.53
Query 7 122.85 115.41 18.01 2.08
Query 8 185.77 173.88 42.03 4.68
Query 9 509.84 495.50 159.52 18.83
Query 10 212.85 142.24 5.12 1.72
Query 11 415.76 414.33 31.24 27.62
Query 12 209.12 208.00 31.70 23.68

 

4.3.4 Benchmark Overall results: QMpH for the 1M and 25M datasets for all runs

For the 1M and 25M datasets we ran tests with multiple clients (1, 4, 8 and 16 clients). The results are in Query Mixes per Hour (QMpH) meaning that larger numbers are better.

 
1
4
8
16
1M
18,604
46,987
46,479
44,685
25M
2,563
5,595
6,004
4,759


4.3.5 Result Summaries


4.3.6 Run Logs (detailed information)

4.4 D2R Server 0.4


D2R Server is a relational database to RDF wrapper which rewrites SPARQL queries into SQL queries against an application-specific relational schemata based on a mapping. For the experiment, we used D2R Server together with a MySQL database into which we loaded the relational representation of the benchmark dataset.


4.4.1 Configuration

The following changes were made to the default configuration of the software:

4.4.2 Load Time

The table below summarizes the load times of the SQL-dump (in hh:mm:ss) :

250K 1M 25M 100M
00:00:02 00:00:16 00:02:09 00:10:28

 

4.4.3 Benchmark Query results: QpS (Queries per Second)

The table below summarizes the query throughput for each type of query over all 128 runs (in QpS):

250K 1M 25M 100M
Query 1 309.60 273.32 231.17 85.24
Query 2 24.35 25.58 26.87 29.96
Query 3 168.17 116.06 42.38 18.28
Query 4 192.42 179.15 142.08 68.48
Query 5 0.52 0.20 timeout timeout
Query 6 35.81 16.46 1.58 0.33
Query 7 44.77 63.22 55.80 3.90
Query 8 31.33 26.26 29.96 11.12
Query 9 73.74 67.18 77.58 62.16
Query 10 133.91 148.45 148.89 4.95
Query 11 231.12 239.10 205.61 114.21
Query 12 202.75 192.52 205.02 91.26


Query 5 over the 25M and 100M dataset was excluded from the test run after hitting our 60 second query timeout.

 

4.4.4 Benchmark Overall results: QMpH for the 1M and 25M datasets for all runs

For the 1M and 25M datasets we ran tests with multiple clients (1, 4, 8 and 16 clients). The results are in Query Mixes per Hour (QMpH) meaning that larger numbers are better.

1
4
8
16
1M
649
1,354
1,312
1,359
25M
3,262
4,706
4,702
4,719

Note: The 25M run was executed without query 5.

4.4.5 Result Summaries


4.4.6 Run Logs (detailed information)

4.5 Virtuoso Open-Source Edition v5.0.9 Snapshot (RDF Views)


Virtuoso RDF Views is a relational database to RDF wrapper which rewrites SPARQL queries into SQL queries against an application-specific relational schemata based on a mapping. Virtuoso RDF Views works together with the Virtuoso RDBMS into which we loaded the relational representation of the benchmark dataset.

Virtuoso homepage


4.5.1 Configuration

The following changes were made to the default configuration of the software:

MaxCheckpointRemap              = 1000000
NumberOfBuffers = 520000
MaxDirtyBuffers = 320000
MaxMemPoolSize = 0
StopCompilerWhenXOverRunTime = 1
No supplementary indexes.
insert into SYS_SPARQL_HOST (SH_HOST, SH_DEFINES)
        values ('%', 'define sql:describe-mode "SPO" ');

4.5.2 Load Time

The table below summarizes the load times of the SQL dump files (in hh:mm:ss) :

250K 1M 25M 100M
00:00:09 00:00:33 00:15:31 00:58:59

4.5.3Benchmark Query results: QpS (Queries per Second)

The table below summarizes the query throughput for each type of query over all 128 runs (in QpS):


250K 1M 25M 100M
Query 1 273.99 266.41 215.90 72.23
Query 2 116.04 111.45 101.86 54.34
Query 3 261.91 256.80 231.26 62.60
Query 4 166.44 165.54 139.21 49.99
Query 5 225.69 132.91 28.54 8.40
Query 6 401.24 264.18 23.53 6.04
Query 7 134.16 127.10 79.18 8.05
Query 8 199.95 190.17 124.44 8.80
Query 9 617.14 610.13 512.14 78.53
Query 10 301.81 294.78 238.37 116.84
Query 11 156.04 156.92 135.54 41.54
Query 12 220.55 223.50 208.99 78.16

 

4.5.4 Benchmark Overall results: QMpH for the 1M and 25M datasets for all runs

For the 1M and 25M datasets we ran tests with multiple clients (1, 4, 8 and 16 clients). The results are in Query Mixes per Hour (QMpH) meaning that larger numbers are better.

1
4
8
16
1M
24,826
56,431
56,339
57,425
25M
14,543
38,044
42,980
43,826


4.5.5 Result Summaries


4.5.6 Run Logs (detailed information)

4.6 MySQL 5.1.26


In oder to set the performance figures of the RDF stores into context and in order to be able to calculate the overhead that is produced by rewriting SPARQL queries into SQL queries, we also ran the SQL version of the benchmark queries against the relational representation of the benchmark dataset on MySQL. The semantics of some queries (9, 11, 12) can not be translated exactly into SQL. Although the corresponding SQL queries give similar results, they are semantically not as complex as the SPARQL queries. Thus the SQL results should just be used for general orientation.

4.6.1 Configuration

The following changes were made to the default configuration of the software:


4.6.2 Load Time

The table below summarizes the load times of the SQL dump files (in hh:mm:ss) :

250K 1M 25M 100M
00:00:02 00:00:16 00:02:09 00:10:28


4.6.3 Benchmark Query results: QpS (Queries per Second)

The table below summarizes the query throughput for each type of query over all 128 runs (in QpS):


250K 1M 25M 100M
Query 1 2738.69 2378.56 1058.55 563.28
Query 2 2768.51 3269.26 3125.51 3701.70
Query 3 2638.38 2194.83 980.28 536.34
Query 4 2425.36 2111.28 840.49 544.58
Query 5 733.45 343.71 24.77 9.25
Query 6 551.70 111.49 7.57 1.86
Query 7 1460.24 774.39 714.51 724.81
Query 8 2634.21 2712.51 582.99 414.54
Query 9 2757.45 3392.31 2750.76 2855.80
Query 10 3133.67 3378.01 2071.27 3353.90
Query 11 5144.62 5867.07 2215.38 7262.50
Query 12 4389.91 5120.33 4274.09 4998.41

 

4.6.4 Benchmark Overall results: QMpH for the 1M and 25M datasets for all runs

For the 1M and 25M datasets we ran tests with multiple clients (1, 4, 8 and 16 clients). The results are in Query Mixes per Hour (QMpH) meaning that larger numbers are better.

1
4
8
16
1M
155,823
362,323
382,366
389,798
25M
18,986
38,208
38,654
39,006

 

4.6.5 Result Summaries


4.6.6 Run Logs (detailed information)

4.7 Virtuoso Open-Source Edition v5.0.9 Snapshot (SQL)


In oder to set the performance figures of the RDF stores into context and in order to be able to calculate the overhead that is produced by rewriting SPARQL queries into SQL queries, we also ran the SQL version of the benchmark queries against the relational representation of the benchmark dataset on Virtuoso's relational engine. The semantics of some queries (9, 11, 12) can not be translated exactly into SQL. Although the corresponding SQL queries give similar results, they are semantically not as complex as the SPARQL queries. Thus the SQL results should just be used for general orientation.

Please note: According to Orri Erling from OpenLink Software the 32 query mixes warm-up are not enough to properly fill the Virtuoso cache and bring the system into steady state. Thus, the performance figures that we reprot here are not meaningful for the SQL mixes. Orri has rerun the tests on a box at OpenLink using 2000 query mixes for warm-up which changed the results dramatically. See his blog post about this. We will also change our warm-up setup when we run the benchmark again in order to make sure that all systems are in steady state.

Virtuoso homepage


4.7.1 Configuration

The following changes were made to the default configuration of the software:

MaxCheckpointRemap              = 1000000
NumberOfBuffers = 520000
MaxDirtyBuffers = 320000
MaxMemPoolSize = 0
StopCompilerWhenXOverRunTime = 1

4.7.2 Load Time

The table below summarizes the load times of the SQL dump files (in hh:mm:ss) :

250K 1M 25M 100M
00:00:09 00:00:33 00:15:31 00:58:59

4.7.3 Benchmark Query results: QpS (Queries per Second)

The table below summarizes the query throughput for each type of query over all 128 runs (in QpS):


250K 1M 25M 100M
Query 1 1071.14 1004.35 764.07 157.89
Query 2 1215.22 919.28 900.50 707.56
Query 3 1029.19 900.23 778.75 154.46
Query 4 962.56 913.64 719.98 142.73
Query 5 345.11 185.63 14.52 7.72
Query 6 2448.12 1341.07 95.81 25.05
Query 7 623.25 687.16 72.66 8.40
Query 8 1287.91 1241.05 76.28 8.85
Query 9 1730.49 1874.73 323.55 48.19
Query 10 1573.72 1519.07 1491.70 144.61
Query 11 2193.30 2198.16 2438.44 2123.33
Query 12 1978.78 1899.96 2194.64 2402.51

 

4.7.4 Benchmark Overall results: QMpH for the 1M and 25M datasets for all runs

For the 1M and 25M datasets we ran tests with multiple clients (1, 4, 8 and 16 clients). The results are in Query Mixes per Hour (QMpH) meaning that larger numbers are better.

1
4
8
16
1M
129,849
216,349
261,576
293,339
25M
19,375
38,515
49,618
49,836


4.7.5 Result Summaries


4.7.6 Run Logs (detailed information)

 


 

5. Store Comparison (Single Client)

This section compares the SPARQL query performance of the different stores and puts them into relation to the SQL query performance of MySQL and Virtuoso's relational engine. The SQL performance figures also allow to calculate the overhead that is produced by the relational database to RDF wrappers when rewriting SPARQL queries into SQL queries against the underlying RDBMS.

5.1 Overall Runtime

Running 128 query mixes against the different stores took the following overall runtimes (in seconds). The best performance figure for each dataset size is set bold in the tables. This comparison excludes MySQL (SQL mix) and MySQL (Virtuoso mix).


5.1.1 Overall Runtime: Complete Query Mix (in seconds)

The complete query mix is given here.

Jena TDB Sesame
(Native)
Virtuoso
(Triple Store)
D2R Server Virtuoso
(RDF Views)
MySQL
(SQL mix)

Virtuoso
(SQL mix)

250 K 72.331 20.501 20.861 313.763 17.405 1.601 3.034
1 M 112.014 24.129 24.768 709.537 18.561 2.957 3.549
25 M 2886.843 512.320 179.775 not applicable* 31.685 24.271 23.783
100 M 9562.878 1831.567 775.890 not applicable* 163.055 85.117 127.678

* as D2R Server timed out on query 5.

Please note concerning the SQL mix results: According to Orri Erling from OpenLink Software the 32 query mixes warm-up are not enough to properly fill the Virtuoso cache and bring the system into steady state. Thus, the performance figures that we reprot here are not meaningful for the SQL mixes. Orri has rerun the tests on a box at OpenLink using 2000 query mixes for warm-up which changed the results dramatically. See his blog post about this. We will also change our warm-up setup when we run the benchmark again in order to make sure that all systems are in steady state.


5.1.2 Overall Runtime: Reduced Query Mix (in seconds)

The reduced query mix consists of the same query sequence as the complete mix but without queries 5 and 6. The two queries were excluded as they alone consumed a large portion of the overall query execution time for bigger dataset sizes.

Jena TDB Sesame
(Native)
Virtuoso
(Triple Store)
D2R Server Virtuoso
(RDF Views)
MySQL
(SQL mix)

Virtuoso
(SQL mix)

250K
34.365
15.262
19.376
64.159
16.578
1.286
2.671
1M
36.956
10.212
21.523
62.082
17.204
1.618
2.850
25M
297.949
194.200
112.376
61.135
22.134
2.554
13.788
100M
937.893
606.073
511.071
253.522
130.790
2.956
106.052


5.1.3
Factor Table for the 25M Dataset (Complete Query Mix)

The table below compares the performance of the different stores on a one-to-one basis. The table reads as follows: The Virtuoso triple store was 2.84 times faster than Sesame (Native). Or: Running the SQL query mix against MySQL was 7.4 times faster than running the SPARQL query mix against the Virtuoso triple store.

 
Jena TDB
Sesame
(Native)
Virtuoso
(Triple Store)
Virtuoso
(RDF Views)
MySQL (SQL)
Virtuoso
(SQL mix)
Jena TDB
1
0.1775
0.0623
0.0110
0.0084
0.0082
Sesame (Native)
5.6348
1
0.3509
0.0618
0.0474
0.0464
Virtuoso (Triple Store)
16.0581
2.8498
1
0.1762
0.1350
0.1323
Virtuoso (RDF Views)
91.1107
16.1692
5.6738
1
0.7660
0.7506
MySQL (SQL)
118.9421
21.1083
7.4070
1.3055
1
0.9799
Virtuoso (SQL)
121.3826
21.5414
7.5590
1.3323
1.0205
1


5.1.4
Factor table for the 25M dataset (Reduced Query Mix)

 
TDB
Sesame
Virtuoso
(Triple Store)
D2R
Virtuoso
(RDF Views)
MySQL (SQL)
Virtuoso
(SQL mix)
Jena TDB
1
0.6518
0.3772
0.2052
0.0743
0.0086
0.0463
Sesame
1.5342
1
0.5787
0.3148
0.1140
0.0132
0.0710
Virtuoso (Triple Store)
2.6513
1.7281
1
0.5440
0.1970
0.0227
0.1227
D2R
4.8736
3.1766
1.8382
1
0.3620
0.0418
0.2255
Virtuoso (RDF Views)
13.4613
8.7740
5.0772
2.7621
1
0.1154
0.6230
MySQL (SQL)
116.6417
76.0260
43.9933
23.9332
8.6649
1
5.3979
Virtuoso (SQL)
21.6089
14.0845
8.1501
4.4338
1.6053
0.1853
1

 

5.2 Queries per Second by Query and Dataset Size

Running 128 query mixes against the different stores lead to the following query throughput for each type of query over all 128 runs (in Queries per Second). The best performance figure for each dataset size is set bold in the tables. For comparison reasons the MySQL and Virtuoso results for the SQL queries are also included in the tables but not considered when determining the best performance figure.

Query 1

250K 1M 25M 100M
Jena TDB 72.47 34.53 2.77 0.62
Sesame (Native) 541.80 532.69 67.13 13.65
Virtuoso (Triple Store) 309.54 307.94 201.91 86.54
D2R Server 309.60 273.32 231.17 85.24
Virtuoso (RDF Views) 273.99 266.41 215.90 72.23
MySQL (SQL) 2738.69 2378.56 1058.55 563.28
Virtuoso (SQL) 1071.14 1004.35 764.07 157.89

Query 2

250K 1M 25M 100M
Jena TDB 48.06 57.47 46.09 37.41
Sesame (Native) 198.96 195.12 90.85 35.52
Virtuoso (Triple Store) 85.57 76.53 59.45 45.21
D2R Server 24.35 25.58 26.87 29.96
Virtuoso (RDF Views) 116.04 111.45 101.86 54.34
MySQL (SQL) 2768.51 3269.26 3125.51 3701.70
Virtuoso (SQL) 1215.22 919.28 900.50 707.56

Query 3

250K 1M 25M 100M
Jena TDB 69.80 33.79 2.70 0.66
Sesame (Native) 414.53 427.05 57.37 12.57
Virtuoso (Triple Store) 250.55 243.45 195.12 83.80
D2R Server 168.17 116.06 42.38 18.28
Virtuoso (RDF Views) 261.91 256.80 231.26 62.60
MySQL (SQL) 2638.38 2194.83 980.28 536.34
Virtuoso (SQL) 1029.19 900.23 778.75 154.46

Query 4

250K 1M 25M 100M
Jena TDB 36.28 17.40 1.40 0.36
Sesame (Native) 425.53 269.64 49.03 10.21
Virtuoso (Triple Store) 178.02 176.30 72.31 38.60
D2R Server 192.42 179.15 142.08 68.48
Virtuoso (RDF Views) 166.44 165.54 139.21 49.99
MySQL (SQL) 2425.36 2111.28 840.49 544.58
Virtuoso (SQL) 962.56 913.64 719.98 142.73

Query 5

250K 1M 25M 100M
Jena TDB 3.38 1.72 0.06 0.02
Sesame (Native) 43.25 26.83 1.54 0.52
Virtuoso (Triple Store) 153.27 111.19 13.07 5.64
D2R Server 0.52 0.20 timeout timeout
Virtuoso (RDF Views) 225.69 132.91 28.54 8.40
MySQL (SQL) 733.45 343.71 24.77 9.25
Virtuoso (SQL) 345.11 185.63 14.52 7.72

Query 6

250K 1M 25M 100M
Jena TDB 153.25 85.15 0.32 0.08
Sesame (Native) 49.37 12.99 0.54 0.13
Virtuoso (Triple Store) 174.24 56.91 2.20 0.53
D2R Server 35.81 16.46 1.58 0.33
Virtuoso (RDF Views) 401.24 264.18 23.53 6.04
MySQL (SQL) 551.70 111.49 7.57 1.86
Virtuoso (SQL) 2448.12 1341.07 95.81 25.05

Query 7

250K 1M 25M 100M
Jena TDB 84.67 151.82 10.26 5.74
Sesame (Native) 66.76 237.83 4.84 1.63
Virtuoso (Triple Store) 122.85 115.41 18.01 2.08
D2R Server 44.77 63.22 55.80 3.90
Virtuoso (RDF Views) 134.16 127.10 79.18 8.05
MySQL (SQL) 1460.24 774.39 714.51 724.81
Virtuoso (SQL) 623.25 687.16 72.66 8.40

Query 8

250K 1M 25M 100M
Jena TDB 143.33 139.98 11.28 9.50
Sesame (Native) 308.24 330.65 12.82 3.76
Virtuoso (Triple Store) 185.77 173.88 42.03 4.68
D2R Server 31.33 26.26 29.96 11.12
Virtuoso (RDF Views) 199.95 190.17 124.44 8.80
MySQL (SQL) 2634.21 2712.51 582.99 414.54
Virtuoso (SQL) 1287.91 1241.05 76.28 8.85

Query 9

250K 1M 25M 100M
Jena TDB 421.66 420.42 99.40 49.23
Sesame (Native) 755.91 854.57 52.87 15.63
Virtuoso (Triple Store) 509.84 495.50 159.52 18.83
D2R Server 73.74 67.18 77.58 62.16
Virtuoso (RDF Views) 617.14 610.13 512.14 78.53
MySQL (SQL) 2757.45 3392.31 2750.76 2855.80
Virtuoso (SQL) 1730.49 1874.73 323.55 48.19

Query 10

250K 1M 25M 100M
Jena TDB 355.41 358.71 18.63 8.60
Sesame (Native) 382.46 379.98 6.78 2.14
Virtuoso (Triple Store) 212.85 142.24 5.12 1.72
D2R Server 133.91 148.45 148.89 4.95
Virtuoso (RDF Views) 301.81 294.78 238.37 116.84
MySQL (SQL) 3133.67 3378.01 2071.27 3353.90
Virtuoso (SQL) 1573.72 1519.07 1491.70 144.61

Query 11

250K 1M 25M 100M
Jena TDB 417.44 474.70 84.68 30.56
Sesame (Native) 713.72 797.33 49.75 13.23
Virtuoso (Triple Store) 415.76 414.33 31.24 27.62
D2R Server 231.12 239.10 205.61 114.21
Virtuoso (RDF Views) 156.04 156.92 135.54 41.54
MySQL (SQL) 5144.62 5867.07 2215.38 7262.50
Virtuoso (SQL) 2193.30 2198.16 2438.44 2123.33

Query 12

250K 1M 25M 100M
Jena TDB 284.36 290.30 71.64 41.11
Sesame (Native) 588.37 672.37 54.20 17.86
Virtuoso (Triple Store) 209.12 208.00 31.70 23.68
D2R Server 202.75 192.52 205.02 91.26
Virtuoso (RDF Views) 220.55 223.50 208.99 78.16
MySQL (SQL) 4389.91 5120.33 4274.09 4998.41
Virtuoso (SQL) 1978.78 1899.96 2194.64 2402.51

 

5.3 Queries per Second by Dataset Size and Query

Running 128 query mixes against the different stores lead to the following query throughput for each type of query over all 128 runs (in Queries per Second). The best performance figure for each query is set bold in the tables. For comparison reasons the MySQL and Virtuoso results for the SQL queries are also included in the tables but not considered when determining the best performance figure.

250K Triple Dataset

TDB Sesame Virtuoso D2R Virtuoso (RDF Views) MySQL (SQL) Virtuoso (SQL)
Query 1 72.47 541.80 309.54 309.60 273.99 2738.69 1071.14
Query 2 48.06 198.96 85.57 24.35 116.04 2768.51 1215.22
Query 3 69.80 414.53 250.55 168.17 261.91 2638.38 1029.19
Query 4 36.28 425.53 178.02 192.42 166.44 2425.36 962.56
Query 5 3.38 43.25 153.27 0.52 225.69 733.45 345.11
Query 6 153.25 49.37 174.24 35.81 401.24 551.70 2448.12
Query 7 84.67 66.76 122.85 44.77 134.16 1460.24 623.25
Query 8 143.33 308.24 185.77 31.33 199.95 2634.21 1287.91
Query 9 421.66 755.91 509.84 73.74 617.14 2757.45 1730.49
Query 10 355.41 382.46 212.85 133.91 301.81 3133.67 1573.72
Query 11 417.44 713.72 415.76 231.12 156.04 5144.62 2193.30
Query 12 284.36 588.37 209.12 202.75 220.55 4389.91 1978.78

1M Triple Dataset

TDB Sesame Virtuoso D2R Virtuoso (RDF Views) MySQL (SQL) Virtuoso (SQL)
Query 1 34.53 532.69 307.94 273.32 266.41 2378.56 1004.35
Query 2 57.47 195.12 76.53 25.58 111.45 3269.26 919.28
Query 3 33.79 427.05 243.45 116.06 256.80 2194.83 900.23
Query 4 17.40 269.64 176.30 179.15 165.54 2111.28 913.64
Query 5 1.72 26.83 111.19 0.20 132.91 343.71 185.63
Query 6 85.15 12.99 56.91 16.46 264.18 111.49 1341.07
Query 7 151.82 237.83 115.41 63.22 127.10 774.39 687.16
Query 8 139.98 330.65 173.88 26.26 190.17 2712.51 1241.05
Query 9 420.42 854.57 495.50 67.18 610.13 3392.31 1874.73
Query 10 358.71 379.98 142.24 148.45 294.78 3378.01 1519.07
Query 11 474.70 797.33 414.33 239.10 156.92 5867.07 2198.16
Query 12 290.30 672.37 208.00 192.52 223.50 5120.33 1899.96

25M Triple Dataset

TDB Sesame Virtuoso D2R Virtuoso (RDF Views) MySQL (SQL) Virtuoso (SQL)
Query 1 2.77 67.13 201.91 231.17 215.90 1058.55 764.07
Query 2 46.09 90.85 59.45 26.87 101.86 3125.51 900.50
Query 3 2.70 57.37 195.12 42.38 231.26 980.28 778.75
Query 4 1.40 49.03 72.31 142.08 139.21 840.49 719.98
Query 5 0.06 1.54 13.07 timeout 28.54 24.77 14.52
Query 6 0.32 0.54 2.20 1.58 23.53 7.57 95.81
Query 7 10.26 4.84 18.01 55.80 79.18 714.51 72.66
Query 8 11.28 12.82 42.03 29.96 124.44 582.99 76.28
Query 9 99.40 52.87 159.52 77.58 512.14 2750.76 323.55
Query 10 18.63 6.78 5.12 148.89 238.37 2071.27 1491.70
Query 11 84.68 49.75 31.24 205.61 135.54 2215.38 2438.44
Query 12 71.64 54.20 31.70 205.02 208.99 4274.09 2194.64

100M Triple Dataset

TDB Sesame Virtuoso D2R Virtuoso (RDF Views) MySQL (SQL) Virtuoso (SQL)
Query 1 0.62 13.65 86.54 85.24 72.23 563.28 157.89
Query 2 37.41 35.52 45.21 29.96 54.34 3701.70 707.56
Query 3 0.66 12.57 83.80 18.28 62.60 536.34 154.46
Query 4 0.36 10.21 38.60 68.48 49.99 544.58 142.73
Query 5 0.02 0.52 5.64 timeout 8.40 9.25 7.72
Query 6 0.08 0.13 0.53 0.33 6.04 1.86 25.05
Query 7 5.74 1.63 2.08 3.90 8.05 724.81 8.40
Query 8 9.50 3.76 4.68 11.12 8.80 414.54 8.85
Query 9 49.23 15.63 18.83 62.16 78.53 2855.80 48.19
Query 10 8.60 2.14 1.72 4.95 116.84 3353.90 144.61
Query 11 30.56 13.23 27.62 114.21 41.54 7262.50 2123.33
Query 12 41.11 17.86 23.68 91.26 78.16 4998.41 2402.51

 


 

6. Store Comparison (Multiple Clients)


In real-world situations there are usually multiple clients working against a SPARQL endpoint. Thus we have also benchmarked how the SUTs reacted to multiple clients simultaneously executing query mixes against the SUTs.

The numbers are the query mixes per hour (QMpH) that were executed by all clients together. Meaning that bigger numbers are better.
For comparison reasons, the MySQL results for the SQL queries are also included in the tables. Note that the query mixes per hour values were extrapolated from the time it took all clients together to execute 128 query mixes (see test procedure).

Dataset Size 1M   Number of clients  
 
1
4
8
16
Jena TDB
4,114
9,566
9,479
9,651
Sesame (Native)
19,097
24,477
22,079
21,793
Virtuoso (Triple Store)
18,604
46,987
46,479
44,685
D2R Server
649
1,354
1,312
1,359
Virtuoso (RDF Views)
24,826
56,431
56,339
57,425
MySQL (SQL)
155,823
362,323
382,366
389,798
Virtuoso (SQL)
129,849
216,349
261,576
293,339

 

 

Dataset Size 25M   Number of clients  
 
1
4
8
16
TDB
160
230
357
255
Sesame
899
1,108
1,190
1,192
Virtuoso (Triple Store)
2,563
5,595
6,004
4,759
D2R
3,262 *
4,706 *
4,702 *
4,719 *
Virtuoso (RDF Views)
14,543
38,044
42,980
43,826
MySQL (SQL)
18,986
38,208
38,654
39,006
Virtuoso (SQL)
19,375
38,515
49,618
49,836

 

* without query 5

 


 

7. Qualification

A precondition for comparing the performance of different storage systems, is to verify that all systems work correctly and return the exprected query results.

Thus before we measured the performance of the SUTs, we verified that the SUTs return correct results for the benchmark queries using the BSBM qualification dataset and qualtification tool. For more information about the qualification test please refer to the qualification chapter of the BSBM specification.

7.1 Results

We ran qualification tests for following stores: Sesame, TDB, Virtuoso Triple Store and D2R.

7.1 Detailed logs

D2R:
TDB:
Sesame:
Virtuoso:

 

8. Thanks

Lots of thanks to

Please send comments and feedback about the benchmark to Chris Bizer and Andreas Schultz and to the relevant mailing lists.