SlideShare a Scribd company logo
Lessons for the optimizer
from TPC-DS benchmark
Sergei Petrunia
Query Optimizer developer
MariaDB Corporation
2019 MariaDB Developers Unconference
New York
The goals
1. Want to evaluate/measure the query optimizer
2. Hard to do, optimizer should handle
– Different query patterns
– Different data distributions, etc
3. How does one do it anyway?
– Look at benchmarks
– Or “optimizer part” of the benchmarks
Benchmarks
1. sysbench
– Popular
– Does only basic queries, few query patterns
2. DBT-3 (aka TPC-H)
– 6 tables, 22 analytic queries
– Was used to see some optimizer problems
– Limited:
●
Uniform data distribution, uncorrelated columns
●
...
TPC-DS benchmark
● Obsoletes DBT-3 benchmark
● Richer dataset
– 25 Tables, 99 queries
– Non-uniform data distributions
● Uses advanced SQL features
– 32 queries use CTE
– 27 queries use Window Functions
– etc
● Could not really run it until MariaDB 10.2 (or MySQL 8)
MariaDB still can’t run all of TPC-DS
●
2 Queries: FULL OUTER JOIN
●
10 Queries: ROLLUP + ORDER BY problem (MDEV-17807)
●
~20 more queries have fixable problems
– “Every derived table must have an alias”, etc
select
...
group by
a,b,c with rollup
order by
a,b,c
ERROR 1221 (HY000): Incorrect usage of CUBE/ROLLUP
and ORDER BY
Oracle MySQL and TPC-DS
● ROLLUP + ORDER BY is supported since 8.0.12
● Doesn’t support FULL OUTER JOIN (2 queries)
● Doesn’t support EXCEPT (1 query)
● Doesn’t support INTERSECT (3 queries)
Running queries from TPC-DS
● Data generator creates CSV files
– Adjust #define for MySQL/MariaDB
● Query generator produces “streams” from templates
– A set of QueryNNN.tpl files
– A stream is a text file with one instance of each of the 99 queries
– One can add hooks at query start/end
● Queries have a few typos
● There’s no tool to run queries/measure time
– Note that the read queries are a subset of benchmark (TpCX$)
Getting it to run
● A collection of scripts at
https://github.com/spetrunia/tpcds-run-tool
● The goal is a fully-automated run
– MariaDB, MySQL, PostgreSQL
● Because we need to play with settings/options
Test runs done
● The dataset
– Scale=1
– 1.2 GB CSV files
– 6 GB when loaded
● The Queries
– 10..20 “Streams”
● Tuning
– Innodb_buffer_pool=8G (50% RAM)
– shared_buffers = 4G (25% RAM)
Test results
Test results
● ...
Test results
● … a bit inconclusive – query times varied across my runs (?)
● Time to run one stream = 20 min – 2 hours
● Searching for the source of randomness
– Started to work on full automation
●
(did I run ANALYZE? Did I have correct with my.cnf
parameters?)
– Started to look at rngseed in dataset/query generator
MariaDB/MySQL
MariaDB 10.2, 10.4, MySQL 8
● Scale=1, 6.1 GB data, 8G buffer pool
● rngseed=1234 for both
● Benchmark takes ~20 min
● Query times are very non-uniform
+-------------+---------------+
| query_name | QueryTime_ms |
+-------------+---------------+
| query72.tpl | 678,321 |
| query23.tpl | 80,025 |
| query2.tpl | 65,156 |
| query39.tpl | 63,761 |
| query78.tpl | 63,473 |
| query4.tpl | 27,549 |
| query31.tpl | 24,344 |
| query47.tpl | 19,156 |
| query11.tpl | 17,484 |
| query74.tpl | 16,571 |
| query21.tpl | 16,212 |
| query59.tpl | 10,522 |
| query88.tpl | 9,965 |
Query#72 dominates
query1.tpl
query13.tpl
query19.tpl
query23.tpl
query28.tpl
query31.tpl
query35.tpl
query40.tpl
query44.tpl
query48.tpl
query53.tpl
query58.tpl
query61.tpl
query65.tpl
query69.tpl
query73.tpl
query78.tpl
query83.tpl
query89.tpl
query92.tpl
query96.tpl
0
100000
200000
300000
400000
500000
600000
700000
800000
Without Query #72
query1.tpl
query13.tpl
query19.tpl
query23.tpl
query28.tpl
query31.tpl
query35.tpl
query40.tpl
query44.tpl
query48.tpl
query53.tpl
query58.tpl
query61.tpl
query65.tpl
query69.tpl
query74.tpl
query79.tpl
query84.tpl
query9.tpl
query93.tpl
query98.tpl
0
10000
20000
30000
40000
50000
60000
70000
80000
90000
PostgreSQL 11
PostgreSQL 11
● There was a “fast” run
● Showing results from the last
two runs (both where “slow”)
– rngseed=5678 for both
– 121 min
– rngseed=1234 (data),
rngseed=4321 (query)
– 145..154 min.
Heaviest queries in the run
● Execution time varies
● Is this a query optimizer issue?
● Or different constants in a skewed dataset?
+-------------+-----------------+-----------------+--------+
| query_name | PG11-seed5678 | PG11-seed1234 | X |
+-------------+-----------------+-----------------+--------+
| query4.tpl | 3,628,830 | 3,578,944 | 1.0139 |
| query11.tpl | 2,004,392 | 2,013,597 | 0.9954 |
| query1.tpl | 87,981 | 1,947,624 | 0.0452 |
| query74.tpl | 693,784 | 641,696 | 1.0812 |
| query47.tpl | 624,717 | 539,941 | 1.1570 |
| query57.tpl | 116,570 | 112,472 | 1.0364 |
| query81.tpl | 22,089 | 47,366 | 0.4663 |
| query6.tpl | 27,896 | 27,009 | 1.0328 |
| query30.tpl | 11,214 | 11,171 | 1.0038 |
| query39.tpl | 10,803 | 10,702 | 1.0094 |
| query95.tpl | 16,418 | 10,065 | 1.6312 |
`
● Do we need a “representative
collection of datasets”?
– Check N datasets?
Compare most heavy queries
● Some queries are present in both lists, but some are only in one.
● Not clear
+-------------+-----------------+-----------------+--------+
| query_name | PG11-seed5678 | PG11-seed1234 | X |
+-------------+-----------------+-----------------+--------+
| query4.tpl | 3,628,830 | 3,578,944 | 1.0139 |
| query11.tpl | 2,004,392 | 2,013,597 | 0.9954 |
| query1.tpl | 87,981 | 1,947,624 | 0.0452 |
| query74.tpl | 693,784 | 641,696 | 1.0812 |
| query47.tpl | 624,717 | 539,941 | 1.1570 |
| query57.tpl | 116,570 | 112,472 | 1.0364 |
| query81.tpl | 22,089 | 47,366 | 0.4663 |
| query6.tpl | 27,896 | 27,009 | 1.0328 |
| query30.tpl | 11,214 | 11,171 | 1.0038 |
| query39.tpl | 10,803 | 10,702 | 1.0094 |
| query95.tpl | 16,418 | 10,065 | 1.6312 |
`
+-------------+---------------+
| query_name | QueryTime_ms |
+-------------+---------------+
| query72.tpl | 678,321 |
| query23.tpl | 80,025 |
| query2.tpl | 65,156 |
| query39.tpl | 63,761 |
| query78.tpl | 63,473 |
| query4.tpl | 27,549 |
| query31.tpl | 24,344 |
| query47.tpl | 19,156 |
| query11.tpl | 17,484 |
| query74.tpl | 16,571 |
| query21.tpl | 16,212 |
| query59.tpl | 10,522 |
MariaDB PostgreSQL
Observations about the benchmark
● rngseed on the dataset matters A LOT
– What is a representative set of rngseed values?
● rngseed on query streams – much less
● Hardware?
● Queries are not equal
– Heavy vs lightweight queries
– Is SUM(query_time) an adequate metric?
●
Wont see that a fast query got 10x slower
Other observations
● Both DBT-3 and TPC-DS workloads are relevant for the optimizer
– Condition selectivities
– Semi-join optimizations
– …
● But don’t match the optimizer issues we see
– ORDER BY … LIMIT optimization
– Long IN-list
– …
Extra: parallel query in PG?
Extra – PostgreSQL 11, parallel query?
● Trying on a run with both rngseed=5678:
● Parallel settings
max_parallel_workers_per_gather=8 (the default was 2)
dynamic_shared_memory_type=posix
show max_worker_processes= 8
● Results
– Only saw one core to be occupied
– The run still took 121 min, didin’t see any speedup
Try a parallel query
select
sum(inv_quantity_on_hand*i_current_price)
from
inventory, item
where
i_item_sk=inv_item_sk;
QUERY PLAN
---------------------------------------------------------------------------------
Aggregate (cost=301495.25..301495.26 rows=1 width=32)
-> Hash Join (cost=1635.00..213408.54 rows=11744894 width=10)
Hash Cond: (inventory.inv_item_sk = item.i_item_sk)
-> Seq Scan on inventory (cost=0.00..180935.94 rows=11744894 width=8)
-> Hash (cost=1410.00..1410.00 rows=18000 width=10)
-> Seq Scan on item (cost=0.00..1410.00 rows=18000 width=10)
● max_parallel_workers_per_gather=0
Try a parallel query
select
sum(inv_quantity_on_hand*i_current_price)
from
inventory, item
where
i_item_sk=inv_item_sk;
QUERY PLAN
----------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=125048.98..125048.99 rows=1 width=32)
-> Gather (cost=125048.55..125048.96 rows=4 width=32)
Workers Planned: 4
-> Partial Aggregate (cost=124048.55..124048.56 rows=1 width=32)
-> Parallel Hash Join (cost=1468.23..102026.87 rows=2936224 width=10)
Hash Cond: (inventory.inv_item_sk = item.i_item_sk)
-> Parallel Seq Scan on inventory (cost=0.00..92849.24 rows=2936224 width=8)
-> Parallel Hash (cost=1335.88..1335.88 rows=10588 width=10)
-> Parallel Seq Scan on item (cost=0.00..1335.88 rows=10588 width=10)
● max_parallel_workers_per_gather=8
Try a parallel query
select
sum(inv_quantity_on_hand*i_current_price)
from
inventory, item
where
i_item_sk=inv_item_sk;
● Results
– max_parallel_workers_per_gather=8: 1.0 sec
– max_parallel_workers_per_gather=0: 3.8 sec
● Didn’t see anything like that in TPC-DS benchmark
Thanks!

More Related Content

PDF
The Parquet Format and Performance Optimization Opportunities
PDF
Common Strategies for Improving Performance on Your Delta Lakehouse
PPTX
Dynamic filtering for presto join optimisation
PDF
Native Support of Prometheus Monitoring in Apache Spark 3.0
PDF
The Rise of ZStandard: Apache Spark/Parquet/ORC/Avro
PDF
Spark shuffle introduction
PDF
Dynamic Partition Pruning in Apache Spark
PPTX
Processing Large Data with Apache Spark -- HasGeek
The Parquet Format and Performance Optimization Opportunities
Common Strategies for Improving Performance on Your Delta Lakehouse
Dynamic filtering for presto join optimisation
Native Support of Prometheus Monitoring in Apache Spark 3.0
The Rise of ZStandard: Apache Spark/Parquet/ORC/Avro
Spark shuffle introduction
Dynamic Partition Pruning in Apache Spark
Processing Large Data with Apache Spark -- HasGeek

What's hot (20)

PDF
Top 5 Mistakes to Avoid When Writing Apache Spark Applications
PDF
Adaptive Query Execution: Speeding Up Spark SQL at Runtime
PDF
ETL With Cassandra Streaming Bulk Loading
PDF
Real-time, Exactly-once Data Ingestion from Kafka to ClickHouse at eBay
PPTX
Understanding SQL Trace, TKPROF and Execution Plan for beginners
PDF
Parquet performance tuning: the missing guide
PDF
Introduction to Greenplum
PDF
Large Scale Lakehouse Implementation Using Structured Streaming
PDF
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...
PPTX
Spark Shuffle Deep Dive (Explained In Depth) - How Shuffle Works in Spark
PDF
Delta Lake: Optimizing Merge
PDF
All about Zookeeper and ClickHouse Keeper.pdf
PDF
MariaDB: Engine Independent Table Statistics, including histograms
PDF
A Practical Introduction to Handling Log Data in ClickHouse, by Robert Hodges...
PDF
CDC Stream Processing with Apache Flink
PPTX
A Deep Dive into Spark SQL's Catalyst Optimizer with Yin Huai
PDF
Deep Dive into Stateful Stream Processing in Structured Streaming with Tathag...
PDF
ProxySQL - High Performance and HA Proxy for MySQL
PDF
Building a SIMD Supported Vectorized Native Engine for Spark SQL
PDF
Scalable Monitoring Using Prometheus with Apache Spark Clusters with Diane F...
Top 5 Mistakes to Avoid When Writing Apache Spark Applications
Adaptive Query Execution: Speeding Up Spark SQL at Runtime
ETL With Cassandra Streaming Bulk Loading
Real-time, Exactly-once Data Ingestion from Kafka to ClickHouse at eBay
Understanding SQL Trace, TKPROF and Execution Plan for beginners
Parquet performance tuning: the missing guide
Introduction to Greenplum
Large Scale Lakehouse Implementation Using Structured Streaming
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...
Spark Shuffle Deep Dive (Explained In Depth) - How Shuffle Works in Spark
Delta Lake: Optimizing Merge
All about Zookeeper and ClickHouse Keeper.pdf
MariaDB: Engine Independent Table Statistics, including histograms
A Practical Introduction to Handling Log Data in ClickHouse, by Robert Hodges...
CDC Stream Processing with Apache Flink
A Deep Dive into Spark SQL's Catalyst Optimizer with Yin Huai
Deep Dive into Stateful Stream Processing in Structured Streaming with Tathag...
ProxySQL - High Performance and HA Proxy for MySQL
Building a SIMD Supported Vectorized Native Engine for Spark SQL
Scalable Monitoring Using Prometheus with Apache Spark Clusters with Diane F...
Ad

Similar to Lessons for the optimizer from running the TPC-DS benchmark (20)

PDF
Postgres Performance for Humans
PDF
Query Optimizer in MariaDB 10.4
PPTX
CS 542 -- Query Optimization
PDF
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
PDF
query-optimization-techniques_talk.pdf
PPTX
CS 542 -- Query Execution
PPTX
Blinkdb
PDF
Understanding the architecture of MariaDB ColumnStore
PDF
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
PDF
Percona live-2012-optimizer-tuning
PDF
Efficient Query Processing Using Machine Learning
PDF
JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course
PDF
Optimizer features in recent releases of other databases
PDF
Storage Methods for Nonstandard Data Patterns
PDF
orca_fosdem_FINAL
PDF
Advanced Query Optimizer Tuning and Analysis
PDF
Postgres performance for humans
PDF
Modern solutions for modern database load: improvements in the latest MariaDB...
PDF
M|18 Understanding the Architecture of MariaDB ColumnStore
PDF
Quick Wins
Postgres Performance for Humans
Query Optimizer in MariaDB 10.4
CS 542 -- Query Optimization
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
query-optimization-techniques_talk.pdf
CS 542 -- Query Execution
Blinkdb
Understanding the architecture of MariaDB ColumnStore
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
Percona live-2012-optimizer-tuning
Efficient Query Processing Using Machine Learning
JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course
Optimizer features in recent releases of other databases
Storage Methods for Nonstandard Data Patterns
orca_fosdem_FINAL
Advanced Query Optimizer Tuning and Analysis
Postgres performance for humans
Modern solutions for modern database load: improvements in the latest MariaDB...
M|18 Understanding the Architecture of MariaDB ColumnStore
Quick Wins
Ad

More from Sergey Petrunya (20)

PDF
MariaDB's New-Generation Optimizer Hints
PDF
New optimizer features in MariaDB releases before 10.12
PDF
MariaDB's join optimizer: how it works and current fixes
PDF
Improved histograms in MariaDB 10.8
PDF
Improving MariaDB’s Query Optimizer with better selectivity estimates
PDF
JSON Support in MariaDB: News, non-news and the bigger picture
PDF
Optimizer Trace Walkthrough
PDF
ANALYZE for Statements - MariaDB's hidden gem
PDF
MariaDB 10.4 - что нового
PDF
Using histograms to get better performance
PDF
MariaDB Optimizer - further down the rabbit hole
PDF
MariaDB 10.3 Optimizer - where does it stand
PDF
MyRocks in MariaDB | M18
PDF
New Query Optimizer features in MariaDB 10.3
PDF
MyRocks in MariaDB
PDF
Histograms in MariaDB, MySQL and PostgreSQL
PDF
Say Hello to MyRocks
PDF
Common Table Expressions in MariaDB 10.2
PDF
MyRocks in MariaDB: why and how
PDF
Эволюция репликации в MySQL и MariaDB
MariaDB's New-Generation Optimizer Hints
New optimizer features in MariaDB releases before 10.12
MariaDB's join optimizer: how it works and current fixes
Improved histograms in MariaDB 10.8
Improving MariaDB’s Query Optimizer with better selectivity estimates
JSON Support in MariaDB: News, non-news and the bigger picture
Optimizer Trace Walkthrough
ANALYZE for Statements - MariaDB's hidden gem
MariaDB 10.4 - что нового
Using histograms to get better performance
MariaDB Optimizer - further down the rabbit hole
MariaDB 10.3 Optimizer - where does it stand
MyRocks in MariaDB | M18
New Query Optimizer features in MariaDB 10.3
MyRocks in MariaDB
Histograms in MariaDB, MySQL and PostgreSQL
Say Hello to MyRocks
Common Table Expressions in MariaDB 10.2
MyRocks in MariaDB: why and how
Эволюция репликации в MySQL и MariaDB

Recently uploaded (20)

PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PPTX
Transform Your Business with a Software ERP System
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
Understanding Forklifts - TECH EHS Solution
PPTX
L1 - Introduction to python Backend.pptx
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Nekopoi APK 2025 free lastest update
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PPTX
Introduction to Artificial Intelligence
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
Odoo Companies in India – Driving Business Transformation.pdf
CHAPTER 2 - PM Management and IT Context
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Navsoft: AI-Powered Business Solutions & Custom Software Development
Transform Your Business with a Software ERP System
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Understanding Forklifts - TECH EHS Solution
L1 - Introduction to python Backend.pptx
Wondershare Filmora 15 Crack With Activation Key [2025
wealthsignaloriginal-com-DS-text-... (1).pdf
Nekopoi APK 2025 free lastest update
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Which alternative to Crystal Reports is best for small or large businesses.pdf
PTS Company Brochure 2025 (1).pdf.......
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Introduction to Artificial Intelligence
Design an Analysis of Algorithms II-SECS-1021-03
Odoo Companies in India – Driving Business Transformation.pdf

Lessons for the optimizer from running the TPC-DS benchmark

  • 1. Lessons for the optimizer from TPC-DS benchmark Sergei Petrunia Query Optimizer developer MariaDB Corporation 2019 MariaDB Developers Unconference New York
  • 2. The goals 1. Want to evaluate/measure the query optimizer 2. Hard to do, optimizer should handle – Different query patterns – Different data distributions, etc 3. How does one do it anyway? – Look at benchmarks – Or “optimizer part” of the benchmarks
  • 3. Benchmarks 1. sysbench – Popular – Does only basic queries, few query patterns 2. DBT-3 (aka TPC-H) – 6 tables, 22 analytic queries – Was used to see some optimizer problems – Limited: ● Uniform data distribution, uncorrelated columns ● ...
  • 4. TPC-DS benchmark ● Obsoletes DBT-3 benchmark ● Richer dataset – 25 Tables, 99 queries – Non-uniform data distributions ● Uses advanced SQL features – 32 queries use CTE – 27 queries use Window Functions – etc ● Could not really run it until MariaDB 10.2 (or MySQL 8)
  • 5. MariaDB still can’t run all of TPC-DS ● 2 Queries: FULL OUTER JOIN ● 10 Queries: ROLLUP + ORDER BY problem (MDEV-17807) ● ~20 more queries have fixable problems – “Every derived table must have an alias”, etc select ... group by a,b,c with rollup order by a,b,c ERROR 1221 (HY000): Incorrect usage of CUBE/ROLLUP and ORDER BY
  • 6. Oracle MySQL and TPC-DS ● ROLLUP + ORDER BY is supported since 8.0.12 ● Doesn’t support FULL OUTER JOIN (2 queries) ● Doesn’t support EXCEPT (1 query) ● Doesn’t support INTERSECT (3 queries)
  • 7. Running queries from TPC-DS ● Data generator creates CSV files – Adjust #define for MySQL/MariaDB ● Query generator produces “streams” from templates – A set of QueryNNN.tpl files – A stream is a text file with one instance of each of the 99 queries – One can add hooks at query start/end ● Queries have a few typos ● There’s no tool to run queries/measure time – Note that the read queries are a subset of benchmark (TpCX$)
  • 8. Getting it to run ● A collection of scripts at https://github.com/spetrunia/tpcds-run-tool ● The goal is a fully-automated run – MariaDB, MySQL, PostgreSQL ● Because we need to play with settings/options
  • 9. Test runs done ● The dataset – Scale=1 – 1.2 GB CSV files – 6 GB when loaded ● The Queries – 10..20 “Streams” ● Tuning – Innodb_buffer_pool=8G (50% RAM) – shared_buffers = 4G (25% RAM)
  • 12. Test results ● … a bit inconclusive – query times varied across my runs (?) ● Time to run one stream = 20 min – 2 hours ● Searching for the source of randomness – Started to work on full automation ● (did I run ANALYZE? Did I have correct with my.cnf parameters?) – Started to look at rngseed in dataset/query generator
  • 14. MariaDB 10.2, 10.4, MySQL 8 ● Scale=1, 6.1 GB data, 8G buffer pool ● rngseed=1234 for both ● Benchmark takes ~20 min ● Query times are very non-uniform +-------------+---------------+ | query_name | QueryTime_ms | +-------------+---------------+ | query72.tpl | 678,321 | | query23.tpl | 80,025 | | query2.tpl | 65,156 | | query39.tpl | 63,761 | | query78.tpl | 63,473 | | query4.tpl | 27,549 | | query31.tpl | 24,344 | | query47.tpl | 19,156 | | query11.tpl | 17,484 | | query74.tpl | 16,571 | | query21.tpl | 16,212 | | query59.tpl | 10,522 | | query88.tpl | 9,965 |
  • 18. PostgreSQL 11 ● There was a “fast” run ● Showing results from the last two runs (both where “slow”) – rngseed=5678 for both – 121 min – rngseed=1234 (data), rngseed=4321 (query) – 145..154 min.
  • 19. Heaviest queries in the run ● Execution time varies ● Is this a query optimizer issue? ● Or different constants in a skewed dataset? +-------------+-----------------+-----------------+--------+ | query_name | PG11-seed5678 | PG11-seed1234 | X | +-------------+-----------------+-----------------+--------+ | query4.tpl | 3,628,830 | 3,578,944 | 1.0139 | | query11.tpl | 2,004,392 | 2,013,597 | 0.9954 | | query1.tpl | 87,981 | 1,947,624 | 0.0452 | | query74.tpl | 693,784 | 641,696 | 1.0812 | | query47.tpl | 624,717 | 539,941 | 1.1570 | | query57.tpl | 116,570 | 112,472 | 1.0364 | | query81.tpl | 22,089 | 47,366 | 0.4663 | | query6.tpl | 27,896 | 27,009 | 1.0328 | | query30.tpl | 11,214 | 11,171 | 1.0038 | | query39.tpl | 10,803 | 10,702 | 1.0094 | | query95.tpl | 16,418 | 10,065 | 1.6312 | ` ● Do we need a “representative collection of datasets”? – Check N datasets?
  • 20. Compare most heavy queries ● Some queries are present in both lists, but some are only in one. ● Not clear +-------------+-----------------+-----------------+--------+ | query_name | PG11-seed5678 | PG11-seed1234 | X | +-------------+-----------------+-----------------+--------+ | query4.tpl | 3,628,830 | 3,578,944 | 1.0139 | | query11.tpl | 2,004,392 | 2,013,597 | 0.9954 | | query1.tpl | 87,981 | 1,947,624 | 0.0452 | | query74.tpl | 693,784 | 641,696 | 1.0812 | | query47.tpl | 624,717 | 539,941 | 1.1570 | | query57.tpl | 116,570 | 112,472 | 1.0364 | | query81.tpl | 22,089 | 47,366 | 0.4663 | | query6.tpl | 27,896 | 27,009 | 1.0328 | | query30.tpl | 11,214 | 11,171 | 1.0038 | | query39.tpl | 10,803 | 10,702 | 1.0094 | | query95.tpl | 16,418 | 10,065 | 1.6312 | ` +-------------+---------------+ | query_name | QueryTime_ms | +-------------+---------------+ | query72.tpl | 678,321 | | query23.tpl | 80,025 | | query2.tpl | 65,156 | | query39.tpl | 63,761 | | query78.tpl | 63,473 | | query4.tpl | 27,549 | | query31.tpl | 24,344 | | query47.tpl | 19,156 | | query11.tpl | 17,484 | | query74.tpl | 16,571 | | query21.tpl | 16,212 | | query59.tpl | 10,522 | MariaDB PostgreSQL
  • 21. Observations about the benchmark ● rngseed on the dataset matters A LOT – What is a representative set of rngseed values? ● rngseed on query streams – much less ● Hardware? ● Queries are not equal – Heavy vs lightweight queries – Is SUM(query_time) an adequate metric? ● Wont see that a fast query got 10x slower
  • 22. Other observations ● Both DBT-3 and TPC-DS workloads are relevant for the optimizer – Condition selectivities – Semi-join optimizations – … ● But don’t match the optimizer issues we see – ORDER BY … LIMIT optimization – Long IN-list – …
  • 24. Extra – PostgreSQL 11, parallel query? ● Trying on a run with both rngseed=5678: ● Parallel settings max_parallel_workers_per_gather=8 (the default was 2) dynamic_shared_memory_type=posix show max_worker_processes= 8 ● Results – Only saw one core to be occupied – The run still took 121 min, didin’t see any speedup
  • 25. Try a parallel query select sum(inv_quantity_on_hand*i_current_price) from inventory, item where i_item_sk=inv_item_sk; QUERY PLAN --------------------------------------------------------------------------------- Aggregate (cost=301495.25..301495.26 rows=1 width=32) -> Hash Join (cost=1635.00..213408.54 rows=11744894 width=10) Hash Cond: (inventory.inv_item_sk = item.i_item_sk) -> Seq Scan on inventory (cost=0.00..180935.94 rows=11744894 width=8) -> Hash (cost=1410.00..1410.00 rows=18000 width=10) -> Seq Scan on item (cost=0.00..1410.00 rows=18000 width=10) ● max_parallel_workers_per_gather=0
  • 26. Try a parallel query select sum(inv_quantity_on_hand*i_current_price) from inventory, item where i_item_sk=inv_item_sk; QUERY PLAN ---------------------------------------------------------------------------------------------------- Finalize Aggregate (cost=125048.98..125048.99 rows=1 width=32) -> Gather (cost=125048.55..125048.96 rows=4 width=32) Workers Planned: 4 -> Partial Aggregate (cost=124048.55..124048.56 rows=1 width=32) -> Parallel Hash Join (cost=1468.23..102026.87 rows=2936224 width=10) Hash Cond: (inventory.inv_item_sk = item.i_item_sk) -> Parallel Seq Scan on inventory (cost=0.00..92849.24 rows=2936224 width=8) -> Parallel Hash (cost=1335.88..1335.88 rows=10588 width=10) -> Parallel Seq Scan on item (cost=0.00..1335.88 rows=10588 width=10) ● max_parallel_workers_per_gather=8
  • 27. Try a parallel query select sum(inv_quantity_on_hand*i_current_price) from inventory, item where i_item_sk=inv_item_sk; ● Results – max_parallel_workers_per_gather=8: 1.0 sec – max_parallel_workers_per_gather=0: 3.8 sec ● Didn’t see anything like that in TPC-DS benchmark