Merge 'perf/ci: add basic tpc-h benchmark' from Jussi Saurio

Doesn't seem to work in CI yet properly (probably `time` utility output
is different on linux), but here's an example local run output on mac.
Notice we panic in `btree.rs` in one of the queries:
```bash
Using existing TPC-H.db file
Running TPC-H benchmark...
Starting TPC-H query timing comparison...
The script might ask you to enter the password for sudo, in order to clear system caches.
Running 1.sql with Limbo...
Running 1.sql with SQLite3...
Limbo real time: 2.21
SQLite3 real time: 1.96
Limbo output:

SQLite3 output:

No output difference
-----------------------------------------------------------
Skipping 2.sql, reason: subquery in where not supported
-----------------------------------------------------------
Running 3.sql with Limbo...
Running 3.sql with SQLite3...
Limbo real time: 4.08
SQLite3 real time: 2.95
Limbo output:

SQLite3 output:

No output difference
-----------------------------------------------------------
Skipping 4.sql, reason: subquery in where not supported
-----------------------------------------------------------
Running 5.sql with Limbo...
Running 5.sql with SQLite3...
Limbo real time: 4.37
SQLite3 real time: 2.89
Limbo output:

SQLite3 output:

No output difference
-----------------------------------------------------------
Running 6.sql with Limbo...
Running 6.sql with SQLite3...
Limbo real time: 2.35
SQLite3 real time: 1.95
Limbo output:

SQLite3 output:

No output difference
-----------------------------------------------------------
Running 7.sql with Limbo...
Running 7.sql with SQLite3...
Limbo real time: 2.36
SQLite3 real time: 2.08
Limbo output:

SQLite3 output:

No output difference
-----------------------------------------------------------
Running 8.sql with Limbo...
Running 8.sql with SQLite3...
Limbo real time: 12.10
SQLite3 real time: 8.04
Limbo output:

SQLite3 output:

No output difference
-----------------------------------------------------------
Running 9.sql with Limbo...
Running 9.sql with SQLite3...
Limbo real time: 29.34
SQLite3 real time: 10.86
Limbo output:
ALGERIA|1998|29295233.7707
ALGERIA|1997|52762473.1280001
ALGERIA|1996|53328474.5168001
ALGERIA|1995|51214356.9348
ALGERIA|1994|52169009.5454001
ALGERIA|1993|51333122.8883999
ALGERIA|1992|53203252.4182999
ARGENTINA|1998|29384458.7504
ARGENTINA|1997|45981195.6821
ARGENTINA|1996|48997927.7816
ARGENTINA|1995|49082188.7182
ARGENTINA|1994|47490431.4357
ARGENTINA|1993|49591543.2561
ARGENTINA|1992|47079630.0749
BRAZIL|1998|29522875.2849
BRAZIL|1997|49830726.1137001
BRAZIL|1996|49660010.6812
BRAZIL|1995|48661796.5732001
BRAZIL|1994|48005015.4903
BRAZIL|1993|50642897.2944999
BRAZIL|1992|49796165.2673
CANADA|1998|30827887.8847
CANADA|1997|48200922.4406001
CANADA|1996|49554205.1958
CANADA|1995|52247758.0634
CANADA|1994|50398007.9934001
CANADA|1993|49295434.7577
CANADA|1992|50755100.1311
CHINA|1998|26232779.0758
CHINA|1997|46180740.9342
CHINA|1996|49535189.5637999
CHINA|1995|45696326.4191
CHINA|1994|45699007.4057
CHINA|1993|44820179.7542999
CHINA|1992|44853598.8
EGYPT|1998|28802425.5049
EGYPT|1997|50669980.5204
EGYPT|1996|49409929.5778
EGYPT|1995|51266322.0907999
EGYPT|1994|49610689.962
EGYPT|1993|50945963.7431999
EGYPT|1992|51820711.9291
ETHIOPIA|1998|26507500.3726
ETHIOPIA|1997|44417449.7821001
ETHIOPIA|1996|44396024.8895
ETHIOPIA|1995|45573214.4916
ETHIOPIA|1994|45069220.5918999
ETHIOPIA|1993|45526099.1928999
ETHIOPIA|1992|44415214.7402
FRANCE|1998|27094664.6850001
FRANCE|1997|47521933.8432999
FRANCE|1996|46879568.39
FRANCE|1995|47457222.4867
FRANCE|1994|46096705.433
FRANCE|1993|45962990.9133
FRANCE|1992|43440538.875
GERMANY|1998|26805454.2551
GERMANY|1997|45707724.7992001
GERMANY|1996|45193561.3894001
GERMANY|1995|44010364.8541
GERMANY|1994|46537140.2347001
GERMANY|1993|47120186.1391
GERMANY|1992|47792976.5344
INDIA|1998|29171438.7556
INDIA|1997|49447171.43
INDIA|1996|48314107.4742
INDIA|1995|48157640.2670999
INDIA|1994|47510322.1694
INDIA|1993|50121088.1220001
INDIA|1992|48429696.926
INDONESIA|1998|28049078.872
INDONESIA|1997|47156405.6367
INDONESIA|1996|43832977.6843001
INDONESIA|1995|47383429.9181
INDONESIA|1994|47310891.6826001
INDONESIA|1993|46222112.2464
INDONESIA|1992|46149893.8672
IRAN|1998|26417181.0269999
IRAN|1997|44502840.2268
IRAN|1996|46959453.7866
IRAN|1995|45002812.1692999
IRAN|1994|45433091.641
IRAN|1993|44172584.8788
IRAN|1992|46657917.9228001
IRAQ|1998|32136725.1368001
IRAQ|1997|53988245.1021001
IRAQ|1996|52484885.6999
IRAQ|1995|50826802.1894
IRAQ|1994|53626739.7554
IRAQ|1993|51327489.4222999
IRAQ|1992|53426847.4636
JAPAN|1998|25437238.7276
JAPAN|1997|44207490.0138999
JAPAN|1996|46682874.9343
JAPAN|1995|45283181.6082
JAPAN|1994|45426265.8305
JAPAN|1993|44621631.1586001
JAPAN|1992|45985318.7576999
JORDAN|1998|23772738.5645
JORDAN|1997|43512430.6899999
JORDAN|1996|44074184.9532999
JORDAN|1995|44879506.6709999
JORDAN|1994|42583604.8272
JORDAN|1993|43264733.7961
JORDAN|1992|44983643.7616
KENYA|1998|27596885.9388
KENYA|1997|43800422.8362999
KENYA|1996|45304179.5469
KENYA|1995|45710986.3243999
KENYA|1994|45545675.3259001
KENYA|1993|43921106.8724
KENYA|1992|47458265.2438001
MOROCCO|1998|25236567.0029
MOROCCO|1997|42658811.0476002
MOROCCO|1996|43329016.5985
MOROCCO|1995|44592882.7362999
MOROCCO|1994|42161453.2719
MOROCCO|1993|44899634.791
MOROCCO|1992|43769529.8111
MOZAMBIQUE|1998|27775252.4025
MOZAMBIQUE|1997|49532331.8161999
MOZAMBIQUE|1996|47312132.3954
MOZAMBIQUE|1995|48505778.1883001
MOZAMBIQUE|1994|47280918.1024001
MOZAMBIQUE|1993|46763612.6601001
MOZAMBIQUE|1992|48404237.7845
PERU|1998|31081623.8101
PERU|1997|51536280.2962
PERU|1996|50970091.6021
PERU|1995|52743689.8273001
PERU|1994|49410457.3558
PERU|1993|53695789.9142
PERU|1992|51357085.5809
ROMANIA|1998|25833567.3851
ROMANIA|1997|47308870.4744001
ROMANIA|1996|49278980.0867
ROMANIA|1995|46424352.8088001
ROMANIA|1994|47193732.0789001
ROMANIA|1993|45462367.0855
ROMANIA|1992|46118290.2659999
RUSSIA|1998|27153133.384
RUSSIA|1997|47950148.5437
RUSSIA|1996|49155236.6337
RUSSIA|1995|47417353.3309
RUSSIA|1994|47547047.0333001
RUSSIA|1993|47568120.3475
RUSSIA|1992|45138673.4933001
SAUDI ARABIA|1998|26552308.9274001
SAUDI ARABIA|1997|47935070.9259001
SAUDI ARABIA|1996|48493831.1925001
SAUDI ARABIA|1995|44926913.9565
SAUDI ARABIA|1994|45759107.7221999
SAUDI ARABIA|1993|45849219.1862
SAUDI ARABIA|1992|47456695.9113998
UNITED KINGDOM|1998|25377312.4879
UNITED KINGDOM|1997|46960767.7209999
UNITED KINGDOM|1996|45076159.6326
UNITED KINGDOM|1995|46592948.4497
UNITED KINGDOM|1994|45650295.2464001
UNITED KINGDOM|1993|44963874.6307001
UNITED KINGDOM|1992|46318296.6940999
UNITED STATES|1998|26004416.0988
UNITED STATES|1997|48191685.5994999
UNITED STATES|1996|45327281.0055001
UNITED STATES|1995|46824650.2317
UNITED STATES|1994|46990075.4818999
UNITED STATES|1993|47777150.1640001
UNITED STATES|1992|45725428.7094999
VIETNAM|1998|26143707.6779
VIETNAM|1997|47682484.7703999
VIETNAM|1996|48394548.176
VIETNAM|1995|49341297.159
VIETNAM|1994|47801518.8178
VIETNAM|1993|48531159.0752
VIETNAM|1992|46569476.7732999
SQLite3 output:
ALGERIA|1998|29295233.7707
ALGERIA|1997|52762473.128
ALGERIA|1996|53328474.5168
ALGERIA|1995|51214356.9348
ALGERIA|1994|52169009.5454
ALGERIA|1993|51333122.8884
ALGERIA|1992|53203252.4183
ARGENTINA|1998|29384458.7504
ARGENTINA|1997|45981195.6821
ARGENTINA|1996|48997927.7816
ARGENTINA|1995|49082188.7182
ARGENTINA|1994|47490431.4357
ARGENTINA|1993|49591543.2561
ARGENTINA|1992|47079630.0749
BRAZIL|1998|29522875.2849
BRAZIL|1997|49830726.1137
BRAZIL|1996|49660010.6812
BRAZIL|1995|48661796.5732
BRAZIL|1994|48005015.4903
BRAZIL|1993|50642897.2945
BRAZIL|1992|49796165.2673
CANADA|1998|30827887.8847
CANADA|1997|48200922.4406
CANADA|1996|49554205.1958
CANADA|1995|52247758.0634
CANADA|1994|50398007.9934
CANADA|1993|49295434.7577
CANADA|1992|50755100.1311
CHINA|1998|26232779.0758
CHINA|1997|46180740.9342
CHINA|1996|49535189.5638
CHINA|1995|45696326.4191
CHINA|1994|45699007.4057
CHINA|1993|44820179.7543
CHINA|1992|44853598.8
EGYPT|1998|28802425.5049
EGYPT|1997|50669980.5204
EGYPT|1996|49409929.5778
EGYPT|1995|51266322.0908
EGYPT|1994|49610689.962
EGYPT|1993|50945963.7432
EGYPT|1992|51820711.9291
ETHIOPIA|1998|26507500.3726
ETHIOPIA|1997|44417449.7821
ETHIOPIA|1996|44396024.8895
ETHIOPIA|1995|45573214.4916
ETHIOPIA|1994|45069220.5919
ETHIOPIA|1993|45526099.1929
ETHIOPIA|1992|44415214.7402
FRANCE|1998|27094664.685
FRANCE|1997|47521933.8433
FRANCE|1996|46879568.39
FRANCE|1995|47457222.4867
FRANCE|1994|46096705.433
FRANCE|1993|45962990.9133
FRANCE|1992|43440538.875
GERMANY|1998|26805454.2551
GERMANY|1997|45707724.7992
GERMANY|1996|45193561.3894
GERMANY|1995|44010364.8541
GERMANY|1994|46537140.2347
GERMANY|1993|47120186.1391
GERMANY|1992|47792976.5344
INDIA|1998|29171438.7556
INDIA|1997|49447171.43
INDIA|1996|48314107.4742
INDIA|1995|48157640.2671
INDIA|1994|47510322.1694
INDIA|1993|50121088.122
INDIA|1992|48429696.926
INDONESIA|1998|28049078.872
INDONESIA|1997|47156405.6367
INDONESIA|1996|43832977.6843
INDONESIA|1995|47383429.9181
INDONESIA|1994|47310891.6826
INDONESIA|1993|46222112.2464
INDONESIA|1992|46149893.8672
IRAN|1998|26417181.027
IRAN|1997|44502840.2268
IRAN|1996|46959453.7866
IRAN|1995|45002812.1693
IRAN|1994|45433091.641
IRAN|1993|44172584.8788
IRAN|1992|46657917.9228
IRAQ|1998|32136725.1368
IRAQ|1997|53988245.1021
IRAQ|1996|52484885.6999
IRAQ|1995|50826802.1894
IRAQ|1994|53626739.7554
IRAQ|1993|51327489.4223
IRAQ|1992|53426847.4636
JAPAN|1998|25437238.7276
JAPAN|1997|44207490.0139
JAPAN|1996|46682874.9343
JAPAN|1995|45283181.6082
JAPAN|1994|45426265.8305
JAPAN|1993|44621631.1586
JAPAN|1992|45985318.7577
JORDAN|1998|23772738.5645
JORDAN|1997|43512430.69
JORDAN|1996|44074184.9533
JORDAN|1995|44879506.671
JORDAN|1994|42583604.8272
JORDAN|1993|43264733.7961
JORDAN|1992|44983643.7616
KENYA|1998|27596885.9388
KENYA|1997|43800422.8363
KENYA|1996|45304179.5469
KENYA|1995|45710986.3244
KENYA|1994|45545675.3259
KENYA|1993|43921106.8724
KENYA|1992|47458265.2438
MOROCCO|1998|25236567.0029
MOROCCO|1997|42658811.0476
MOROCCO|1996|43329016.5985
MOROCCO|1995|44592882.7363
MOROCCO|1994|42161453.2719
MOROCCO|1993|44899634.791
MOROCCO|1992|43769529.8111
MOZAMBIQUE|1998|27775252.4025
MOZAMBIQUE|1997|49532331.8162
MOZAMBIQUE|1996|47312132.3954
MOZAMBIQUE|1995|48505778.1883
MOZAMBIQUE|1994|47280918.1024
MOZAMBIQUE|1993|46763612.6601
MOZAMBIQUE|1992|48404237.7845
PERU|1998|31081623.8101
PERU|1997|51536280.2962
PERU|1996|50970091.6021
PERU|1995|52743689.8273
PERU|1994|49410457.3558
PERU|1993|53695789.9142
PERU|1992|51357085.5809
ROMANIA|1998|25833567.3851
ROMANIA|1997|47308870.4744
ROMANIA|1996|49278980.0867
ROMANIA|1995|46424352.8088
ROMANIA|1994|47193732.0789
ROMANIA|1993|45462367.0855
ROMANIA|1992|46118290.266
RUSSIA|1998|27153133.384
RUSSIA|1997|47950148.5437
RUSSIA|1996|49155236.6337
RUSSIA|1995|47417353.3309
RUSSIA|1994|47547047.0333
RUSSIA|1993|47568120.3475
RUSSIA|1992|45138673.4933
SAUDI ARABIA|1998|26552308.9274
SAUDI ARABIA|1997|47935070.9259
SAUDI ARABIA|1996|48493831.1925
SAUDI ARABIA|1995|44926913.9565
SAUDI ARABIA|1994|45759107.7222
SAUDI ARABIA|1993|45849219.1862
SAUDI ARABIA|1992|47456695.9114
UNITED KINGDOM|1998|25377312.4879
UNITED KINGDOM|1997|46960767.721
UNITED KINGDOM|1996|45076159.6326
UNITED KINGDOM|1995|46592948.4497
UNITED KINGDOM|1994|45650295.2464
UNITED KINGDOM|1993|44963874.6307
UNITED KINGDOM|1992|46318296.6941
UNITED STATES|1998|26004416.0988
UNITED STATES|1997|48191685.5995
UNITED STATES|1996|45327281.0055
UNITED STATES|1995|46824650.2317
UNITED STATES|1994|46990075.4819
UNITED STATES|1993|47777150.164
UNITED STATES|1992|45725428.7095
VIETNAM|1998|26143707.6779
VIETNAM|1997|47682484.7704
VIETNAM|1996|48394548.176
VIETNAM|1995|49341297.159
VIETNAM|1994|47801518.8178
VIETNAM|1993|48531159.0752
VIETNAM|1992|46569476.7733
Output difference:
2,3c2,3
< ALGERIA|1997|52762473.1280001
< ALGERIA|1996|53328474.5168001
---
> ALGERIA|1997|52762473.128
> ALGERIA|1996|53328474.5168
5,7c5,7
< ALGERIA|1994|52169009.5454001
< ALGERIA|1993|51333122.8883999
< ALGERIA|1992|53203252.4182999
---
> ALGERIA|1994|52169009.5454
> ALGERIA|1993|51333122.8884
> ALGERIA|1992|53203252.4183
16c16
< BRAZIL|1997|49830726.1137001
---
> BRAZIL|1997|49830726.1137
18c18
< BRAZIL|1995|48661796.5732001
---
> BRAZIL|1995|48661796.5732
20c20
< BRAZIL|1993|50642897.2944999
---
> BRAZIL|1993|50642897.2945
23c23
< CANADA|1997|48200922.4406001
---
> CANADA|1997|48200922.4406
26c26
< CANADA|1994|50398007.9934001
---
> CANADA|1994|50398007.9934
31c31
< CHINA|1996|49535189.5637999
---
> CHINA|1996|49535189.5638
34c34
< CHINA|1993|44820179.7542999
---
> CHINA|1993|44820179.7543
39c39
< EGYPT|1995|51266322.0907999
---
> EGYPT|1995|51266322.0908
41c41
< EGYPT|1993|50945963.7431999
---
> EGYPT|1993|50945963.7432
44c44
< ETHIOPIA|1997|44417449.7821001
---
> ETHIOPIA|1997|44417449.7821
47,48c47,48
< ETHIOPIA|1994|45069220.5918999
< ETHIOPIA|1993|45526099.1928999
---
> ETHIOPIA|1994|45069220.5919
> ETHIOPIA|1993|45526099.1929
50,51c50,51
< FRANCE|1998|27094664.6850001
< FRANCE|1997|47521933.8432999
---
> FRANCE|1998|27094664.685
> FRANCE|1997|47521933.8433
58,59c58,59
< GERMANY|1997|45707724.7992001
< GERMANY|1996|45193561.3894001
---
> GERMANY|1997|45707724.7992
> GERMANY|1996|45193561.3894
61c61
< GERMANY|1994|46537140.2347001
---
> GERMANY|1994|46537140.2347
67c67
< INDIA|1995|48157640.2670999
---
> INDIA|1995|48157640.2671
69c69
< INDIA|1993|50121088.1220001
---
> INDIA|1993|50121088.122
73c73
< INDONESIA|1996|43832977.6843001
---
> INDONESIA|1996|43832977.6843
75c75
< INDONESIA|1994|47310891.6826001
---
> INDONESIA|1994|47310891.6826
78c78
< IRAN|1998|26417181.0269999
---
> IRAN|1998|26417181.027
81c81
< IRAN|1995|45002812.1692999
---
> IRAN|1995|45002812.1693
84,86c84,86
< IRAN|1992|46657917.9228001
< IRAQ|1998|32136725.1368001
< IRAQ|1997|53988245.1021001
---
> IRAN|1992|46657917.9228
> IRAQ|1998|32136725.1368
> IRAQ|1997|53988245.1021
90c90
< IRAQ|1993|51327489.4222999
---
> IRAQ|1993|51327489.4223
93c93
< JAPAN|1997|44207490.0138999
---
> JAPAN|1997|44207490.0139
97,98c97,98
< JAPAN|1993|44621631.1586001
< JAPAN|1992|45985318.7576999
---
> JAPAN|1993|44621631.1586
> JAPAN|1992|45985318.7577
100,102c100,102
< JORDAN|1997|43512430.6899999
< JORDAN|1996|44074184.9532999
< JORDAN|1995|44879506.6709999
---
> JORDAN|1997|43512430.69
> JORDAN|1996|44074184.9533
> JORDAN|1995|44879506.671
107c107
< KENYA|1997|43800422.8362999
---
> KENYA|1997|43800422.8363
109,110c109,110
< KENYA|1995|45710986.3243999
< KENYA|1994|45545675.3259001
---
> KENYA|1995|45710986.3244
> KENYA|1994|45545675.3259
112c112
< KENYA|1992|47458265.2438001
---
> KENYA|1992|47458265.2438
114c114
< MOROCCO|1997|42658811.0476002
---
> MOROCCO|1997|42658811.0476
116c116
< MOROCCO|1995|44592882.7362999
---
> MOROCCO|1995|44592882.7363
121c121
< MOZAMBIQUE|1997|49532331.8161999
---
> MOZAMBIQUE|1997|49532331.8162
123,125c123,125
< MOZAMBIQUE|1995|48505778.1883001
< MOZAMBIQUE|1994|47280918.1024001
< MOZAMBIQUE|1993|46763612.6601001
---
> MOZAMBIQUE|1995|48505778.1883
> MOZAMBIQUE|1994|47280918.1024
> MOZAMBIQUE|1993|46763612.6601
130c130
< PERU|1995|52743689.8273001
---
> PERU|1995|52743689.8273
135c135
< ROMANIA|1997|47308870.4744001
---
> ROMANIA|1997|47308870.4744
137,138c137,138
< ROMANIA|1995|46424352.8088001
< ROMANIA|1994|47193732.0789001
---
> ROMANIA|1995|46424352.8088
> ROMANIA|1994|47193732.0789
140c140
< ROMANIA|1992|46118290.2659999
---
> ROMANIA|1992|46118290.266
145c145
< RUSSIA|1994|47547047.0333001
---
> RUSSIA|1994|47547047.0333
147,150c147,150
< RUSSIA|1992|45138673.4933001
< SAUDI ARABIA|1998|26552308.9274001
< SAUDI ARABIA|1997|47935070.9259001
< SAUDI ARABIA|1996|48493831.1925001
---
> RUSSIA|1992|45138673.4933
> SAUDI ARABIA|1998|26552308.9274
> SAUDI ARABIA|1997|47935070.9259
> SAUDI ARABIA|1996|48493831.1925
152c152
< SAUDI ARABIA|1994|45759107.7221999
---
> SAUDI ARABIA|1994|45759107.7222
154c154
< SAUDI ARABIA|1992|47456695.9113998
---
> SAUDI ARABIA|1992|47456695.9114
156c156
< UNITED KINGDOM|1997|46960767.7209999
---
> UNITED KINGDOM|1997|46960767.721
159,161c159,161
< UNITED KINGDOM|1994|45650295.2464001
< UNITED KINGDOM|1993|44963874.6307001
< UNITED KINGDOM|1992|46318296.6940999
---
> UNITED KINGDOM|1994|45650295.2464
> UNITED KINGDOM|1993|44963874.6307
> UNITED KINGDOM|1992|46318296.6941
163,164c163,164
< UNITED STATES|1997|48191685.5994999
< UNITED STATES|1996|45327281.0055001
---
> UNITED STATES|1997|48191685.5995
> UNITED STATES|1996|45327281.0055
166,168c166,168
< UNITED STATES|1994|46990075.4818999
< UNITED STATES|1993|47777150.1640001
< UNITED STATES|1992|45725428.7094999
---
> UNITED STATES|1994|46990075.4819
> UNITED STATES|1993|47777150.164
> UNITED STATES|1992|45725428.7095
170c170
< VIETNAM|1997|47682484.7703999
---
> VIETNAM|1997|47682484.7704
175c175
< VIETNAM|1992|46569476.7732999
---
> VIETNAM|1992|46569476.7733
-----------------------------------------------------------
Running 10.sql with Limbo...
Running 10.sql with SQLite3...
Limbo real time: 3.48
SQLite3 real time: 2.85
Limbo output:

SQLite3 output:

No output difference
-----------------------------------------------------------
Skipping 11.sql, reason: subquery in where not supported
-----------------------------------------------------------
Running 12.sql with Limbo...
Running 12.sql with SQLite3...
Limbo real time: 2.54
SQLite3 real time: 1.99
Limbo output:

SQLite3 output:

No output difference
-----------------------------------------------------------
Running 13.sql with Limbo...
Running 13.sql with SQLite3...
Limbo real time: 3.64
SQLite3 real time: 4.07
Limbo output:

thread 'main' panicked at core/storage/btree.rs:5124:13:
slice index starts at 128 but ends at 126
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
time: command terminated abnormally
SQLite3 output:
0|50004
9|6642
10|6578
11|6010
8|5916
12|5598
13|5009
19|4704
7|4677
17|4604
20|4581
18|4523
14|4470
15|4449
16|4339
21|4173
22|3717
6|3295
23|3196
24|2647
25|2120
5|1962
26|1632
27|1196
4|985
28|873
29|595
3|412
30|370
31|233
32|146
2|133
33|83
34|43
35|28
36|20
1|19
37|6
38|4
40|3
39|3
41|2
Output difference:
1,5c1,42
<
< thread 'main' panicked at core/storage/btree.rs:5124:13:
< slice index starts at 128 but ends at 126
< note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
< time: command terminated abnormally
---
> 0|50004
> 9|6642
> 10|6578
> 11|6010
> 8|5916
> 12|5598
> 13|5009
> 19|4704
> 7|4677
> 17|4604
> 20|4581
> 18|4523
> 14|4470
> 15|4449
> 16|4339
> 21|4173
> 22|3717
> 6|3295
> 23|3196
> 24|2647
> 25|2120
> 5|1962
> 26|1632
> 27|1196
> 4|985
> 28|873
> 29|595
> 3|412
> 30|370
> 31|233
> 32|146
> 2|133
> 33|83
> 34|43
> 35|28
> 36|20
> 1|19
> 37|6
> 38|4
> 40|3
> 39|3
> 41|2
-----------------------------------------------------------
Running 14.sql with Limbo...
Running 14.sql with SQLite3...
Limbo real time: 2.21
SQLite3 real time: 1.89
Limbo output:

SQLite3 output:

No output difference
-----------------------------------------------------------
Skipping 15.sql, reason: views not supported
-----------------------------------------------------------
Skipping 16.sql, reason: subquery in where not supported
-----------------------------------------------------------
Skipping 17.sql, reason: subquery in where not supported
-----------------------------------------------------------
Skipping 18.sql, reason: subquery in where not supported
-----------------------------------------------------------
Skipping 19.sql, reason: bad-query-plan-takes-forever
-----------------------------------------------------------
Skipping 20.sql, reason: subquery in where not supported
-----------------------------------------------------------
Skipping 21.sql, reason: subquery in where not supported
-----------------------------------------------------------
Skipping 22.sql, reason: subquery in where not supported
-----------------------------------------------------------
-----------------------------------------------------------
TPC-H query timing comparison completed.
```

Closes #1492
This commit is contained in:
Pekka Enberg
2025-05-16 13:30:22 +03:00
25 changed files with 810 additions and 0 deletions

View File

@@ -126,3 +126,9 @@ jobs:
external-data-json-path: null
gh-repository: null
tpc-h:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: TPC-H
run: ./perf/tpc-h/benchmark.sh

39
perf/tpc-h/benchmark.sh Executable file
View File

@@ -0,0 +1,39 @@
#!/bin/bash
# TPC-H benchmark script
REPO_ROOT=$(git rev-parse --show-toplevel)
RELEASE_BUILD_DIR="$REPO_ROOT/target/release"
TPCH_DIR="$REPO_ROOT/perf/tpc-h"
DB_FILE="$TPCH_DIR/TPC-H.db"
# If sqlite3 doesn't exist, bail
if ! command -v sqlite3 >/dev/null 2>&1; then
echo "Error: sqlite3 is not installed"
exit 1
fi
# Build Limbo in release mode if it's not already built
if [ ! -f "$RELEASE_BUILD_DIR/limbo" ]; then
echo "Building Limbo..."
cargo build --bin limbo --release
fi
# Download the TPC-H database if it doesn't exist
DB_URL="https://github.com/lovasoa/TPCH-sqlite/releases/download/v1.0/TPC-H.db"
if [ ! -f "$DB_FILE" ]; then
echo "Downloading TPC-H database..."
if command -v wget >/dev/null 2>&1; then
wget -O "$DB_FILE" --no-verbose "$DB_URL"
elif command -v curl >/dev/null 2>&1; then
curl -sL -o "$DB_FILE" "$DB_URL"
else
echo "Error: Neither wget nor curl is available"
exit 1
fi
else
echo "Using existing TPC-H.db file"
fi
# Run the benchmark
echo "Running TPC-H benchmark..."
"$TPCH_DIR/run.sh"

21
perf/tpc-h/queries/1.sql Normal file
View File

@@ -0,0 +1,21 @@
select
l_returnflag,
l_linestatus,
sum(l_quantity) as sum_qty,
sum(l_extendedprice) as sum_base_price,
sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
avg(l_quantity) as avg_qty,
avg(l_extendedprice) as avg_price,
avg(l_discount) as avg_disc,
count(*) as count_order
from
lineitem
where
l_shipdate <= cast('1998-12-01' as datetime) -- modified not to include cast({'day': 71} as interval)
group by
l_returnflag,
l_linestatus
order by
l_returnflag,
l_linestatus;

32
perf/tpc-h/queries/10.sql Normal file
View File

@@ -0,0 +1,32 @@
select
c_custkey,
c_name,
sum(l_extendedprice * (1 - l_discount)) as revenue,
c_acctbal,
n_name,
c_address,
c_phone,
c_comment
from
customer,
orders,
lineitem,
nation
where
c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate >= cast('1994-01-01' as datetime)
and o_orderdate < cast('1994-04-01' as datetime) -- modified not to include cast({'month': 3} as interval)
and l_returnflag = 'R'
and c_nationkey = n_nationkey
group by
c_custkey,
c_name,
c_acctbal,
c_phone,
n_name,
c_address,
c_comment
order by
revenue desc
limit 20;

30
perf/tpc-h/queries/11.sql Normal file
View File

@@ -0,0 +1,30 @@
-- LIMBO_SKIP: subquery in where not supported
select
ps_partkey,
sum(ps_supplycost * ps_availqty) as value
from
partsupp,
supplier,
nation
where
ps_suppkey = s_suppkey
and s_nationkey = n_nationkey
and n_name = 'ARGENTINA'
group by
ps_partkey having
sum(ps_supplycost * ps_availqty) > (
select
sum(ps_supplycost * ps_availqty) * 0.0001000000
from
partsupp,
supplier,
nation
where
ps_suppkey = s_suppkey
and s_nationkey = n_nationkey
and n_name = 'ARGENTINA'
)
order by
value desc;

28
perf/tpc-h/queries/12.sql Normal file
View File

@@ -0,0 +1,28 @@
select
l_shipmode,
sum(case
when o_orderpriority = '1-URGENT'
or o_orderpriority = '2-HIGH'
then 1
else 0
end) as high_line_count,
sum(case
when o_orderpriority <> '1-URGENT'
and o_orderpriority <> '2-HIGH'
then 1
else 0
end) as low_line_count
from
orders,
lineitem
where
o_orderkey = l_orderkey
and l_shipmode in ('FOB', 'SHIP')
and l_commitdate < l_receiptdate
and l_shipdate < l_commitdate
and l_receiptdate >= cast('1994-01-01' as datetime)
and l_receiptdate < cast('1995-01-01' as datetime) -- modified not to include cast({'year': 1} as interval)
group by
l_shipmode
order by
l_shipmode;

20
perf/tpc-h/queries/13.sql Normal file
View File

@@ -0,0 +1,20 @@
select
c_count,
count(*) as custdist
from
(
select
c_custkey,
count(o_orderkey) as c_count
from
customer left outer join orders on
c_custkey = o_custkey
and o_comment not like '%express%packages%'
group by
c_custkey
) as c_orders
group by
c_count
order by
custdist desc,
c_count desc;

13
perf/tpc-h/queries/14.sql Normal file
View File

@@ -0,0 +1,13 @@
select
100.00 * sum(cast(case
when p_type like 'PROMO%'
then l_extendedprice * (1 - l_discount)
else 0
end as number)) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue
from
lineitem,
part
where
l_partkey = p_partkey
and l_shipdate >= cast('1994-03-01' as datetime)
and l_shipdate < cast('1994-04-01' as datetime); -- modified not to include cast({'month': 1} as interval)

36
perf/tpc-h/queries/15.sql Normal file
View File

@@ -0,0 +1,36 @@
-- LIMBO_SKIP: views not supported
create view revenue0 (supplier_no, total_revenue) as
select
l_suppkey,
sum(l_extendedprice * (1 - l_discount))
from
lineitem
where
l_shipdate >= cast('1993-01-01' as datetime)
and l_shipdate < cast('1993-04-01' as datetime) -- modified not to include cast({'month': 3} as interval)
group by
l_suppkey;
select
s_suppkey,
s_name,
s_address,
s_phone,
total_revenue
from
supplier,
revenue0
where
s_suppkey = supplier_no
and total_revenue = (
select
max(total_revenue)
from
revenue0
)
order by
s_suppkey;
drop view revenue0;

33
perf/tpc-h/queries/16.sql Normal file
View File

@@ -0,0 +1,33 @@
-- LIMBO_SKIP: subquery in where not supported
select
p_brand,
p_type,
p_size,
count(distinct ps_suppkey) as supplier_cnt
from
partsupp,
part
where
p_partkey = ps_partkey
and p_brand <> 'Brand#45'
and p_type not like 'SMALL PLATED%'
and p_size in (19, 17, 16, 23, 10, 4, 38, 11)
and ps_suppkey not in (
select
s_suppkey
from
supplier
where
s_comment like '%Customer%Complaints%'
)
group by
p_brand,
p_type,
p_size
order by
supplier_cnt desc,
p_brand,
p_type,
p_size;

20
perf/tpc-h/queries/17.sql Normal file
View File

@@ -0,0 +1,20 @@
-- LIMBO_SKIP: subquery in where not supported
select
sum(l_extendedprice) / 7.0 as avg_yearly
from
lineitem,
part
where
p_partkey = l_partkey
and p_brand = 'Brand#52'
and p_container = 'LG CAN'
and l_quantity < (
select
0.2 * avg(l_quantity)
from
lineitem
where
l_partkey = p_partkey
);

36
perf/tpc-h/queries/18.sql Normal file
View File

@@ -0,0 +1,36 @@
-- LIMBO_SKIP: subquery in where not supported
select
c_name,
c_custkey,
o_orderkey,
o_orderdate,
o_totalprice,
sum(l_quantity)
from
customer,
orders,
lineitem
where
o_orderkey in (
select
l_orderkey
from
lineitem
group by
l_orderkey having
sum(l_quantity) > 313
)
and c_custkey = o_custkey
and o_orderkey = l_orderkey
group by
c_name,
c_custkey,
o_orderkey,
o_orderdate,
o_totalprice
order by
o_totalprice desc,
o_orderdate
limit 100;

38
perf/tpc-h/queries/19.sql Normal file
View File

@@ -0,0 +1,38 @@
-- LIMBO_SKIP: bad-query-plan-takes-forever
select
sum(l_extendedprice* (1 - l_discount)) as revenue
from
lineitem,
part
where
(
p_partkey = l_partkey
and p_brand = 'Brand#22'
and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
and l_quantity >= 8 and l_quantity <= 8 + 10
and p_size between 1 and 5
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
(
p_partkey = l_partkey
and p_brand = 'Brand#23'
and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
and l_quantity >= 10 and l_quantity <= 10 + 10
and p_size between 1 and 10
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
(
p_partkey = l_partkey
and p_brand = 'Brand#12'
and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
and l_quantity >= 24 and l_quantity <= 24 + 10
and p_size between 1 and 15
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
);

47
perf/tpc-h/queries/2.sql Normal file
View File

@@ -0,0 +1,47 @@
-- LIMBO_SKIP: subquery in where not supported
select
s_acctbal,
s_name,
n_name,
p_partkey,
p_mfgr,
s_address,
s_phone,
s_comment
from
part,
supplier,
partsupp,
nation,
region
where
p_partkey = ps_partkey
and s_suppkey = ps_suppkey
and p_size = 38
and p_type like '%TIN'
and s_nationkey = n_nationkey
and n_regionkey = r_regionkey
and r_name = 'MIDDLE EAST'
and ps_supplycost = (
select
min(ps_supplycost)
from
partsupp,
supplier,
nation,
region
where
p_partkey = ps_partkey
and s_suppkey = ps_suppkey
and s_nationkey = n_nationkey
and n_regionkey = r_regionkey
and r_name = 'MIDDLE EAST'
)
order by
s_acctbal desc,
n_name,
s_name,
p_partkey
limit 100;

40
perf/tpc-h/queries/20.sql Normal file
View File

@@ -0,0 +1,40 @@
-- LIMBO_SKIP: subquery in where not supported
select
s_name,
s_address
from
supplier,
nation
where
s_suppkey in (
select
ps_suppkey
from
partsupp
where
ps_partkey in (
select
p_partkey
from
part
where
p_name like 'frosted%'
)
and ps_availqty > (
select
0.5 * sum(l_quantity)
from
lineitem
where
l_partkey = ps_partkey
and l_suppkey = ps_suppkey
and l_shipdate >= cast('1994-01-01' as datetime)
and l_shipdate < cast('1995-01-01' as datetime) -- modified not to include cast({'year': 1} as interval)
)
)
and s_nationkey = n_nationkey
and n_name = 'IRAN'
order by
s_name;

43
perf/tpc-h/queries/21.sql Normal file
View File

@@ -0,0 +1,43 @@
-- LIMBO_SKIP: subquery in where not supported
select
s_name,
count(*) as numwait
from
supplier,
lineitem l1,
orders,
nation
where
s_suppkey = l1.l_suppkey
and o_orderkey = l1.l_orderkey
and o_orderstatus = 'F'
and l1.l_receiptdate > l1.l_commitdate
and exists (
select
*
from
lineitem l2
where
l2.l_orderkey = l1.l_orderkey
and l2.l_suppkey <> l1.l_suppkey
)
and not exists (
select
*
from
lineitem l3
where
l3.l_orderkey = l1.l_orderkey
and l3.l_suppkey <> l1.l_suppkey
and l3.l_receiptdate > l3.l_commitdate
)
and s_nationkey = n_nationkey
and n_name = 'GERMANY'
group by
s_name
order by
numwait desc,
s_name
limit 100;

40
perf/tpc-h/queries/22.sql Normal file
View File

@@ -0,0 +1,40 @@
-- LIMBO_SKIP: subquery in where not supported
select
cntrycode,
count(*) as numcust,
sum(c_acctbal) as totacctbal
from
(
select
substr(c_phone, 1, 2) as cntrycode,
c_acctbal
from
customer
where
substr(c_phone, 1, 2) in
('20', '14', '21', '28', '15', '24', '27')
and c_acctbal > (
select
avg(c_acctbal)
from
customer
where
c_acctbal > 0.00
and substr(c_phone, 1, 2) in
('20', '14', '21', '28', '15', '24', '27')
)
and not exists (
select
*
from
orders
where
o_custkey = c_custkey
)
) as custsale
group by
cntrycode
order by
cntrycode;

23
perf/tpc-h/queries/3.sql Normal file
View File

@@ -0,0 +1,23 @@
select
l_orderkey,
sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate,
o_shippriority
from
customer,
orders,
lineitem
where
c_mktsegment = 'FURNITURE'
and c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate < cast('1995-03-29' as datetime)
and l_shipdate > cast('1995-03-29' as datetime)
group by
l_orderkey,
o_orderdate,
o_shippriority
order by
revenue desc,
o_orderdate
limit 10;

24
perf/tpc-h/queries/4.sql Normal file
View File

@@ -0,0 +1,24 @@
-- LIMBO_SKIP: subquery in where not supported
select
o_orderpriority,
count(*) as order_count
from
orders
where
o_orderdate >= cast('1997-06-01' as datetime)
and o_orderdate < cast('1997-09-01' as datetime) -- modified not to include cast({'month': 3} as interval)
and exists (
select
*
from
lineitem
where
l_orderkey = o_orderkey
and l_commitdate < l_receiptdate
)
group by
o_orderpriority
order by
o_orderpriority;

24
perf/tpc-h/queries/5.sql Normal file
View File

@@ -0,0 +1,24 @@
select
n_name,
sum(l_extendedprice * (1 - l_discount)) as revenue
from
customer,
orders,
lineitem,
supplier,
nation,
region
where
c_custkey = o_custkey
and l_orderkey = o_orderkey
and l_suppkey = s_suppkey
and c_nationkey = s_nationkey
and s_nationkey = n_nationkey
and n_regionkey = r_regionkey
and r_name = 'MIDDLE EAST'
and o_orderdate >= cast('1994-01-01' as datetime)
and o_orderdate < cast('1995-01-01' as datetime) -- modified not to include cast({'year': 1} as interval)
group by
n_name
order by
revenue desc;

9
perf/tpc-h/queries/6.sql Normal file
View File

@@ -0,0 +1,9 @@
select
sum(l_extendedprice * l_discount) as revenue
from
lineitem
where
l_shipdate >= cast('1994-01-01' as datetime)
and l_shipdate < cast('1995-01-01' as datetime) -- modified not to include cast({'year': 1} as interval)
and l_discount between 0.08 - 0.01 and 0.08 + 0.01
and l_quantity < 24;

40
perf/tpc-h/queries/7.sql Normal file
View File

@@ -0,0 +1,40 @@
select
supp_nation,
cust_nation,
l_year,
sum(volume) as revenue
from
(
select
n1.n_name as supp_nation,
n2.n_name as cust_nation,
substr(l_shipdate, 1, 4) as l_year, -- modified not to include date_part('year', l_shipdate)
l_extendedprice * (1 - l_discount) as volume
from
supplier,
lineitem,
orders,
customer,
nation n1,
nation n2
where
s_suppkey = l_suppkey
and o_orderkey = l_orderkey
and c_custkey = o_custkey
and s_nationkey = n1.n_nationkey
and c_nationkey = n2.n_nationkey
and (
(n1.n_name = 'ROMANIA' and n2.n_name = 'INDIA')
or (n1.n_name = 'INDIA' and n2.n_name = 'ROMANIA')
)
and l_shipdate between
cast('1995-01-01' as datetime) and cast('1996-12-31' as datetime)
) as shipping
group by
supp_nation,
cust_nation,
l_year
order by
supp_nation,
cust_nation,
l_year;

38
perf/tpc-h/queries/8.sql Normal file
View File

@@ -0,0 +1,38 @@
select
o_year,
sum(cast(case
when nation = 'INDIA' then volume
else 0
end as number)) / sum(volume) as mkt_share
from
(
select
substr(o_orderdate, 1, 4) as o_year, -- modified not to include date_part('year', o_orderdate)
l_extendedprice * (1 - l_discount) as volume,
n2.n_name as nation
from
part,
supplier,
lineitem,
orders,
customer,
nation n1,
nation n2,
region
where
p_partkey = l_partkey
and s_suppkey = l_suppkey
and l_orderkey = o_orderkey
and o_custkey = c_custkey
and c_nationkey = n1.n_nationkey
and n1.n_regionkey = r_regionkey
and r_name = 'ASIA'
and s_nationkey = n2.n_nationkey
and o_orderdate between
cast('1995-01-01' as datetime) and cast('1996-12-31' as datetime)
and p_type = 'PROMO BRUSHED COPPER'
) as all_nations
group by
o_year
order by
o_year;

32
perf/tpc-h/queries/9.sql Normal file
View File

@@ -0,0 +1,32 @@
select
nation,
o_year,
sum(amount) as sum_profit
from
(
select
n_name as nation,
substr(o_orderdate, 1, 4) as o_year, -- modified not to include date_part('year', o_orderdate)
l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount
from
part,
supplier,
lineitem,
partsupp,
orders,
nation
where
s_suppkey = l_suppkey
and ps_suppkey = l_suppkey
and ps_partkey = l_partkey
and p_partkey = l_partkey
and o_orderkey = l_orderkey
and s_nationkey = n_nationkey
and p_name like '%yellow%'
) as profit
group by
nation,
o_year
order by
nation,
o_year desc;

98
perf/tpc-h/run.sh Executable file
View File

@@ -0,0 +1,98 @@
#!/bin/bash
# This script will run the TPC-H queries and compare timings.
REPO_ROOT=$(git rev-parse --show-toplevel)
RELEASE_BUILD_DIR="$REPO_ROOT/target/release"
TPCH_DIR="$REPO_ROOT/perf/tpc-h"
DB_FILE="$TPCH_DIR/TPC-H.db"
QUERIES_DIR="$TPCH_DIR/queries"
LIMBO_BIN="$RELEASE_BUILD_DIR/limbo"
SQLITE_BIN="sqlite3" # Assuming sqlite3 is in PATH
# Function to clear system caches based on OS
clear_caches() {
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sync
sudo purge
elif [[ "$OSTYPE" == "linux-gnu"* ]] || [[ "$OSTYPE" == "linux"* ]]; then
# Linux
sync
echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null
else
echo "Warning: Cache clearing not supported on this OS ($OSTYPE)." >&2
fi
}
# Ensure the Limbo binary exists
if [ ! -f "$LIMBO_BIN" ]; then
echo "Error: Limbo binary not found at $LIMBO_BIN"
echo "Please build Limbo first (e.g., by running benchmark.sh or 'cargo build --bin limbo --release')"
exit 1
fi
# Ensure the SQLite binary exists
if ! command -v $SQLITE_BIN >/dev/null 2>&1; then
echo "Error: sqlite3 command not found. Please install sqlite3."
exit 1
fi
# Ensure the database file exists
if [ ! -f "$DB_FILE" ]; then
echo "Error: TPC-H database not found at $DB_FILE"
echo "Please ensure the database is downloaded (e.g., by running benchmark.sh)"
exit 1
fi
echo "Starting TPC-H query timing comparison..."
# Initial cache clear
echo "The script might ask you to enter the password for sudo, in order to clear system caches."
clear_caches
for query_file in $(ls "$QUERIES_DIR"/*.sql | sort -V); do
if [ -f "$query_file" ]; then
query_name=$(basename "$query_file")
# If the query file starts with "-- LIMBO_SKIP: ...", skip it and print the reason
if head -n1 "$query_file" | grep -q "^-- LIMBO_SKIP: "; then
skip_reason=$(head -n1 "$query_file" | sed 's/^-- LIMBO_SKIP: //')
echo "Skipping $query_name, reason: $skip_reason"
echo "-----------------------------------------------------------"
continue
fi
echo "Running $query_name with Limbo..." >&2
# Clear caches before Limbo run
clear_caches
# Run Limbo
limbo_output=$(/usr/bin/time "$LIMBO_BIN" "$DB_FILE" --quiet --output-mode list "$(cat "$query_file")" 2>&1)
limbo_non_time_lines=$(echo "$limbo_output" | grep -v -e "real" -e "user" -e "sys")
limbo_real_time=$(echo "$limbo_output" | grep "real" | awk '{print $1}')
echo "Running $query_name with SQLite3..." >&2
# Clear caches before SQLite execution
clear_caches
sqlite_output=$(/usr/bin/time $SQLITE_BIN "$DB_FILE" "$(cat "$query_file")" 2>&1)
sqlite_non_time_lines=$(echo "$sqlite_output" | grep -v -e "real" -e "user" -e "sys")
sqlite_real_time=$(echo "$sqlite_output" | grep "real" | awk '{print $1}')
echo "Limbo real time: $limbo_real_time"
echo "SQLite3 real time: $sqlite_real_time"
echo "Limbo output:"
echo "$limbo_non_time_lines"
echo "SQLite3 output:"
echo "$sqlite_non_time_lines"
output_diff=$(diff <(echo "$limbo_non_time_lines") <(echo "$sqlite_non_time_lines"))
if [ -n "$output_diff" ]; then
echo "Output difference:"
echo "$output_diff"
else
echo "No output difference"
fi
else
echo "Warning: Skipping non-file item $query_file"
fi
echo "-----------------------------------------------------------"
done
echo "-----------------------------------------------------------"
echo "TPC-H query timing comparison completed."