beyond explain: query optimization from theory to code

56
Beyond EXPLAIN Yuto Hayamizu Ryoji Kawamichi Query Optimization From Theory To Code 2016/5/20 PGCon 2016 @ Ottawa

Upload: yuto-hayamizu

Post on 29-Jan-2018

1.774 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Beyond EXPLAIN: Query Optimization From Theory To Code

Beyond EXPLAIN

Yuto Hayamizu

Ryoji Kawamichi

Query OptimizationFrom Theory To Code

2016/5/20PGCon 2016 @ Ottawa

Page 2: Beyond EXPLAIN: Query Optimization From Theory To Code

Before Relational …

• Querying was physical

• Need to understandphysical organization

• Navigate query executionby yourself

2016/5/20 2

DEPTEMP

PROJ

“Which file is this table stored in?”

“How are records linked?”

“Which access path is fast for this table?”

“What is the best order of joining tables”

Historically …

Page 3: Beyond EXPLAIN: Query Optimization From Theory To Code

Before Relational …

• Querying was physical

• Need to understandphysical organization

• Navigate query executionby yourself

2016/5/20 3

After Relational …

DEPTEMP

PROJ

“Which file is this table stored in?”

“How are records linked?”

“Which access path is fast for this table?”

“What is the best order of joining tables”

• Querying is logical

• Physical organization is black-boxed

• Just declare what you want

Historically …

Page 4: Beyond EXPLAIN: Query Optimization From Theory To Code

Fill the Gap: Physical and Logical

2016/5/20 4

SELECT * FROM DEPT D, EMP E

WHERE E.D_ID = D.ID AND ...

• Storage I/O strategy

• Access path selection

• Join method selection

• Aggregation, sorting

• Resource allocation

• ...

Query Optimizer

Page 5: Beyond EXPLAIN: Query Optimization From Theory To Code

If optimizer perfectly fills the gap...

2016/5/20 5

We don’t need EXPLAIN

Page 6: Beyond EXPLAIN: Query Optimization From Theory To Code

Reality Is Tough

• Optimizer is NOT PERFECT• Generated plans are not always optimal, sometimes

far from optimal

• We have to take care of physical behavior

• That’s why EXPLAIN is so much explained

2016/5/20 6

Page 7: Beyond EXPLAIN: Query Optimization From Theory To Code

Go Beyond EXPLAIN

• Deeper understanding of optimization, better control of your databases

• Theoretical fundamentals of query optimization• From basic framework to cutting-edge technologies

• PostgreSQL Optimizer implementation• Focusing on basic scan and join methods

• Behavior observation with TPC-H benchmark

2016/5/20 7

Page 8: Beyond EXPLAIN: Query Optimization From Theory To Code

Outline

• Introduction

• Theory: Query Optimization Framework

• Code: PostgreSQL Optimizer

• Theory: Cutting-Edge Technologies Overview

• Summary

2016/5/20 8

Page 9: Beyond EXPLAIN: Query Optimization From Theory To Code

Query Optimization Framework

• Cost-based optimization• Plan selection with estimated execution cost

• Most of modern optimizers, including PostgreSQL, are cost-based

• Rule-based optimization• Plan selection with heuristically ranked rules

• Easy to produce the same result

• Hard to evaluate wide variety of plans

• Ex) Oracle (~10g), Hive (~0.13)

2016/5/20 9

Page 10: Beyond EXPLAIN: Query Optimization From Theory To Code

Main Challenges in Cost-based Optimization

• Cost modeling is HARD• Overhead of CPU, I/O, memory access, network, …

• Cardinality estimation is HARD• Output size of scans, joins, aggregations, …

• Join ordering search is HARD• Combinatorial explosion of join ordering and access path

• Exhaustive search is NP-hard

2016/5/20 10

Page 11: Beyond EXPLAIN: Query Optimization From Theory To Code

System-R optimizer (1979)

• “The standard”• Cost estimation with I/O and CPU

• Cardinality estimation with table statistics

• Bottom-up plan search

• Many of modern optimizers are “System-R style”• PostgreSQL, MySQL, DB2, Oracle, ...

2016/5/20 11

Page 12: Beyond EXPLAIN: Query Optimization From Theory To Code

Cost/Cardinality Estimation

• [#page fetched],[#storage API calls]are estimated with cost formula and following statistics

2016/5/20 12

CPU costI/O cost

COST = [#page fetched] + W * [#storage API calls]

weight parameter

• NCARD(T) ... the cardinality of relation T• TCARD(T) ... the number of pages in relation T• ICARD(I) ... the number of distinct keys in index I• NINDX(I) ... the number of pages in index I

Page 13: Beyond EXPLAIN: Query Optimization From Theory To Code

Bottom-up Plan Search

• Candidate plans for single relation• The cheapest access path

• N-relation join ordering search• Select the cheapest plans for each relation

• Then, find optimal join orderings of every 2-relation join

• Then, find optimal join orderings of every 3-relation join• ... until N-relation

2016/5/20 13

Page 14: Beyond EXPLAIN: Query Optimization From Theory To Code

Ex) A ⨝ B ⨝ C ⨝ D

Page 15: Beyond EXPLAIN: Query Optimization From Theory To Code

Ex) A ⨝ B ⨝ C ⨝ D

Page 16: Beyond EXPLAIN: Query Optimization From Theory To Code

Ex) A ⨝ B ⨝ C ⨝ D

Page 17: Beyond EXPLAIN: Query Optimization From Theory To Code

Ex) A ⨝ B ⨝ C ⨝ D

Page 18: Beyond EXPLAIN: Query Optimization From Theory To Code

Ex) A ⨝ B ⨝ C ⨝ D

Page 19: Beyond EXPLAIN: Query Optimization From Theory To Code

Volcano/Cascades (1993)

• Top-down transformational plan search• Yet another optimization approach• Not well known as “System-R style”, but widely used in

practiceEx) SQL Server, Apache Hive (Apache Calcite), GreenplumOrca

• Extensible optimization framework2016/5/20 19

Page 20: Beyond EXPLAIN: Query Optimization From Theory To Code

Extensible Optimization Framework

Query Optimizer Generator

• Generalized expression of query plan not limited to relational data model

• Users (optimizer developers) defines actual implementations:• Logical operator ... corresponds to relational algebra

• Physical algorithm ... corresponds to scan & join methods such as sequential scan, index scan, hash join, nested loop join

2016/5/20 20

Page 21: Beyond EXPLAIN: Query Optimization From Theory To Code

Top-down Transformational Search

• Starts from an initial “logical plan”

• Generate alternative plans with:A) Logical operator transformationB) Physical algorithm selectionC) Enforcing sorting order

2016/5/20 21

Join Select T

Join

Select R Select S

Proj

Join

Select T

JoinSelect R

Select S

Proj

Change join ordering

Join Select T

Join

Select R

Select SProj

Projection push down

Example: 3-way join with projection

Page 22: Beyond EXPLAIN: Query Optimization From Theory To Code

Top-down Transformational Search

• Starts from an initial “logical plan”

• Generate alternative plans with:A) Logical operator transformationB) Physical algorithm selectionC) Enforcing sorting order

2016/5/20 22

Join Select T

Join

Select R Select S

ProjExample: 3-way join with projection

HashJoin Select T

Join

SeqScan R SeqScan S

Proj

Join IdxScan T

Join

Select R Select S

Proj…

Page 23: Beyond EXPLAIN: Query Optimization From Theory To Code

Top-down Transformational Search

• Starts from an initial “logical plan”

• Generate alternative plans with:A) Logical operator transformationB) Physical algorithm selectionC) Enforcing sorting order

2016/5/20 23

Join Select T

Join

Select R Select S

Proj

Example: 3-way join with projection

Join Select T

Join

Sort Sort

Proj

Select R Select S

Enforce sorting order

merge join of R and S is possible now

Page 24: Beyond EXPLAIN: Query Optimization From Theory To Code

Benefits of Top-down approach

• Possible to intentionally limit search space• Effective pruning with branch-and-bound

• Limit search space with search time deadline

2016/5/20 24

Page 25: Beyond EXPLAIN: Query Optimization From Theory To Code

Cost-based Optimization Basics

Two major cost-based optimization style

• System-R• Cost modeling with statistics

• Bottom-up search

• Volcano/Cascades• Extensible optimizer generator

• Cost estimation is user’s responsibility

• Top-down transformational search

2016/5/20 25

Page 26: Beyond EXPLAIN: Query Optimization From Theory To Code

Outline

• Introduction

• Theory: Query Optimization Framework

• Code: PostgreSQL Optimizer

• Theory: Cutting-Edge Technologies Overview

• Summary

2016/5/20 26

Page 27: Beyond EXPLAIN: Query Optimization From Theory To Code

PostgreSQL Optimizer

“System-R style” optimization• Bottom-up plan search with dynamic programming• CPU and I/O operation based cost modeling

2016/5/20 27

Seq. I/O Random I/O CPU cost per tuple

Cost of single operation• seq_page_cost• random_page_cost• cpu_tuple_cost• cpu_index_tuple_cost• cpu_operator_cost• (parallel_tuple_cost)

Estimated number of each operation• Cardinality estimation with

statistics• Cost formula for each plan type

• SeqScan, IndexScan• NestLoopJoin, HashJoin,

MergeJoin, ...

Page 28: Beyond EXPLAIN: Query Optimization From Theory To Code

Detailed Look At Basic Scan Types

• Sequential scan• Efficient for accessing large potion of tables

• Index scan• Efficient for accessing a fraction of data

2016/5/20 28

Execution cost

Query selectivity

Sequential scan

Page 29: Beyond EXPLAIN: Query Optimization From Theory To Code

of SeqScan

29

= (# pages in a table)

= (# tuples in a table)

= #qual_operator= (#tuples) × (weight factor of A)

+ (#tuples) × (weight factor of B)

+ ・・・

・・・ WHERE AND AND ・・・A B

cost_seqscan()@optimizer/path/costsize.c

Page 30: Beyond EXPLAIN: Query Optimization From Theory To Code

of IndexScan

Consists of:

(A) CPU cost of searching B+-tree

(B) CPU cost of scanning index tuples in leaf pages

(C) I/O cost of leaf pages

(D) I/O cost of heap pages

(E) CPU cost of scanning heap tuples

2014/12/04 30

Page 31: Beyond EXPLAIN: Query Optimization From Theory To Code

of IndexScan

(A) B+-tree search

(B) Scanning index tuples in leaf pages

2014/12/04 31

+= log2(#index_tuples)

I/O cost of internal pagesAssumed to be always cached in the buffer

+= #qual_operator

× #leaf_pages ✕ #ituple_per_page × σ

Selectivity σComes from statistics

Page 32: Beyond EXPLAIN: Query Optimization From Theory To Code

Mackert and Lohman function(Yao function)I/O count estimation with consideration of buffer caching

of IndexScan

(C) I/O cost of index leaf pages

2014/12/04 32

+= Y(effective_cache_size, #leaf_pages)

Selectivity σ

I/O

co

un

t

Page 33: Beyond EXPLAIN: Query Optimization From Theory To Code

of IndexScan

(D) I/O cost of heap pages

(E) CPU cost of scanning heap tuples

・ Estimate the number of scanned tuples from σ

2014/12/04 33

+= α2 × #match_pages

Correlation between index and heap ordering: α

α = 0 : I/O pattern is random α = 1 : I/O pattern is sequential

+= (1-α2) × #match_tuples

Page 34: Beyond EXPLAIN: Query Optimization From Theory To Code

Detailed Look At Join Methods

• Hash join• Efficient for joining large number of records

• Usually combined with sequential scans

• Nested Loop Join• Efficient for joining small number of records

• Usually combined with index scans or small table sequential scans

2016/5/20 34

Page 35: Beyond EXPLAIN: Query Optimization From Theory To Code

of HashJoin

2014/12/04 35

Page 36: Beyond EXPLAIN: Query Optimization From Theory To Code

of HashJoin

Build phase

• Cost += Cost(inner)

2014/12/04 36

+= #qual_op × #inner_tuples

+= #inner_tuples

Hashing cost

Page 37: Beyond EXPLAIN: Query Optimization From Theory To Code

of HashJoin

2014/12/04 37

Build phase

• Cost += Cost(inner)+= #qual_op × #inner_tuples

+= #inner_tuples

Page 38: Beyond EXPLAIN: Query Optimization From Theory To Code

of HashJoin

2014/12/04 38

Build phase

• Cost += Cost(inner)+

Probe phase

• Cost += Cost(outer)+

+= #qual_op × #inner_tuples

+= #inner_tuples

+= #qual_op × (1 + #bucket_size × 0.5)× #outer_tuples

+= #match_tuples

Hashing & table lookup (bucket search) cost

Page 39: Beyond EXPLAIN: Query Optimization From Theory To Code

recordrecordrecordrecordrecordrecordrecordrecordrecordrecordrecordrecordrecordrecordrecordtuple

of HashJoin

2014/12/04 39

#buckets: 2 #buckets : 4

build

4 tuples are compared for lookup in average 2 tuples are compared for lookup

in average

0.E+00

5.E+06

1.E+07

2.E+07

2.E+07

3.E+07

3.E+07

4.E+07

4.E+07

10000 100000 1000000 10000000 100000000

Estimated cost of 2-way HashJoin

# of records

16 records

recordrecordrecordrecordrecordrecordrecordtuple

recordrecordrecordrecordrecordrecordrecordtuple

recordrecordrecordtuple

recordrecordrecordtuple

recordrecordrecordtuple

recordrecordrecordtuple

Page 40: Beyond EXPLAIN: Query Optimization From Theory To Code

of NestLoopJoin

2014/12/04 40

R⨝ S Scan R r2

r1

r3

r4

Scan S with r1

s1

s2

s3

ReScan S with r2

s1

s2

s3

outer inner

Page 41: Beyond EXPLAIN: Query Optimization From Theory To Code

of NestLoopJoin

• When #outer_tuples = 1

2014/12/04 41

R⨝ S Scan R

r1Scan S with r1

s1

s2

s3

outer inner

Cost = Cost(outer) + Cost(inner) +

+= #inner_tuples

+= #qual_operator × #inner_tuples

Page 42: Beyond EXPLAIN: Query Optimization From Theory To Code

of NestLoopJoin

• When #outer_tuples > 1

R⨝ S Scan R r2

r1

r3

r4

Scan S with r1

s1

s2

s3

ReScan S with r2

s1

s2

s3

outer inner

Cost = Cost(outer) + Cost(inner) +

+ (#outer_tuples - 1) × Cost(ReScan inner)

Higher buffer hit ratio in ReScan→ Cost of ReScan is lower than cost of IndexScan

+= #inner_tuples × #outer_tuples

+= #qual_operator × #inner_tuples × #outer_tuples

Page 43: Beyond EXPLAIN: Query Optimization From Theory To Code

See How It Works

• TPC-H Benchmark• Specification and tools for benchmarking data

warehouse workload• Open source implementation: DBT-3, pg_tpch

• Schema, data generation rules and queries

• Experiments with 100GB• Scale Factor = 100

2016/5/20 43

Page 44: Beyond EXPLAIN: Query Optimization From Theory To Code

Experimental Setup

• Dell R720xd• Xeon (2sockets, 16cores)• x24 NL-SAS HDD

• With PostgreSQL 9.5• Default cost parameter settings• SeqScan & HashJoin

• enable_seqscan = on, enable_hashjoin = onand disables other methods

• IndexScan & NestLoopJoin• enable_indexscan = on, enable_nestloop = on

and disables other methods

2016/5/20 44

Page 45: Beyond EXPLAIN: Query Optimization From Theory To Code

TPC-H Q.1: The Simplest Case

2016/5/20 45

5.E+05

5.E+06

5.E+07

5.E+08

1 10 100 1000

Estimated cost

Selectivity (l_shipdate)

IndexScan

SeqScan

10

100

1000

10000

1 10 100 1000

Execution time (sec)

Selectivity(l_shipdate)

IndexScan

SeqScan

• Good trend estimation for each method

• Estimated break-event point is errorneus• IndexScan should be more

expensive (need parameter calibration)

SELECT count(*), ... FROM lineitemWHERE l_shipdate BETWEEN [X] AND [Y]

Page 46: Beyond EXPLAIN: Query Optimization From Theory To Code

TPC-H Q.3

2016/5/20 46

Estimated cost

SeqScancustomer

SeqScanorders

SeqScanlineitem

Hash

HashJoin

HashJoin

IndexScanorders

IndexScanlineitem

NestLoop

NestLoop

IndexScancustomer

Execution time (sec)

Selectivity

1.E+00

1.E+02

1.E+04

1.E+06

1.E+08

1 10 100 1000 10000 100000 1000000

1

10

100

1000

10000

1 10 100 1000 10000 100000 1000000

Selectivity

NestLoop+IndexScan

HashJoin+SeqScan

NestLoop+IndexScan

HashJoin+SeqScan Similar result as in Q.1

• Good trend estimation for each

• Erroneous break-event point without parameter calibration

SELECT count(*), ...FROM customer, orders, lineitemWHERE c_custkey = o_custkey AND

o_orderkey = l_orderkey ANDc_custkey < [X] ANDc_mktsegment = ‘MACHINERY’;

Page 47: Beyond EXPLAIN: Query Optimization From Theory To Code

100

1000

10000

100000

1 10 100 1000 10000

More Complex CaseTPC-H Q.4: Semi-Join Query

• Plan selection for semi-join tend to be unstable

2016/5/20 47Selectivity

1.E+05

1.E+06

1.E+07

1.E+08

1.E+09

1 10 100 1000 10000

HashJoin+SeqScan

NestLoop+IndexScan

Estimated cost

Execution time (sec)

HashJoin+SeqScan

NestLoop+IndexScan SELECT count(*), ...FROM ordersWHERE

o_orderdate >= ‘1995-01-01’ ANDo_orderdate < ‘1995-01-01’

+ interval ‘3 month’ ANDEXISTS(

SELECT * FROM lineitemWHERE l_orderkey = o_orderkeyAND l_commitdate < l_receiptdate)

Selectivity

Page 48: Beyond EXPLAIN: Query Optimization From Theory To Code

1.E+06

1.E+07

1.E+08

1.E+09

1.E+10

1.E+11

1.E+00 1.E+02 1.E+04 1.E+06 1.E+08

More Complex CaseTPC-H Q.22: Anti-Join Query

• Difficulties in overall cost trend estimation

2016/5/20 48

Selectivity

1

10

100

1000

10000

1.E+00 1.E+02 1.E+04 1.E+06 1.E+08

Estimated cost

Execution time (sec)

Selectivity

HashJoin+SeqScan

NestLoop+IndexScan

HashJoin+SeqScan

NestLoop+IndexScan

SELECT count(*), ... FROM supplier, lineitem l1, orders, nation WHERE s_suppkey = l1.l_suppkey AND

o_orderkey = l1.l_orderkey ANDo_orderstatus = 'F' ANDl1.l_receiptdate > l1.l_commitdate AND

EXISTS (SELECT * FROM lineitem l2WHERE l2.l_orderkey = l1.l_orderkeyAND l2.l_suppkey <> l1.l_suppkey)

AND NOT EXIST (SELECT * FROM lineitem l3WHERE l3.l_orderkey = l1.l_orderkeyAND l3.l_suppkey <> l1.l_suppkeyAND l3.l_receiptdate > l3.l_commitdate)

AND s_nationkey = n_nationkeyAND n_name = ‘JAPAN'

Page 49: Beyond EXPLAIN: Query Optimization From Theory To Code

Summary: PostgreSQL Optimizer• Detailed look at cost modeling of basic methods

• SeqScan, IndexScan

• HashJoin, NestedLoopJoin

• Observation with TPC-H benchmark• Good cost trend estimation for simple join queries

• Erroneous cheapest plan selection without parameter tuning

• Difficulties with semi-join and anti-join queries

2016/5/20 49

Page 50: Beyond EXPLAIN: Query Optimization From Theory To Code

Outline

• Introduction

• Theory: Query Optimization Framework

• Code: PostgreSQL Optimizer

• Theory: Cutting-Edge Technologies Overview

• Summary

2016/5/20 50

Page 51: Beyond EXPLAIN: Query Optimization From Theory To Code

Cutting-Edge Technologies

• Traditional optimization was a “closed” problem

• “Rethink the contract” ー Surajit Chaudhuri

• Feedback from previous execution

• Dynamic integration with execution

2016/5/20 51

cardinalityestimation

cost model

plan spaceenumeration

(SQL) query plan

Page 52: Beyond EXPLAIN: Query Optimization From Theory To Code

Mid-query Re-optimization

• Detects sub-optimality of executing query plan• Query plans are annotated for later estimation

improvement• Runtime statistics collection

• Statistics collector probes are inserted into operators of executing query plan

• Plan modification strategy• Discard current execution and re-optimize whole plan• Re-optimizer only subtree of the plan that are not

started yet• Save partial execution result and generate new SQL

using the result

2016/5/20 52

[N. Kabra et.al., SIGMOD’98]

Page 53: Beyond EXPLAIN: Query Optimization From Theory To Code

Plan Bouquet

• Generate a set of plans for each selectivity range

• Estimation improvement with runtime statisticscollection

• Evaluation with PostgreSQL

2016/5/20 53

[A. Dutt et.al., SIGMOD’14]

Page 54: Beyond EXPLAIN: Query Optimization From Theory To Code

Bounding Impact of Estimation Error

• “Uncertainty” analysis of cost estimation• Optimality sensitivity to estimation error

• Execute partially to reduce uncertainty

2016/5/20 54

[T. Neumann et.al., BTW Conf ‘13]

Page 55: Beyond EXPLAIN: Query Optimization From Theory To Code

Outline

• Introduction

• Theory: Query Optimization Framework

• Code: PostgreSQL Optimizer

• Theory: Cutting-Edge Technologies Overview

• Summary

2016/5/20 55

Page 56: Beyond EXPLAIN: Query Optimization From Theory To Code

Summary

• Cost-based optimization framework• System-R style bottom-up optimization

• Volcano style top-down optimization

• Detailed look at PostgreSQL optimizer• Cost modeling of basic scan and join method

• Experiment with TPC-H benchmark

• Brief overview of cutting-edge technologies

2016/5/20 56