SlideShare una empresa de Scribd logo
1 de 106
Visual SQL Tuning (VST)
Kyle Hailey
http://dboptimizer.com
SQL Tuning
Methodology
1. Find: Problem SQL
2. Study: SQL Execution Plan
3. Fix: How ?
Step 1 : Find “bad” SQL
1. Users complain
2. High Resources
3. Monitoring
Step 2: Get Explain Plan
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows |
---------------------------------------------------------------------------------------------
| 1 | HASH GROUP BY | | 1 | 1 | 1 |
|* 2 | FILTER | | 1 | | 1909 |
|* 3 | TABLE ACCESS BY INDEX ROWID | PS_RETROPAYPGM_TBL | 1 | 1 | 3413 |
| 4 | NESTED LOOPS | | 1 | 165 | 6827 |
|* 5 | HASH JOIN | | 1 | 165 | 3413 |
|* 6 | HASH JOIN | | 1 | 165 | 3624 |
| 7 | TABLE ACCESS BY INDEX ROWID | WB_JOB | 1 | 242 | 2895 |
| 8 | NESTED LOOPS | | 1 | 233 | 2897 |
| 9 | TABLE ACCESS BY INDEX ROWID| PS_PAY_CALENDAR | 1 | 1 | 1 |
|* 10 | INDEX RANGE SCAN | PS0PAY_CALENDAR | 1 | 1 | 1 |
|* 11 | INDEX RANGE SCAN | WBBJOB_B | 1 | 286 | 2895 |
|* 12 | TABLE ACCESS FULL | WB_RETROPAY_EARNS | 1 | 27456 | 122K|
| 13 | TABLE ACCESS FULL | PS_RETROPAY_RQST | 1 | 13679 | 13679 |
|* 14 | INDEX RANGE SCAN | PS#RETROPAYPGM_TBL | 3413 | 1 | 3413 |
| 15 | SORT AGGREGATE | | 1791 | 1 | 1791 |
| 16 | FIRST ROW | | 1791 | 1 | 1579 |
|* 17 | INDEX RANGE SCAN (MIN/MAX) | WB_JOB_F | 1791 | 1 | 1579 |
| 18 | SORT AGGREGATE | | 1539 | 1 | 1539 |
| 19 | FIRST ROW | | 1539 | 1 | 1539 |
|* 20 | INDEX RANGE SCAN (MIN/MAX) | WB_JOB_G | 1539 | 1 | 1539 |
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(("B"."EFFDT"= AND "B"."EFFSEQ"=))
3 - filter("E"."OFF_CYCLE"="A"."PAY_OFF_CYCLE_CAL")
5 - access("D"."RETROPAY_SEQ_NO"="C"."RETROPAY_SEQ_NO")
6 - access("C"."EMPLID"="B"."EMPLID" AND "C"."EMPL_RCD#"="B"."EMPL_RCD#")
10 - access("A"."RUN_ID"='PD2' AND "A"."PAY_CONFIRM_RUN"='N')
11 - access("B"."COMPANY"="A"."COMPANY" AND "B"."PAYGROUP"="A"."PAYGROUP")
12 - filter(("C"."RETROPAY_PRCS_FLAG"='C' AND "C"."RETROPAY_LOAD_SW"='Y'))
14 - access("E"."RETROPAY_PGM_ID"="D"."RETROPAY_PGM_ID")
17 - access("F"."EMPLID"=:B1 AND "F"."EMPL_RCD#"=:B2 AND "F"."EFFDT"<=:B3)
20 - access("G"."EMPLID"=:B1 AND "G"."EMPL_RCD#"=:B2 AND "G"."EFFDT"=:B3)
PARSING IN CURSOR #2 len=53 dep=0 uid=61 oct=3
lid=61 tim=1151519905950403 hv=2296704914
ad='4e50010c'
SELECT 'Hello, world; today is ' || SYSDATE FROM dual
END OF STMT
PARSE
#2:c=4000,e=1540,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,
tim=1151519905950397
BINDS #2:
EXEC
#2:c=0,e=58,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1
151519906034782
WAIT #2: nam='SQL*Net message to client' ela= 2 driver
id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1151519906034809
FETCH
#2:c=0,e=29,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=1
151519906034864
WAIT #2: nam='SQL*Net message from client' ela= 215
driver id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1151519906035133
FETCH
#2:c=0,e=1,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=11
51519906035165
WAIT #2: nam='SQL*Net message to client' ela= 1 driver
id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1151519906035188
WAIT #2: nam='SQL*Net message from client' ela= 192
driver id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1151519906035400
STAT #2 id=1 cnt=1 pid=0 pos=1 obj=0 op='FAST
DUAL (cr=0 pr=0 pw=0 time=3 us)
Trace fie
Step 3: ???
Methodology
• Identify Slow Queries
• Look at Execution Plan
• Fix
Fix
1. Analyze stats
2. Go to step 1
WTF??
Fix If you are lucky, analyze for
1. Column histograms
2. Missing or better Indexes
Explain Plan: Like Directions
Where is the Map?
Explain Plan: Like Directions
Where is the Map?
Explain Plan: Like Directions
Where is the Map?
SQL Tuning
1. Two Table Join
2. Multi-Table Join
3. Create Map
4. Design Methodology
5. Examples
How to Join two tables?
1. Which table to start with
• Hardest step ?
2. What Indexes to use
3. What type of join to use HJ, NL
Design options:
• Partitions
• IOT
• Bitmap indexes
• Hash cluster
• Materialized views
• etc
Two Table Join
1. Index exist?
2. Type of Relation
• One to One
• One to Many
• Many to Many
3. Special Cases
• Outer Joins
• Not Exists
Table Join Order
select *
from a, b
where
a.id = b.id
A B
id dataid data
Every row visits Every row
Work= A-rows x B-rows (8 x 4 )
HJ would optimizes to simulate index lookup
If No Index then (NL) order doesn’t matter
2 Table join, with indexes
select *
from a, b
where
a.id = b.id
A B
id data
data id
With Indexes
Start with the least rows
8
2 Table join, with indexes
select *
from a, b
where
a.id = b.id
A B
id data
data id
With Indexes
Start with the least rows
B A
data id id data
8 4
2 table join - filters
select *
from a, b
where
a.id = b.id -- join
and a.field = ‘val a’ -- filter a
and b.field = ‘val b’ -- filter b
A
B
id data
data id
Start on table with least rows after filter
2
3
Two Table Joins – looks simple
A B
Inner Join
Two Table Joins
A B
A B
A B
Left join B B(+)
Not exists B
Inner Join
Two Table Joins
A B
A B
A B
A B
A B
Left join B B(+)
Not exists B
Right join B A(+)
Not Exists A
Inner Join
Two Table Joins
A B
A B
A B
A B A B
A B
A B
Left join B B(+)
Not exists B
Full outer (union) Right join B A(+)
Not Exists AUnion of Not Exists
Inner Join
Doesn’t tell the whole
story
Missing « amplifications »
One to One - intersection
1
2
1
2
1 1
2 2
A B
A B
BA
MAP
One to Many - projection
1
1
2
2
1
2
1 1
1 1
2 2
2 2
B
A
A B
A B
MAP
1
1
1
1
1
1
Many to Many - amplification
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
A B
A
B
A B
MAP
rA*rB
-------------------------
min(ndv(A),ndv(B))
Two Table Joins
A B A B
Left join B B(+) Right join B A(+)
A B
MAP MAP
A Bo o
Two Table Joins
A B
Left join B B(+)
Color nodes that return no data
Select a.* from a, b where b.field(+) = a.field;
A B
V
A B
V
Multiplier
o
o ?
o
Pointless – join on
B has no affect if
no B cols selected
V
Pointless – join on
B has no affect or
multiplies rows from
A if no B cols
selected
Exists
SELECT *
FROM dept d WHERE exists ( SELECT null FROM
emp e WHERE e.deptno=d.deptno);
SELECT *
FROM dept d WHERE d.deptno in
( SELECT deptno FROM emp e );
Select dept.* from emp, dept where emp.deptno=
dept.deptno; /* can get duplicates */
dept empE
MAP
Not Exists
SELECT *
FROM dept d WHERE not exists ( SELECT
null FROM emp e WHERE e.deptno=d.deptno);
SELECT *
FROM dept d WHERE d.deptno not in ( SELECT
deptno FROM emp e and deptno is not null );
SELECT dept.* FROM dept LEFT OUTER JOIN emp
ON dept.deptno = emp.deptno WHERE emp.deptno IS
NULL;
dept empN
MAP
Two Table Join
1. Where to start
1. Generally start with the least rows after filtering with
predicate
2. Drawing Map:
– One to One / One to Many / Many to Many
– Outer Joins / Not Exists
Now , three table joins:
A BNA Bo
BA A B A B
Three table join
1 row4 rows8 rows
Ex) 1 customer 4 orders, each order has 2 order_lines each
1 row1 row1 row
order_lines orders customer
Join direction
Join direction
Three table join
order_lines orders customer
F
Where
order_lines.field = value
A Filter on order_lines is going to eliminate work
on orders and customers, if we start at order_lines
Three table join
order_lines orders customer
F
Where
order_lines.field = value
Starting with a filter on order_lines is going to eliminate work
Three table join
order_lines orders customer
F
Where
orders.field = value
Starting with a Filter on orders is going to eliminate work
Then Join to customers => keeps the number of rows the same
1
2
Three table join
order_lines orders customer
F
Where
customer.field = value
Starting on a filter on customer is going to eliminate work
Three table join
order_lines orders customer
FFF
What if a filter on all three?
Choose the one that filter’s the highest
percent of the table.
100% * (select count(*) from TAB where condition)
---------------------------
(select count(*) from Tab)
4 or more table join
Oracle can only join one table in at a time.
Oracle can’t (normally) join two different sub-branches
Put it all together : VST
1. Tables
– drawn as nodes
2. Joins :
– drawn map connector lines
• One-to-one, one-to-many, many-to-many
• Exists, not exists, outer joins
3. Filters
– mark on each table with filter in where clause
35 6/22/2013
How to VST: Tables and Joins
SELECT C.Phone_Number, C.Honorific, C.First_Name, C.Last_Name,
C.Suffix, C.Address_ID, A.Address_ID, A.Street_Address_Line1,
A.Street_Address_Line2, A.City_Name, A.State_Abbreviation,
A.ZIP_Code, OD.Deferred_Shipment_Date, OD.Item_Count,
ODT.Text, OT.Text, P.Product_Description, S.Shipment_Date
FROM Orders O, Order_Details OD, Products P, Customers C, Shipments S,
Addresses A, Code_Translations ODT, Code_Translations OT
WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%'
AND UPPER(C.First_Name) LIKE :First_Name||'%'
AND OD.Order_ID = O.Order_ID
AND O.Customer_ID = C.Customer_ID
AND OD.Product_ID = P.Product_ID(+)
AND OD.Shipment_ID = S.Shipment_ID(+)
AND S.Address_ID = A.Address_ID(+)
AND O.Status_Code = OT.Code
AND OT.Code_Type = 'ORDER_STATUS'
AND OD.Status_Code = ODT.Code
AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'
AND O.Order_Date > :Now - 366
ORDER BY C.Customer_ID, O.Order_ID DESC, S.Shipment_ID, OD.Order_Detail_ID;
Tables
Orders O,
Order_Details OD,
Products P,
Customers C,
Shipments S,
Addresses A,
Code_Translations ODT,
Code_Translations OT
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID =
S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
Dan Tow – SQL TUNING
Filters
WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%'
AND UPPER(C.First_Name) LIKE :First_Name||'%'
AND OT.Code_Type = 'ORDER_STATUS'
AND O.Order_Date > :Now – 366
AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'
Layout tables and connections
Tables
Orders O,
Order_Details OD,
Products P,
Customers C,
Shipments S,
Addresses A,
Code_Translations ODT,
Code_Translations OT
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID = S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
F
S
A
OD
P
ODTC
OT
O
Dan Tow – SQL TUNING
Unstructured
Copyright 2006
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID = S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
Neater, but can you do anything with it?
What’s the optimal execution path?
S
A
OD
P ODT
C
OT
O
Parents and Children
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID = S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
ODT
OD
P
CA
OS
OT
Primary Key (unique index)
No index or non-unique
Master
Detail
Structure
the
tree
VST – filters and best path
 Filters help determine best path
Parent
Child
Parent
Child
Concept:
1. Start at most selective filter
2. Join down first, before joining upwards
Filters
WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%'
AND UPPER(C.First_Name) LIKE :First_Name||'%'
AND OT.Code_Type = 'ORDER_STATUS‘
AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'
AND O.Order_Date > :Now – 366 F
F
30%
0.02%
100% * (select count(*) from TAB where condition)
---------------------------
(select count(*) from Tab)
S
A
OD
P ODT
C OT
O
F
F
30%
0.02%
S
A
OD
P ODT
C OT
O
VST – best path
F
F
F
F
30%
0.02%
S
A
OD
P ODT
C OT
O
VST – best path
F
F
/*+ Leading (C,O,OT, OD ) */
Dan Tow
SQL TUNING
T9
.6
T4
T1
.3
M
T2
T6 T7
.001
T10
.5
T11 T12
.5
T13
.2
T3
T8
.7
T14
.9
T15
.8
T16
T5
T9
.6
T4
T1
.3
M
T2
T6 T7
.001
T10
.5
T11 T12
.5
T13
.2
T3
T8
.7
T14
.9
T15
.8
T16
T5
T7 -> T13
T9
.6
T4
T1
.3
M
T2
T6
T10
.5
T11 T12
.5
T3
T8
.7
T14
.9
T15
.8
T16
T5
T7 -> T13
T7 ->T13
T9
.6
T4
T1
.3
M
T2
T6
T10
.5
T11
T3
T8
.7
T14
.9
T15
.8
T16
T5
T7 -> T13
T7 ->T13
-> T12
T9
.6
T4
T1
.3
M
T6
T10
.5
T11
T3
T8
.7
T14
.9
T15
.8
T16
T5
T7 -> T13
T7 ->T13
-> T12 ->
T2
T9
.6
T4
T1
.3
M
T10
.5
T11
T3
T8
.7
T14
.9
T15
.8
T16
T5
T7 -> T13
T7, T13, T12
, T2 , T6
T9
.6
T4
T1
.3
M
T11
T3
T8
.7
T14
.9
T15
.8
T16
T5
T7 -> T13
T7, T13, T12
, T2 , T6, T10
T9
.6
T4
T1
.3
M
T3
T8
.7
T14
.9
T15
.8
T16
T5
T7 -> T13
T7, T13, T12
, T2 , T6,
T10, T11
T9
.6
T4
T1
.3
M
T3
T8
.7
T14
.9
T16
T5
T7 -> T13
T7, T13, T12
, T2 , T6,
T10, T11,
T15
T9
.6
T4
T1
.3
M
T3
T8
.7
T14
.9
T5
T7 -> T13
T7, T13, T12
, T2 , T6,
T10, T11,
T15, T16
T9
.6
T4
T1
.3
T3
T8
.7
T14
.9
T5
T7 -> T13
T7, T13, T12
, T2 , T6,
T10, T11,
T15, T16, M
T9
.6
T4
T3
T8
.7
T14
.9
T5
T7 -> T13
T7, T13, T12
, T2
, T6, T10, T1
1, T15, T16,
M, T1
T9
.6
T3
T8
.7
T14
.9
T5
T7 -> T13
T7, T13, T12
, T2 , T6,
T10, T11,
T15, T16, M,
T1, T4
T3
T8
.7
T14
.9
T5
T7 -> T13
T7, T13, T12
, T2 , T6,
T10, T11,
T15, T16, M,
T1, T4,T9
T5
T7 -> T13
T7, T13, T12
, T2 , T6,
T10, T11,
T15, T16, M,
T1,
T4,T9,T3,T8T
14
T7, T13, T12
, T2 , T6,
T10, T11,
T15, T16, M,
T1,
T4,T9,T3,T8T
14, T5
Why not Guess ?
For 17 table join, there are 355 Trillion combinations
Cartesian
SELECT
A.BROKER_ID BROKER_ID,
A.BROKER_LAST_NAME BROKER_LAST_NAME,
A.BROKER_FIRST_NAME BROKER_FIRST_NAME,
A.YEARS_WITH_FIRM YEARS_WITH_FIRM,
C.OFFICE_NAME OFFICE_NAME,
SUM (B.BROKER_COMMISSION)
TOTAL_COMMISSIONS
FROM
BROKER A,
CLIENT_TRANSACTION B,
OFFICE_LOCATION C,
INVESTMENT I
WHERE
A.BROKER_ID = B.BROKER_ID AND
A.OFFICE_LOCATION_ID =
C.OFFICE_LOCATION_ID
GROUP BY
A.BROKER_ID,
A.BROKER_LAST_NAME,
A.BROKER_FIRST_NAME,
A.YEARS_WITH_FIRM,
C.OFFICE_NAME;
Implied Cartesian
select
c.client_first_name, c.client_last_name,
ct.action, ct.price,
b.broker_last_name, b.broker_first_name,
o.office_name
from
client_transaction ct,
client c,
broker b,
office_location o
where
ct.price > 100
and b.broker_id=ct.broker_id
and c.broker_id = b.broker_id
and o.office_location_id = b.office_location_id
Diagram work for Many to One
What about many to many?
Unstructured
Copyright 2006
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID = S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
S
A
OD
P ODT
C OT
O
S
A
OD
P ODT
C
OT
O
Many-to-One vs Many-to-Many
Predicate Filter
1
2
3
B -> C -> A go to A or C?
Now what?
Adding Constraints
SELECT COUNT (*)
FROM
b,
c,
a
WHERE
b.val2 = 100 AND
a.val1 = b.id AND
b.val1 = c.id;
58 logical reads
alter table c add constraint c_pk unique (id);
alter table b add constraint b_pk unique (id);
7 logical reads
10053
B
C
$: 4
#: 1
$: 5428
#: 59999
A
$: 92
#: 999
B A C
B C A
C A B
C B A
A C B
A B C
Table: A Alias: A
Best:: AccessPath: TableScan
Cost: 92.18 Degree: 1
Resp: 92.18 Card: 999.00
Best:: AccessPath: IndexRange
Index: B_V2
Cost: 4.00 Degree: 1
Resp: 4.00 Card: 1.00
Best:: AccessPath: IndexFFS
Index: C_PK_CON
Cost: 35.57 Degree: 1
Resp: 35.57 Card: 59999.00
Join order[1]: B[B]#0 A[A]#1 C[C]#2
***************
Now joining: A[A]#1
***************
Best:: JoinMethod: NestedLoop
Cost: 6.00 Degree: 1 Resp: 6.00 Card: 1.00 Bytes: 16
***************
Now joining: C[C]#2
***************
Best:: JoinMethod: NestedLoop
Cost: 6.00 Degree: 1 Resp: 6.00 Card: 1.00 Bytes: 21
***********************
Best so far: Table#: 0 cost: 4.0020 card: 1.0000 bytes: 12
Table#: 1 cost: 6.0031 card: 1.0000 bytes: 16
Table#: 2 cost: 6.0032 card: 1.0000 bytes: 21
alter session set events='10053 trace name context forever';
No Unique Constraint
A
$: 75
#: 999
B A C
NL: $: 10
#: 1
B A
C
$: 6$: 4
#: 1
$: 8
NL:$: 18
#: 1
B C A
NL: $: 10
#: 1
B C
A
$: 6.01$: 4
#: 1
$: 8
C A B
C B A A C B A B C
A
$: 75
#: 999
C
$: 5428
#: 59999
C
$: 5428
#: 59999
A
B C B
Join order[6]: C[C]#2 A[A]#1 B[B]#0
Join order aborted: cost > best plan cost
$
HJ: $: 10
#: 1
Unique Constraint
A
$: 75
#: 999
B A C
NL: $: 10
#: 1
B A
C
$: 6$: 4
#: 1
$: 8
NL:$: 18
#: 1
B C A
NL: $: 10
#: 1
B C
A
$: 5$: 4
#: 1
$: 7
C A B
C B A A C B A B C
A
$: 75
#: 999
C
$: 5428
#: 59999
C
$: 5428
#: 59999
A
B C B
Join order[6]: C[C]#2 A[A]#1 B[B]#0
Join order aborted: cost > best plan cost
$
HJ: $: 10
#: 1
NL:$: 16
#: 1
Diagraming: what to do with many to many
• With many to many we don’t know which direction to go
• How an we improve the diagram?
• -> Add two table join result set sizes
Join sizes
Join Sizes
Use the Join
sizes to
determine path
of least
resistance
Look at 3 queries
• Query 1 runs more than 24 hours
• Query 2 outer joins and scalar sub-queries
• Query 3 create path not available to Oracle
Query 1 : Over 24 hours to runSELECT
A0.zuchinis,
A0.brocoli,
C0.Oranges
FROM
(
SELECT
A1.planted_date,
A1.pears,
A1.zuchinis,
A1.brocoli
FROM
FOO.A A1,
(
SELECT
zuchinis,
brocoli
FROM FOO.A A2
WHERE
pears = 'M' AND
planted_date + 0 >= ADD_MONTHS ((SELECT
MAX (planted_date)
FROM FOO.B B1
WHERE
pears = 'M'
),
- 11)
GROUP BY
zuchinis,
brocoli
HAVING COUNT (*) = 12
)
i2
WHERE
A1.planted_date = (SELECT
MAX (planted_date)
FROM FOO.B B2
WHERE
pears = 'M'
) AND
A1.pears = 'M' AND
A1.zuchinis = i2.zuchinis (+) AND
A1.brocoli = i2.brocoli (+)
UNION
SELECT
A4.planted_date,
A4.pears,A4.zuchinis,A4.brocoli
FROM FOO.A A4
WHERE
A4.planted_date >'01-OCT-08' and A4.planted_date <'03-OCT-08' AND
A4.pears = 'D' AND
A4.green_beans = '1'
AND NOT EXISTS (SELECT
*
FROM FOO.A A5
WHERE
pears = 'M' AND
planted_date = (SELECT
MAX (planted_date)
FROM FOO.B B3
WHERE
pears = 'M'
) AND
A4.zuchinis = A5.zuchinis AND
A4.brocoli = A5.brocoli)
)
b,
FOO.A A0,
FOO.C C0,
FOO.D D0,
FOO.E E0
WHERE
A0.planted_date >'01-OCT-08' and
A0.planted_date <'03-OCT-08' AND
A0.pears = 'D' AND
A0.green_beans = '1' AND
A0.zuchinis = b.zuchinis AND
A0.brocoli = b.brocoli AND
A0.planted_date = C0.planted_date AND
A0.pears = C0.pears AND
A0.zuchinis = C0.zuchinis AND
A0.brocoli = C0.brocoli AND
A0.planted_date = D0.planted_date AND
A0.pears = D0.pears AND
A0.harvest_size = D0.harvest_size AND
C0.Oranges = D0.Oranges AND
C0.apples = D0.apples AND
(D0.lemons = 0 OR
D0.lemons IS NULL) AND
A0.planted_date = E0.planted_date AND
A0.pears = E0.pears AND
A0.harvest_size = E0.harvest_size AND
C0.Oranges = E0.Oranges AND
C0.apples = E0.apples AND
(E0.lemons = 0 OR
E0.lemons IS NULL)
ORDER BY
A0.zuchinis, A0.brocoli;
Visual SQL Diagram
9 secs
Default vs Tuned
Default
Tuned
Where is the map?
Comparing Plans : 24 hours to 5 mins
NL
NL
NL
NL
HJ
HJ
NL
NL
Q2
SELECT CASE WHEN M.NYC IS NULL THEN (SELECT /*+ qb_name(qb1) */ MAX (Kona)
FROM foo.F
WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND Argentina = TRIM ('D') AND Norway = F_OUTER.Norway
ELSE M.NYC END AS NYC,
CASE WHEN F_OUTER.Perth IS NULL THEN NULL
ELSE (SELECT /*+ qb_name(qb2) */ Georgia FROM foo.P
WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND Argentina = TRIM ('D') AND Paris = F_OUTER.Perth)
END AS richard,
CASE WHEN F_OUTER.Aruba IS NULL THEN NULL
ELSE (SELECT /*+ qb_name(qb3) */ Georgia FROM foo.P
WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND Argentina = TRIM ('D') AND Paris = F_OUTER.Aruba)
END AS Jody,
CASE WHEN F_OUTER.Portland IS NULL THEN NULL
ELSE (SELECT /*+ qb_name(qb4) */ Georgia FROM foo.P
WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND Argentina = TRIM ('D') AND Paris = F_OUTER.Portland)
END AS Tom
FROM foo.F F_OUTER, foo.M , foo.J , foo.N ,
(SELECT /*+ qb_name(qb5) */ H.SF, Oregon, H.Haiti, K.Bermuda, L.Denmark
FROM (foo.H LEFT OUTER JOIN foo.K
ON H.harvest_date = K.harvest_date
AND H.Argentina = K.Argentina AND H.SF = K.SF
AND K.Dallas = '001')
LEFT OUTER JOIN FOo.L
ON H.harvest_date = L.harvest_date
AND H.Argentina = L.Argentina AND H.SF = L.SF
WHERE H.harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND H.Argentina = TRIM ('D')) extra
WHERE F_OUTER.harvest_date = M.harvest_date(+)
AND F_OUTER.Argentina = M.Argentina(+)
AND F_OUTER.Norway = M.Norway(+)
AND M.Norway(+) = M.Texas(+)
AND F_OUTER.harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND F_OUTER.Argentina = TRIM ('D')
AND M.harvest_date(+) = to_date('08/10/2008','dd/mm/yyyy')
AND M.Argentina(+) = TRIM ('D')
AND F_OUTER.Norway = F_OUTER.Hawaii
AND F_OUTER.harvest_date = J.harvest_date(+)
AND F_OUTER.Argentina = J.Argentina(+)
AND F_OUTER.Norway = J.Texas(+)
AND J.harvest_date(+) = to_date('08/10/2008','dd/mm/yyyy')
AND J.Argentina(+) = TRIM ('D')
AND F_OUTER.Iraq = extra.SF(+)
AND F_OUTER.harvest_date = N.harvest_date(+)
AND F_OUTER.Argentina = N.Argentina(+)
AND F_OUTER.Norway = N.Hawaii(+)
AND N.Jordon(+) = '0'
/
Scalar Sub-queries
12
825
845682348
Q2
The subqueries in the select clause look like
select CASE WHEN F.f1 IS NULL
THEN NULL
ELSE (SELECT X.f2
FROM X
WHERE code_vl = F.f1)
END AS f0
from F;
and should be merged into the query like:
select CASE WHEN F.f1 IS NULL
THEN NULL
ELSE ( X.f2)
END AS f0
from F , X
where code_vl(+) = F.f1;
select CASE WHEN F.f1 IS NULL
THEN NULL
ELSE (SELECT X.f2
FROM X
WHERE code_vl = F.f2)
END AS f0
from F;
select CASE WHEN F.f1 IS NULL
THEN NULL
ELSE ( X.f2)
END AS f0
from F , X
where code_vl(+) = F.f1;
Q3
SELECT DISTINCT *
FROM
FOO.a a, FOO.c c, FOO.d d, FOO.g g
WHERE
a.planted_date > '01-OCT-08' AND
a.planted_date < '03-OCT-08' AND
a.pears = 'D' AND a.green_beans = '1' AND
a.planted_date = c.planted_date AND
a.pears = c.pears AND
a.zuchinis = c.zuchinis AND
a.brocoli = c.brocoli AND
a.planted_date = d.planted_date AND
a.pears = d.pears AND
a.harvest_size = d.harvest_size AND
c.oranges = d.oranges AND
c.apples = d.apples AND
(d.lemons = 0 OR d.lemons IS NULL) AND
a.planted_date = g.planted_date AND
a.pears = g.pears AND
a.harvest_size = g.harvest_size AND
c.oranges = g.oranges AND
c.apples = g.apples AND
(g.lemons = 0 OR g.lemons IS NULL) AND
a.zuchinis = '0236' AND
d.apples = g.apples AND
d.oranges = g.oranges
ORDER BY a.zuchinis, a.brocoli;
Q3: Transitivity
81 6/22/2013
1,126,402
7,136,362
Q3
82 6/22/2013
SELECT * FROM
(
SELECT /*+ NO_MERGE */ c.apples, c.oranges, a.harvest_size
FROM a, c
WHERE
a.planted_date = TO_DATE ('02/10/2008', 'dd/mm/yyyy') AND
a.pears = 'D' AND
a.green_beans = '1' AND
a.planted_date = c.planted_date AND
a.pears = c.pears AND
a.zuchinis = c.zuchinis AND
a.brocoli = c.brocoli AND
a.zuchinis = '0236'
) X,
(
SELECT /*+ NO_MERGE */ d.apples, d.oranges, d.harvest_size
FROM d, g
WHERE
d.planted_date = TO_DATE ('02/10/2008', 'dd/mm/yyyy') AND
g.planted_date = TO_DATE ('02/10/2008', 'dd/mm/yyyy') AND
g.apples = d.apples AND
d.oranges = g.oranges AND
d.pears = 'D' AND
g.pears = 'D' AND
g.pears = d.pears AND
g.harvest_size = d.harvest_size AND
(d.lemons = 0 OR d.lemons IS NULL) AND
(g.lemons = 0 OR g.lemons IS NULL)
) Y
WHERE
X.oranges = Y.oranges AND
X.apples = Y.apples AND
X.harvest_size = Y.harvest_size;
This final version runs in
elapsed 0.33 secs and 12K logical reads
down from an original
elapsed 4.5 secs and 1M logical reads
HINTS
• Leading (tab_alias , table_alias … ) 10g (9i use ORDERED, not as good )
• USE_NL (table_alias) – Inner Table (2cd in xpla not driving)
• USE_HASH (table_alias) – probe into (1st in xplan)
• INDEX (tab_alias index_name)
• NO_MERGE
Oracle first decides join order then join type
(example http://www.adp-gmbh.ch/blog/2008/01/17.php)
83 6/22/2013
F
F
30%
0.02%
S
A
OD
P ODT
C OT
O
Leading Hint, use table alias (not table)
F
F
/*+ Leading (C,O,OT, OD ) */
HJ
X
Y Hash X
results
Y
NL
X
Y Y
X
select /*+ LEADING(X,Y) USE_HASH(Y) */ *
select /*+ LEADING(X,Y) USE_NL(Y) */ *
What tools to use to create VST diagrams?
• Paper
– Modifications messy and difficult
• PowerPoint
– Can move things around
– Sticky connectors
– Easy to modify
• DB Optimizer
– Automatic and still modifiable
VST Steps Summary
1.Diagram tables
2.Draw connectors for each join
3.Calculate filter ratio
1.If many to many then
calculate two table join sizes
Execution Path
• Start at the most selective join filter
• Join to keep the running result set size small
Many to Many relationships = problems
6/22/2013
Parent
Child
Parent
Child
F
F
30%
0.02%
S
A
OD
P ODT
C OT
O
SELECT
O.ORDER_ID,
LINE_ITEM_ID,
PRODUCT_ID,
UNIT_PRICE,
QUANTITY,
ORDER_MODE,
ORDER_STATUS,
ORDER_TOTAL,
SALES_REP_ID,
PROMOTION_ID,
C.CUSTOMER_ID,
CUST_FIRST_NAME,
CUST_LAST_NAME,
CREDIT_LIMIT,
CUST_EMAIL,
ORDER_DATE
FROM
ORDERS O,
ORDER_ITEMS OI,
CUSTOMERS C
WHERE
O.ORDER_ID = OI.ORDER_ID AND
O.CUSTOMER_ID = C.CUSTOMER_ID AND
O.ORDER_STATUS <= 4
VST vs Explain Plan
MJ F
F
Graphical Explain Plan
Visual SQL Tuning (VST)
Table Sizes
Join Sizes
Filter Ratios
Exists
Execution Plan
Summary
1.Database - AAS
– Profile database
– Use wait interface and graphics
– Identify machine, application, database or SQL
2.SQL - VST
– Indexes, stats, execution path
– Visual SQL Tuning
END
View Expansion
View Expansion
Types of Subqueries
• subquery
– query in where clause
– Select 1 from dual where 1 = (select 1 from dual);
• correlated subquery
– Subquery uses fields from outer query
– Select 1 from dual a where 1=(select 1 from dual b where
a.dummy=b.dummy)
• scalar subquery
– Query in select list
– Returns 1 value or null , ie scalar
– Select (select 1 from dual) from dual;
• inline views
– Query in from clause
– Select 1 from dual a, (select 1 from dual ) b;
Visual SQL Tuning
• Layout tables Graphically
– Details tables above Masters
– One to one relations side by side
– Many to many any which way
Many to
single value
Join Set Sizes
Join type max result set size
possible
notes
one-to-scalar A this is equivalent to a filter on A
table B returns one value like a max(), min(),
count() etc
one-to-one min(rA,rB)
one-to-many rA
Joining from A to B will not increase the result set
size
many-to-many rA*rB
-------------------------
min(ndv(A),ndv(B))
The more duplicates in both tables the greater
chance
the result set size will explode
99 6/22/2013
We can say a lot about the join set size between two tables just by the
join type and the number of rows in the table and NDV in the join column,
but the easiest way most often is just to extract the two table joins and
run a count(*) on that subset of the query
Join Filter ratios
A
B Jm=1
Jd ~> 1
FK
PK
A
B Jm <= 1
Jd ~> 1
detail
Master
Unique
index or
unique
constraint
Jd, = join detail ratio , the avg number of rows returned when joining from the master to child
Jm = master join ratio, the avg number of rows returned joining from the child into the master.
Jm = 1 when PK/FK relations,
Jm < 1 possible when unique indexes or unique constraints instead of PK/FK.
Jd < 1 rare but acts as filter instead of a multiplier
Hash Join vs NL
Col A
Col B
Col C Filter &
Join IndexCol D
Table Y
Table X
Filter Index
Join Index
Col A
Col B
Col C
Filter Index
Join Index
Col D
Table Y
Table X
Filter Index
Join Index
NL HJ
Driving Table (smaller set)
Drive from Table Y off of set of rows
returned from filter on column C
Nested loops into Table X on Index on
Join
Filter results without Index even though
index on filter column
Create hash result set on Table Y from
filter on column C
Probe hash result set with rows from
filter on table X on column A
Filter Index
Join Index
Build Hash Table
Probe Hash Table
NL
X
Y
HJ
X
Y
Left Deep HJ
HJ
HJ
HJ
T1
T2
T3
T4
T1 T2
T3
T4
HJ
HJ
HJ
T1 T2
T3
Hashed
Hashed probe
probe
T4
probeHashed
Right Deep HJ
HJ
T4
HJ
T3
HJ
T2
T1
T2 T1
T3
T4
HJ
HJ
HJ
T2 T1
T3
T4
probehashed
hashed
hashed
probe
probe
Nest Loops left deep
T1 T2
T3
T4
NL
NL
NL
T1
T2
T3
T4
NL
NL
NL
probed
probed
probed
Nest Loops can’t be right deep
T3 T4
T2
T1 NL
T1
NL
T2
NL
T3
T4
probed
probed
probed
NL
NL
NL
Bushy
T1 T2
HJ
NL
T1
T2
NL
T3
T4
NL
T3 T4
NL
HJ
select t3id, a.*, b.* from
( select /*+ no_merge */
t2.id t2id, t1.data t1data, t2.data t2data
from t1, t2
where t1.id = t2.id ) a,
( select /*+ no_merge */
t3.id t3id, t3.data t3data, t4.data t4data
from t3, t4
where t3.id = t4.id ) b
where a.t2id=b.t3id
/

Más contenido relacionado

La actualidad más candente

DATA STRUCTURES
DATA STRUCTURESDATA STRUCTURES
DATA STRUCTURESbca2010
 
Introduction_modern_fortran_short
Introduction_modern_fortran_shortIntroduction_modern_fortran_short
Introduction_modern_fortran_shortNils van Velzen
 
R Programming: Numeric Functions In R
R Programming: Numeric Functions In RR Programming: Numeric Functions In R
R Programming: Numeric Functions In RRsquared Academy
 
programming fortran 77 Slide02
programming fortran 77 Slide02programming fortran 77 Slide02
programming fortran 77 Slide02Ahmed Gamal
 
Design and Implementation of Boolean Functions using Multiplexer and also usi...
Design and Implementation of Boolean Functions using Multiplexer and also usi...Design and Implementation of Boolean Functions using Multiplexer and also usi...
Design and Implementation of Boolean Functions using Multiplexer and also usi...IRJET Journal
 
Preparing for BIT – IT2301 Database Management Systems 2001f
Preparing for BIT – IT2301 Database Management Systems 2001fPreparing for BIT – IT2301 Database Management Systems 2001f
Preparing for BIT – IT2301 Database Management Systems 2001fGihan Wikramanayake
 
5.1part2 foil
5.1part2 foil5.1part2 foil
5.1part2 foilvhiggins1
 
Synthesized report on the comparison of lut and splitting method for decrypti...
Synthesized report on the comparison of lut and splitting method for decrypti...Synthesized report on the comparison of lut and splitting method for decrypti...
Synthesized report on the comparison of lut and splitting method for decrypti...eSAT Journals
 
R Programming: Mathematical Functions In R
R Programming: Mathematical Functions In RR Programming: Mathematical Functions In R
R Programming: Mathematical Functions In RRsquared Academy
 

La actualidad más candente (10)

DATA STRUCTURES
DATA STRUCTURESDATA STRUCTURES
DATA STRUCTURES
 
Introduction_modern_fortran_short
Introduction_modern_fortran_shortIntroduction_modern_fortran_short
Introduction_modern_fortran_short
 
R Programming: Numeric Functions In R
R Programming: Numeric Functions In RR Programming: Numeric Functions In R
R Programming: Numeric Functions In R
 
Joins
JoinsJoins
Joins
 
programming fortran 77 Slide02
programming fortran 77 Slide02programming fortran 77 Slide02
programming fortran 77 Slide02
 
Design and Implementation of Boolean Functions using Multiplexer and also usi...
Design and Implementation of Boolean Functions using Multiplexer and also usi...Design and Implementation of Boolean Functions using Multiplexer and also usi...
Design and Implementation of Boolean Functions using Multiplexer and also usi...
 
Preparing for BIT – IT2301 Database Management Systems 2001f
Preparing for BIT – IT2301 Database Management Systems 2001fPreparing for BIT – IT2301 Database Management Systems 2001f
Preparing for BIT – IT2301 Database Management Systems 2001f
 
5.1part2 foil
5.1part2 foil5.1part2 foil
5.1part2 foil
 
Synthesized report on the comparison of lut and splitting method for decrypti...
Synthesized report on the comparison of lut and splitting method for decrypti...Synthesized report on the comparison of lut and splitting method for decrypti...
Synthesized report on the comparison of lut and splitting method for decrypti...
 
R Programming: Mathematical Functions In R
R Programming: Mathematical Functions In RR Programming: Mathematical Functions In R
R Programming: Mathematical Functions In R
 

Destacado

Oracle 10g Performance: chapter 00 statspack
Oracle 10g Performance: chapter 00 statspackOracle 10g Performance: chapter 00 statspack
Oracle 10g Performance: chapter 00 statspackKyle Hailey
 
Oracle 10g Performance: chapter 01 ash
Oracle 10g Performance: chapter 01 ashOracle 10g Performance: chapter 01 ash
Oracle 10g Performance: chapter 01 ashKyle Hailey
 
Message Queue (MQ) Testing
Message Queue (MQ) TestingMessage Queue (MQ) Testing
Message Queue (MQ) TestingUjjwal Gupta
 
Oracle 10g rac_overview
Oracle 10g rac_overviewOracle 10g rac_overview
Oracle 10g rac_overviewRobel Parvini
 
Creating Queue Manager and Queue's in IBM WebSphere Mq
Creating Queue Manager and Queue's in IBM WebSphere MqCreating Queue Manager and Queue's in IBM WebSphere Mq
Creating Queue Manager and Queue's in IBM WebSphere MqRavi Babu
 
Step By Step Install Oracle 10g Rac Asm On Windows
Step By Step Install Oracle 10g Rac Asm On WindowsStep By Step Install Oracle 10g Rac Asm On Windows
Step By Step Install Oracle 10g Rac Asm On Windowsjstorm
 
Sending and receiving messages in mq queues
Sending and receiving messages in mq queuesSending and receiving messages in mq queues
Sending and receiving messages in mq queuesRavi Babu
 
Oracle 10g Performance: chapter 05 waits intro
Oracle 10g Performance: chapter 05 waits introOracle 10g Performance: chapter 05 waits intro
Oracle 10g Performance: chapter 05 waits introKyle Hailey
 
Oracle 10g Performance: chapter 00 intro live_short
Oracle 10g Performance: chapter 00 intro live_shortOracle 10g Performance: chapter 00 intro live_short
Oracle 10g Performance: chapter 00 intro live_shortKyle Hailey
 
Oracle database performance tuning
Oracle database performance tuningOracle database performance tuning
Oracle database performance tuningAbishek V S
 
Oracle DB Performance Tuning Tips
Oracle DB Performance Tuning TipsOracle DB Performance Tuning Tips
Oracle DB Performance Tuning TipsAsanka Dilruk
 
Oracle database performance tuning
Oracle database performance tuningOracle database performance tuning
Oracle database performance tuningYogiji Creations
 
Websphere MQ admin guide
Websphere MQ admin guideWebsphere MQ admin guide
Websphere MQ admin guideRam Babu
 
Oracle Oracle Performance Tuning
Oracle Oracle Performance Tuning Oracle Oracle Performance Tuning
Oracle Oracle Performance Tuning Kernel Training
 
Oracle 11g R2 RAC implementation and concept
Oracle 11g R2 RAC implementation and conceptOracle 11g R2 RAC implementation and concept
Oracle 11g R2 RAC implementation and conceptSantosh Kangane
 
Oracle 12c RAC On your laptop Step by Step Implementation Guide 1.0
Oracle 12c RAC On your laptop Step by Step Implementation Guide 1.0Oracle 12c RAC On your laptop Step by Step Implementation Guide 1.0
Oracle 12c RAC On your laptop Step by Step Implementation Guide 1.0Yury Velikanov
 
Websphere MQ (MQSeries) fundamentals
Websphere MQ (MQSeries) fundamentalsWebsphere MQ (MQSeries) fundamentals
Websphere MQ (MQSeries) fundamentalsBiju Nair
 
Top 10 tips for Oracle performance (Updated April 2015)
Top 10 tips for Oracle performance (Updated April 2015)Top 10 tips for Oracle performance (Updated April 2015)
Top 10 tips for Oracle performance (Updated April 2015)Guy Harrison
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuningGuy Harrison
 

Destacado (19)

Oracle 10g Performance: chapter 00 statspack
Oracle 10g Performance: chapter 00 statspackOracle 10g Performance: chapter 00 statspack
Oracle 10g Performance: chapter 00 statspack
 
Oracle 10g Performance: chapter 01 ash
Oracle 10g Performance: chapter 01 ashOracle 10g Performance: chapter 01 ash
Oracle 10g Performance: chapter 01 ash
 
Message Queue (MQ) Testing
Message Queue (MQ) TestingMessage Queue (MQ) Testing
Message Queue (MQ) Testing
 
Oracle 10g rac_overview
Oracle 10g rac_overviewOracle 10g rac_overview
Oracle 10g rac_overview
 
Creating Queue Manager and Queue's in IBM WebSphere Mq
Creating Queue Manager and Queue's in IBM WebSphere MqCreating Queue Manager and Queue's in IBM WebSphere Mq
Creating Queue Manager and Queue's in IBM WebSphere Mq
 
Step By Step Install Oracle 10g Rac Asm On Windows
Step By Step Install Oracle 10g Rac Asm On WindowsStep By Step Install Oracle 10g Rac Asm On Windows
Step By Step Install Oracle 10g Rac Asm On Windows
 
Sending and receiving messages in mq queues
Sending and receiving messages in mq queuesSending and receiving messages in mq queues
Sending and receiving messages in mq queues
 
Oracle 10g Performance: chapter 05 waits intro
Oracle 10g Performance: chapter 05 waits introOracle 10g Performance: chapter 05 waits intro
Oracle 10g Performance: chapter 05 waits intro
 
Oracle 10g Performance: chapter 00 intro live_short
Oracle 10g Performance: chapter 00 intro live_shortOracle 10g Performance: chapter 00 intro live_short
Oracle 10g Performance: chapter 00 intro live_short
 
Oracle database performance tuning
Oracle database performance tuningOracle database performance tuning
Oracle database performance tuning
 
Oracle DB Performance Tuning Tips
Oracle DB Performance Tuning TipsOracle DB Performance Tuning Tips
Oracle DB Performance Tuning Tips
 
Oracle database performance tuning
Oracle database performance tuningOracle database performance tuning
Oracle database performance tuning
 
Websphere MQ admin guide
Websphere MQ admin guideWebsphere MQ admin guide
Websphere MQ admin guide
 
Oracle Oracle Performance Tuning
Oracle Oracle Performance Tuning Oracle Oracle Performance Tuning
Oracle Oracle Performance Tuning
 
Oracle 11g R2 RAC implementation and concept
Oracle 11g R2 RAC implementation and conceptOracle 11g R2 RAC implementation and concept
Oracle 11g R2 RAC implementation and concept
 
Oracle 12c RAC On your laptop Step by Step Implementation Guide 1.0
Oracle 12c RAC On your laptop Step by Step Implementation Guide 1.0Oracle 12c RAC On your laptop Step by Step Implementation Guide 1.0
Oracle 12c RAC On your laptop Step by Step Implementation Guide 1.0
 
Websphere MQ (MQSeries) fundamentals
Websphere MQ (MQSeries) fundamentalsWebsphere MQ (MQSeries) fundamentals
Websphere MQ (MQSeries) fundamentals
 
Top 10 tips for Oracle performance (Updated April 2015)
Top 10 tips for Oracle performance (Updated April 2015)Top 10 tips for Oracle performance (Updated April 2015)
Top 10 tips for Oracle performance (Updated April 2015)
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuning
 

Similar a SQL Tuning and VST

OOUG: VST , visual sql tuning diagrams
OOUG: VST , visual sql tuning diagramsOOUG: VST , visual sql tuning diagrams
OOUG: VST , visual sql tuning diagramsKyle Hailey
 
SQL Tuning Methodology, Kscope 2013
SQL Tuning Methodology, Kscope 2013 SQL Tuning Methodology, Kscope 2013
SQL Tuning Methodology, Kscope 2013 Kyle Hailey
 
kscope2013vst-130627142814-phpapp02.pdf
kscope2013vst-130627142814-phpapp02.pdfkscope2013vst-130627142814-phpapp02.pdf
kscope2013vst-130627142814-phpapp02.pdfTricantinoLopezPerez
 
DOAG: Visual SQL Tuning
DOAG: Visual SQL TuningDOAG: Visual SQL Tuning
DOAG: Visual SQL TuningKyle Hailey
 
IBM Informix Database SQL Set operators and ANSI Hash Join
IBM Informix Database SQL Set operators and ANSI Hash JoinIBM Informix Database SQL Set operators and ANSI Hash Join
IBM Informix Database SQL Set operators and ANSI Hash JoinAjay Gupte
 
Advanced MySQL Query Tuning
Advanced MySQL Query TuningAdvanced MySQL Query Tuning
Advanced MySQL Query TuningAlexander Rubin
 
lect- 3&4.ppt
lect- 3&4.pptlect- 3&4.ppt
lect- 3&4.pptmrizwan38
 
MySQL Query tuning 101
MySQL Query tuning 101MySQL Query tuning 101
MySQL Query tuning 101Sveta Smirnova
 
Understand the Query Plan to Optimize Performance with EXPLAIN and EXPLAIN AN...
Understand the Query Plan to Optimize Performance with EXPLAIN and EXPLAIN AN...Understand the Query Plan to Optimize Performance with EXPLAIN and EXPLAIN AN...
Understand the Query Plan to Optimize Performance with EXPLAIN and EXPLAIN AN...EDB
 
Adapting to Adaptive Plans on 12c
Adapting to Adaptive Plans on 12cAdapting to Adaptive Plans on 12c
Adapting to Adaptive Plans on 12cMauro Pagano
 
Online Statistics Gathering for ETL
Online Statistics Gathering for ETLOnline Statistics Gathering for ETL
Online Statistics Gathering for ETLAndrej Pashchenko
 
Myth busters - performance tuning 101 2007
Myth busters - performance tuning 101 2007Myth busters - performance tuning 101 2007
Myth busters - performance tuning 101 2007paulguerin
 
Chasing the optimizer
Chasing the optimizerChasing the optimizer
Chasing the optimizerMauro Pagano
 
Advanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema TuningAdvanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema TuningMYXPLAIN
 
Sydney Oracle Meetup - access paths
Sydney Oracle Meetup - access pathsSydney Oracle Meetup - access paths
Sydney Oracle Meetup - access pathspaulguerin
 
Covering indexes
Covering indexesCovering indexes
Covering indexesMYXPLAIN
 
How to understand and analyze Apache Hive query execution plan for performanc...
How to understand and analyze Apache Hive query execution plan for performanc...How to understand and analyze Apache Hive query execution plan for performanc...
How to understand and analyze Apache Hive query execution plan for performanc...DataWorks Summit/Hadoop Summit
 
Enhancing Spark SQL Optimizer with Reliable Statistics
Enhancing Spark SQL Optimizer with Reliable StatisticsEnhancing Spark SQL Optimizer with Reliable Statistics
Enhancing Spark SQL Optimizer with Reliable StatisticsJen Aman
 

Similar a SQL Tuning and VST (20)

OOUG: VST , visual sql tuning diagrams
OOUG: VST , visual sql tuning diagramsOOUG: VST , visual sql tuning diagrams
OOUG: VST , visual sql tuning diagrams
 
SQL Tuning Methodology, Kscope 2013
SQL Tuning Methodology, Kscope 2013 SQL Tuning Methodology, Kscope 2013
SQL Tuning Methodology, Kscope 2013
 
kscope2013vst-130627142814-phpapp02.pdf
kscope2013vst-130627142814-phpapp02.pdfkscope2013vst-130627142814-phpapp02.pdf
kscope2013vst-130627142814-phpapp02.pdf
 
DOAG: Visual SQL Tuning
DOAG: Visual SQL TuningDOAG: Visual SQL Tuning
DOAG: Visual SQL Tuning
 
IBM Informix Database SQL Set operators and ANSI Hash Join
IBM Informix Database SQL Set operators and ANSI Hash JoinIBM Informix Database SQL Set operators and ANSI Hash Join
IBM Informix Database SQL Set operators and ANSI Hash Join
 
sqltuningcardinality1(1).ppt
sqltuningcardinality1(1).pptsqltuningcardinality1(1).ppt
sqltuningcardinality1(1).ppt
 
Advanced MySQL Query Tuning
Advanced MySQL Query TuningAdvanced MySQL Query Tuning
Advanced MySQL Query Tuning
 
lect- 3&4.ppt
lect- 3&4.pptlect- 3&4.ppt
lect- 3&4.ppt
 
MySQL Query tuning 101
MySQL Query tuning 101MySQL Query tuning 101
MySQL Query tuning 101
 
Understand the Query Plan to Optimize Performance with EXPLAIN and EXPLAIN AN...
Understand the Query Plan to Optimize Performance with EXPLAIN and EXPLAIN AN...Understand the Query Plan to Optimize Performance with EXPLAIN and EXPLAIN AN...
Understand the Query Plan to Optimize Performance with EXPLAIN and EXPLAIN AN...
 
Adapting to Adaptive Plans on 12c
Adapting to Adaptive Plans on 12cAdapting to Adaptive Plans on 12c
Adapting to Adaptive Plans on 12c
 
Online Statistics Gathering for ETL
Online Statistics Gathering for ETLOnline Statistics Gathering for ETL
Online Statistics Gathering for ETL
 
Part5 sql tune
Part5 sql tunePart5 sql tune
Part5 sql tune
 
Myth busters - performance tuning 101 2007
Myth busters - performance tuning 101 2007Myth busters - performance tuning 101 2007
Myth busters - performance tuning 101 2007
 
Chasing the optimizer
Chasing the optimizerChasing the optimizer
Chasing the optimizer
 
Advanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema TuningAdvanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema Tuning
 
Sydney Oracle Meetup - access paths
Sydney Oracle Meetup - access pathsSydney Oracle Meetup - access paths
Sydney Oracle Meetup - access paths
 
Covering indexes
Covering indexesCovering indexes
Covering indexes
 
How to understand and analyze Apache Hive query execution plan for performanc...
How to understand and analyze Apache Hive query execution plan for performanc...How to understand and analyze Apache Hive query execution plan for performanc...
How to understand and analyze Apache Hive query execution plan for performanc...
 
Enhancing Spark SQL Optimizer with Reliable Statistics
Enhancing Spark SQL Optimizer with Reliable StatisticsEnhancing Spark SQL Optimizer with Reliable Statistics
Enhancing Spark SQL Optimizer with Reliable Statistics
 

Más de Kyle Hailey

Hooks in postgresql by Guillaume Lelarge
Hooks in postgresql by Guillaume LelargeHooks in postgresql by Guillaume Lelarge
Hooks in postgresql by Guillaume LelargeKyle Hailey
 
Performance insights twitch
Performance insights twitchPerformance insights twitch
Performance insights twitchKyle Hailey
 
History of database monitoring
History of database monitoringHistory of database monitoring
History of database monitoringKyle Hailey
 
Ash masters : advanced ash analytics on Oracle
Ash masters : advanced ash analytics on Oracle Ash masters : advanced ash analytics on Oracle
Ash masters : advanced ash analytics on Oracle Kyle Hailey
 
Successfully convince people with data visualization
Successfully convince people with data visualizationSuccessfully convince people with data visualization
Successfully convince people with data visualizationKyle Hailey
 
Virtual Data : Eliminating the data constraint in Application Development
Virtual Data :  Eliminating the data constraint in Application DevelopmentVirtual Data :  Eliminating the data constraint in Application Development
Virtual Data : Eliminating the data constraint in Application DevelopmentKyle Hailey
 
DBTA Data Summit : Eliminating the data constraint in Application Development
DBTA Data Summit : Eliminating the data constraint in Application DevelopmentDBTA Data Summit : Eliminating the data constraint in Application Development
DBTA Data Summit : Eliminating the data constraint in Application DevelopmentKyle Hailey
 
Accelerate Develoment with VIrtual Data
Accelerate Develoment with VIrtual DataAccelerate Develoment with VIrtual Data
Accelerate Develoment with VIrtual DataKyle Hailey
 
Delphix and Pure Storage partner
Delphix and Pure Storage partnerDelphix and Pure Storage partner
Delphix and Pure Storage partnerKyle Hailey
 
Mark Farnam : Minimizing the Concurrency Footprint of Transactions
Mark Farnam  : Minimizing the Concurrency Footprint of TransactionsMark Farnam  : Minimizing the Concurrency Footprint of Transactions
Mark Farnam : Minimizing the Concurrency Footprint of TransactionsKyle Hailey
 
Dan Norris: Exadata security
Dan Norris: Exadata securityDan Norris: Exadata security
Dan Norris: Exadata securityKyle Hailey
 
Martin Klier : Volkswagen for Oracle Guys
Martin Klier : Volkswagen for Oracle GuysMartin Klier : Volkswagen for Oracle Guys
Martin Klier : Volkswagen for Oracle GuysKyle Hailey
 
Data as a Service
Data as a Service Data as a Service
Data as a Service Kyle Hailey
 
Data Virtualization: Revolutionizing data cloning
Data Virtualization: Revolutionizing data cloningData Virtualization: Revolutionizing data cloning
Data Virtualization: Revolutionizing data cloning Kyle Hailey
 
BGOUG "Agile Data: revolutionizing database cloning'
BGOUG  "Agile Data: revolutionizing database cloning'BGOUG  "Agile Data: revolutionizing database cloning'
BGOUG "Agile Data: revolutionizing database cloning'Kyle Hailey
 
Denver devops : enabling DevOps with data virtualization
Denver devops : enabling DevOps with data virtualizationDenver devops : enabling DevOps with data virtualization
Denver devops : enabling DevOps with data virtualizationKyle Hailey
 
Oracle Open World 2014: Lies, Damned Lies, and I/O Statistics [ CON3671]
Oracle Open World 2014: Lies, Damned Lies, and I/O Statistics [ CON3671]Oracle Open World 2014: Lies, Damned Lies, and I/O Statistics [ CON3671]
Oracle Open World 2014: Lies, Damned Lies, and I/O Statistics [ CON3671]Kyle Hailey
 
Jonathan Lewis explains Delphix
Jonathan Lewis explains Delphix Jonathan Lewis explains Delphix
Jonathan Lewis explains Delphix Kyle Hailey
 
Oaktable World 2014 Toon Koppelaars: database constraints polite excuse
Oaktable World 2014 Toon Koppelaars: database constraints polite excuseOaktable World 2014 Toon Koppelaars: database constraints polite excuse
Oaktable World 2014 Toon Koppelaars: database constraints polite excuseKyle Hailey
 

Más de Kyle Hailey (20)

Hooks in postgresql by Guillaume Lelarge
Hooks in postgresql by Guillaume LelargeHooks in postgresql by Guillaume Lelarge
Hooks in postgresql by Guillaume Lelarge
 
Performance insights twitch
Performance insights twitchPerformance insights twitch
Performance insights twitch
 
History of database monitoring
History of database monitoringHistory of database monitoring
History of database monitoring
 
Ash masters : advanced ash analytics on Oracle
Ash masters : advanced ash analytics on Oracle Ash masters : advanced ash analytics on Oracle
Ash masters : advanced ash analytics on Oracle
 
Successfully convince people with data visualization
Successfully convince people with data visualizationSuccessfully convince people with data visualization
Successfully convince people with data visualization
 
Virtual Data : Eliminating the data constraint in Application Development
Virtual Data :  Eliminating the data constraint in Application DevelopmentVirtual Data :  Eliminating the data constraint in Application Development
Virtual Data : Eliminating the data constraint in Application Development
 
DBTA Data Summit : Eliminating the data constraint in Application Development
DBTA Data Summit : Eliminating the data constraint in Application DevelopmentDBTA Data Summit : Eliminating the data constraint in Application Development
DBTA Data Summit : Eliminating the data constraint in Application Development
 
Accelerate Develoment with VIrtual Data
Accelerate Develoment with VIrtual DataAccelerate Develoment with VIrtual Data
Accelerate Develoment with VIrtual Data
 
Delphix and Pure Storage partner
Delphix and Pure Storage partnerDelphix and Pure Storage partner
Delphix and Pure Storage partner
 
Mark Farnam : Minimizing the Concurrency Footprint of Transactions
Mark Farnam  : Minimizing the Concurrency Footprint of TransactionsMark Farnam  : Minimizing the Concurrency Footprint of Transactions
Mark Farnam : Minimizing the Concurrency Footprint of Transactions
 
Dan Norris: Exadata security
Dan Norris: Exadata securityDan Norris: Exadata security
Dan Norris: Exadata security
 
Martin Klier : Volkswagen for Oracle Guys
Martin Klier : Volkswagen for Oracle GuysMartin Klier : Volkswagen for Oracle Guys
Martin Klier : Volkswagen for Oracle Guys
 
What is DevOps
What is DevOpsWhat is DevOps
What is DevOps
 
Data as a Service
Data as a Service Data as a Service
Data as a Service
 
Data Virtualization: Revolutionizing data cloning
Data Virtualization: Revolutionizing data cloningData Virtualization: Revolutionizing data cloning
Data Virtualization: Revolutionizing data cloning
 
BGOUG "Agile Data: revolutionizing database cloning'
BGOUG  "Agile Data: revolutionizing database cloning'BGOUG  "Agile Data: revolutionizing database cloning'
BGOUG "Agile Data: revolutionizing database cloning'
 
Denver devops : enabling DevOps with data virtualization
Denver devops : enabling DevOps with data virtualizationDenver devops : enabling DevOps with data virtualization
Denver devops : enabling DevOps with data virtualization
 
Oracle Open World 2014: Lies, Damned Lies, and I/O Statistics [ CON3671]
Oracle Open World 2014: Lies, Damned Lies, and I/O Statistics [ CON3671]Oracle Open World 2014: Lies, Damned Lies, and I/O Statistics [ CON3671]
Oracle Open World 2014: Lies, Damned Lies, and I/O Statistics [ CON3671]
 
Jonathan Lewis explains Delphix
Jonathan Lewis explains Delphix Jonathan Lewis explains Delphix
Jonathan Lewis explains Delphix
 
Oaktable World 2014 Toon Koppelaars: database constraints polite excuse
Oaktable World 2014 Toon Koppelaars: database constraints polite excuseOaktable World 2014 Toon Koppelaars: database constraints polite excuse
Oaktable World 2014 Toon Koppelaars: database constraints polite excuse
 

Último

How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Kaya Weers
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...itnewsafrica
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 

Último (20)

How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 

SQL Tuning and VST

  • 1. Visual SQL Tuning (VST) Kyle Hailey http://dboptimizer.com
  • 2. SQL Tuning Methodology 1. Find: Problem SQL 2. Study: SQL Execution Plan 3. Fix: How ?
  • 3. Step 1 : Find “bad” SQL 1. Users complain 2. High Resources 3. Monitoring
  • 4. Step 2: Get Explain Plan -------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | --------------------------------------------------------------------------------------------- | 1 | HASH GROUP BY | | 1 | 1 | 1 | |* 2 | FILTER | | 1 | | 1909 | |* 3 | TABLE ACCESS BY INDEX ROWID | PS_RETROPAYPGM_TBL | 1 | 1 | 3413 | | 4 | NESTED LOOPS | | 1 | 165 | 6827 | |* 5 | HASH JOIN | | 1 | 165 | 3413 | |* 6 | HASH JOIN | | 1 | 165 | 3624 | | 7 | TABLE ACCESS BY INDEX ROWID | WB_JOB | 1 | 242 | 2895 | | 8 | NESTED LOOPS | | 1 | 233 | 2897 | | 9 | TABLE ACCESS BY INDEX ROWID| PS_PAY_CALENDAR | 1 | 1 | 1 | |* 10 | INDEX RANGE SCAN | PS0PAY_CALENDAR | 1 | 1 | 1 | |* 11 | INDEX RANGE SCAN | WBBJOB_B | 1 | 286 | 2895 | |* 12 | TABLE ACCESS FULL | WB_RETROPAY_EARNS | 1 | 27456 | 122K| | 13 | TABLE ACCESS FULL | PS_RETROPAY_RQST | 1 | 13679 | 13679 | |* 14 | INDEX RANGE SCAN | PS#RETROPAYPGM_TBL | 3413 | 1 | 3413 | | 15 | SORT AGGREGATE | | 1791 | 1 | 1791 | | 16 | FIRST ROW | | 1791 | 1 | 1579 | |* 17 | INDEX RANGE SCAN (MIN/MAX) | WB_JOB_F | 1791 | 1 | 1579 | | 18 | SORT AGGREGATE | | 1539 | 1 | 1539 | | 19 | FIRST ROW | | 1539 | 1 | 1539 | |* 20 | INDEX RANGE SCAN (MIN/MAX) | WB_JOB_G | 1539 | 1 | 1539 | --------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(("B"."EFFDT"= AND "B"."EFFSEQ"=)) 3 - filter("E"."OFF_CYCLE"="A"."PAY_OFF_CYCLE_CAL") 5 - access("D"."RETROPAY_SEQ_NO"="C"."RETROPAY_SEQ_NO") 6 - access("C"."EMPLID"="B"."EMPLID" AND "C"."EMPL_RCD#"="B"."EMPL_RCD#") 10 - access("A"."RUN_ID"='PD2' AND "A"."PAY_CONFIRM_RUN"='N') 11 - access("B"."COMPANY"="A"."COMPANY" AND "B"."PAYGROUP"="A"."PAYGROUP") 12 - filter(("C"."RETROPAY_PRCS_FLAG"='C' AND "C"."RETROPAY_LOAD_SW"='Y')) 14 - access("E"."RETROPAY_PGM_ID"="D"."RETROPAY_PGM_ID") 17 - access("F"."EMPLID"=:B1 AND "F"."EMPL_RCD#"=:B2 AND "F"."EFFDT"<=:B3) 20 - access("G"."EMPLID"=:B1 AND "G"."EMPL_RCD#"=:B2 AND "G"."EFFDT"=:B3) PARSING IN CURSOR #2 len=53 dep=0 uid=61 oct=3 lid=61 tim=1151519905950403 hv=2296704914 ad='4e50010c' SELECT 'Hello, world; today is ' || SYSDATE FROM dual END OF STMT PARSE #2:c=4000,e=1540,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1, tim=1151519905950397 BINDS #2: EXEC #2:c=0,e=58,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1 151519906034782 WAIT #2: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1151519906034809 FETCH #2:c=0,e=29,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=1 151519906034864 WAIT #2: nam='SQL*Net message from client' ela= 215 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1151519906035133 FETCH #2:c=0,e=1,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=11 51519906035165 WAIT #2: nam='SQL*Net message to client' ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1151519906035188 WAIT #2: nam='SQL*Net message from client' ela= 192 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1151519906035400 STAT #2 id=1 cnt=1 pid=0 pos=1 obj=0 op='FAST DUAL (cr=0 pr=0 pw=0 time=3 us) Trace fie
  • 5. Step 3: ??? Methodology • Identify Slow Queries • Look at Execution Plan • Fix Fix 1. Analyze stats 2. Go to step 1 WTF?? Fix If you are lucky, analyze for 1. Column histograms 2. Missing or better Indexes
  • 6. Explain Plan: Like Directions Where is the Map?
  • 7. Explain Plan: Like Directions Where is the Map?
  • 8. Explain Plan: Like Directions Where is the Map?
  • 9. SQL Tuning 1. Two Table Join 2. Multi-Table Join 3. Create Map 4. Design Methodology 5. Examples
  • 10. How to Join two tables? 1. Which table to start with • Hardest step ? 2. What Indexes to use 3. What type of join to use HJ, NL Design options: • Partitions • IOT • Bitmap indexes • Hash cluster • Materialized views • etc
  • 11. Two Table Join 1. Index exist? 2. Type of Relation • One to One • One to Many • Many to Many 3. Special Cases • Outer Joins • Not Exists
  • 12. Table Join Order select * from a, b where a.id = b.id A B id dataid data Every row visits Every row Work= A-rows x B-rows (8 x 4 ) HJ would optimizes to simulate index lookup If No Index then (NL) order doesn’t matter
  • 13. 2 Table join, with indexes select * from a, b where a.id = b.id A B id data data id With Indexes Start with the least rows 8
  • 14. 2 Table join, with indexes select * from a, b where a.id = b.id A B id data data id With Indexes Start with the least rows B A data id id data 8 4
  • 15. 2 table join - filters select * from a, b where a.id = b.id -- join and a.field = ‘val a’ -- filter a and b.field = ‘val b’ -- filter b A B id data data id Start on table with least rows after filter 2 3
  • 16. Two Table Joins – looks simple A B Inner Join
  • 17. Two Table Joins A B A B A B Left join B B(+) Not exists B Inner Join
  • 18. Two Table Joins A B A B A B A B A B Left join B B(+) Not exists B Right join B A(+) Not Exists A Inner Join
  • 19. Two Table Joins A B A B A B A B A B A B A B Left join B B(+) Not exists B Full outer (union) Right join B A(+) Not Exists AUnion of Not Exists Inner Join Doesn’t tell the whole story Missing « amplifications »
  • 20. One to One - intersection 1 2 1 2 1 1 2 2 A B A B BA MAP
  • 21. One to Many - projection 1 1 2 2 1 2 1 1 1 1 2 2 2 2 B A A B A B MAP
  • 22. 1 1 1 1 1 1 Many to Many - amplification 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A B A B A B MAP rA*rB ------------------------- min(ndv(A),ndv(B))
  • 23. Two Table Joins A B A B Left join B B(+) Right join B A(+) A B MAP MAP A Bo o
  • 24. Two Table Joins A B Left join B B(+) Color nodes that return no data Select a.* from a, b where b.field(+) = a.field; A B V A B V Multiplier o o ? o Pointless – join on B has no affect if no B cols selected V Pointless – join on B has no affect or multiplies rows from A if no B cols selected
  • 25. Exists SELECT * FROM dept d WHERE exists ( SELECT null FROM emp e WHERE e.deptno=d.deptno); SELECT * FROM dept d WHERE d.deptno in ( SELECT deptno FROM emp e ); Select dept.* from emp, dept where emp.deptno= dept.deptno; /* can get duplicates */ dept empE MAP
  • 26. Not Exists SELECT * FROM dept d WHERE not exists ( SELECT null FROM emp e WHERE e.deptno=d.deptno); SELECT * FROM dept d WHERE d.deptno not in ( SELECT deptno FROM emp e and deptno is not null ); SELECT dept.* FROM dept LEFT OUTER JOIN emp ON dept.deptno = emp.deptno WHERE emp.deptno IS NULL; dept empN MAP
  • 27. Two Table Join 1. Where to start 1. Generally start with the least rows after filtering with predicate 2. Drawing Map: – One to One / One to Many / Many to Many – Outer Joins / Not Exists Now , three table joins: A BNA Bo BA A B A B
  • 28. Three table join 1 row4 rows8 rows Ex) 1 customer 4 orders, each order has 2 order_lines each 1 row1 row1 row order_lines orders customer Join direction Join direction
  • 29. Three table join order_lines orders customer F Where order_lines.field = value A Filter on order_lines is going to eliminate work on orders and customers, if we start at order_lines
  • 30. Three table join order_lines orders customer F Where order_lines.field = value Starting with a filter on order_lines is going to eliminate work
  • 31. Three table join order_lines orders customer F Where orders.field = value Starting with a Filter on orders is going to eliminate work Then Join to customers => keeps the number of rows the same 1 2
  • 32. Three table join order_lines orders customer F Where customer.field = value Starting on a filter on customer is going to eliminate work
  • 33. Three table join order_lines orders customer FFF What if a filter on all three? Choose the one that filter’s the highest percent of the table. 100% * (select count(*) from TAB where condition) --------------------------- (select count(*) from Tab)
  • 34. 4 or more table join Oracle can only join one table in at a time. Oracle can’t (normally) join two different sub-branches
  • 35. Put it all together : VST 1. Tables – drawn as nodes 2. Joins : – drawn map connector lines • One-to-one, one-to-many, many-to-many • Exists, not exists, outer joins 3. Filters – mark on each table with filter in where clause 35 6/22/2013
  • 36. How to VST: Tables and Joins SELECT C.Phone_Number, C.Honorific, C.First_Name, C.Last_Name, C.Suffix, C.Address_ID, A.Address_ID, A.Street_Address_Line1, A.Street_Address_Line2, A.City_Name, A.State_Abbreviation, A.ZIP_Code, OD.Deferred_Shipment_Date, OD.Item_Count, ODT.Text, OT.Text, P.Product_Description, S.Shipment_Date FROM Orders O, Order_Details OD, Products P, Customers C, Shipments S, Addresses A, Code_Translations ODT, Code_Translations OT WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%' AND UPPER(C.First_Name) LIKE :First_Name||'%' AND OD.Order_ID = O.Order_ID AND O.Customer_ID = C.Customer_ID AND OD.Product_ID = P.Product_ID(+) AND OD.Shipment_ID = S.Shipment_ID(+) AND S.Address_ID = A.Address_ID(+) AND O.Status_Code = OT.Code AND OT.Code_Type = 'ORDER_STATUS' AND OD.Status_Code = ODT.Code AND ODT.Code_Type = 'ORDER_DETAIL_STATUS' AND O.Order_Date > :Now - 366 ORDER BY C.Customer_ID, O.Order_ID DESC, S.Shipment_ID, OD.Order_Detail_ID; Tables Orders O, Order_Details OD, Products P, Customers C, Shipments S, Addresses A, Code_Translations ODT, Code_Translations OT Joins OD.Order_ID = O.Order_ID O.Customer_ID = C.Customer_ID OD.Product_ID = P.Product_ID(+) OD.Shipment_ID = S.Shipment_ID(+) S.Address_ID = A.Address_ID(+) O.Status_Code = OT.Code OD.Status_Code = ODT.Code Dan Tow – SQL TUNING Filters WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%' AND UPPER(C.First_Name) LIKE :First_Name||'%' AND OT.Code_Type = 'ORDER_STATUS' AND O.Order_Date > :Now – 366 AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'
  • 37. Layout tables and connections Tables Orders O, Order_Details OD, Products P, Customers C, Shipments S, Addresses A, Code_Translations ODT, Code_Translations OT Joins OD.Order_ID = O.Order_ID O.Customer_ID = C.Customer_ID OD.Product_ID = P.Product_ID(+) OD.Shipment_ID = S.Shipment_ID(+) S.Address_ID = A.Address_ID(+) O.Status_Code = OT.Code OD.Status_Code = ODT.Code F S A OD P ODTC OT O Dan Tow – SQL TUNING
  • 38. Unstructured Copyright 2006 Joins OD.Order_ID = O.Order_ID O.Customer_ID = C.Customer_ID OD.Product_ID = P.Product_ID(+) OD.Shipment_ID = S.Shipment_ID(+) S.Address_ID = A.Address_ID(+) O.Status_Code = OT.Code OD.Status_Code = ODT.Code Neater, but can you do anything with it? What’s the optimal execution path? S A OD P ODT C OT O
  • 39. Parents and Children Joins OD.Order_ID = O.Order_ID O.Customer_ID = C.Customer_ID OD.Product_ID = P.Product_ID(+) OD.Shipment_ID = S.Shipment_ID(+) S.Address_ID = A.Address_ID(+) O.Status_Code = OT.Code OD.Status_Code = ODT.Code ODT OD P CA OS OT Primary Key (unique index) No index or non-unique Master Detail Structure the tree
  • 40. VST – filters and best path  Filters help determine best path Parent Child Parent Child Concept: 1. Start at most selective filter 2. Join down first, before joining upwards Filters WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%' AND UPPER(C.First_Name) LIKE :First_Name||'%' AND OT.Code_Type = 'ORDER_STATUS‘ AND ODT.Code_Type = 'ORDER_DETAIL_STATUS' AND O.Order_Date > :Now – 366 F F 30% 0.02% 100% * (select count(*) from TAB where condition) --------------------------- (select count(*) from Tab) S A OD P ODT C OT O
  • 42. F F 30% 0.02% S A OD P ODT C OT O VST – best path F F /*+ Leading (C,O,OT, OD ) */ Dan Tow SQL TUNING
  • 43.
  • 52. T9 .6 T4 T1 .3 M T3 T8 .7 T14 .9 T16 T5 T7 -> T13 T7, T13, T12 , T2 , T6, T10, T11, T15
  • 53. T9 .6 T4 T1 .3 M T3 T8 .7 T14 .9 T5 T7 -> T13 T7, T13, T12 , T2 , T6, T10, T11, T15, T16
  • 54. T9 .6 T4 T1 .3 T3 T8 .7 T14 .9 T5 T7 -> T13 T7, T13, T12 , T2 , T6, T10, T11, T15, T16, M
  • 55. T9 .6 T4 T3 T8 .7 T14 .9 T5 T7 -> T13 T7, T13, T12 , T2 , T6, T10, T1 1, T15, T16, M, T1
  • 56. T9 .6 T3 T8 .7 T14 .9 T5 T7 -> T13 T7, T13, T12 , T2 , T6, T10, T11, T15, T16, M, T1, T4
  • 57. T3 T8 .7 T14 .9 T5 T7 -> T13 T7, T13, T12 , T2 , T6, T10, T11, T15, T16, M, T1, T4,T9
  • 58. T5 T7 -> T13 T7, T13, T12 , T2 , T6, T10, T11, T15, T16, M, T1, T4,T9,T3,T8T 14
  • 59. T7, T13, T12 , T2 , T6, T10, T11, T15, T16, M, T1, T4,T9,T3,T8T 14, T5 Why not Guess ? For 17 table join, there are 355 Trillion combinations
  • 60. Cartesian SELECT A.BROKER_ID BROKER_ID, A.BROKER_LAST_NAME BROKER_LAST_NAME, A.BROKER_FIRST_NAME BROKER_FIRST_NAME, A.YEARS_WITH_FIRM YEARS_WITH_FIRM, C.OFFICE_NAME OFFICE_NAME, SUM (B.BROKER_COMMISSION) TOTAL_COMMISSIONS FROM BROKER A, CLIENT_TRANSACTION B, OFFICE_LOCATION C, INVESTMENT I WHERE A.BROKER_ID = B.BROKER_ID AND A.OFFICE_LOCATION_ID = C.OFFICE_LOCATION_ID GROUP BY A.BROKER_ID, A.BROKER_LAST_NAME, A.BROKER_FIRST_NAME, A.YEARS_WITH_FIRM, C.OFFICE_NAME;
  • 61. Implied Cartesian select c.client_first_name, c.client_last_name, ct.action, ct.price, b.broker_last_name, b.broker_first_name, o.office_name from client_transaction ct, client c, broker b, office_location o where ct.price > 100 and b.broker_id=ct.broker_id and c.broker_id = b.broker_id and o.office_location_id = b.office_location_id
  • 62. Diagram work for Many to One What about many to many?
  • 63. Unstructured Copyright 2006 Joins OD.Order_ID = O.Order_ID O.Customer_ID = C.Customer_ID OD.Product_ID = P.Product_ID(+) OD.Shipment_ID = S.Shipment_ID(+) S.Address_ID = A.Address_ID(+) O.Status_Code = OT.Code OD.Status_Code = ODT.Code S A OD P ODT C OT O S A OD P ODT C OT O
  • 64. Many-to-One vs Many-to-Many Predicate Filter 1 2 3 B -> C -> A go to A or C? Now what?
  • 65. Adding Constraints SELECT COUNT (*) FROM b, c, a WHERE b.val2 = 100 AND a.val1 = b.id AND b.val1 = c.id; 58 logical reads alter table c add constraint c_pk unique (id); alter table b add constraint b_pk unique (id); 7 logical reads
  • 66. 10053 B C $: 4 #: 1 $: 5428 #: 59999 A $: 92 #: 999 B A C B C A C A B C B A A C B A B C Table: A Alias: A Best:: AccessPath: TableScan Cost: 92.18 Degree: 1 Resp: 92.18 Card: 999.00 Best:: AccessPath: IndexRange Index: B_V2 Cost: 4.00 Degree: 1 Resp: 4.00 Card: 1.00 Best:: AccessPath: IndexFFS Index: C_PK_CON Cost: 35.57 Degree: 1 Resp: 35.57 Card: 59999.00 Join order[1]: B[B]#0 A[A]#1 C[C]#2 *************** Now joining: A[A]#1 *************** Best:: JoinMethod: NestedLoop Cost: 6.00 Degree: 1 Resp: 6.00 Card: 1.00 Bytes: 16 *************** Now joining: C[C]#2 *************** Best:: JoinMethod: NestedLoop Cost: 6.00 Degree: 1 Resp: 6.00 Card: 1.00 Bytes: 21 *********************** Best so far: Table#: 0 cost: 4.0020 card: 1.0000 bytes: 12 Table#: 1 cost: 6.0031 card: 1.0000 bytes: 16 Table#: 2 cost: 6.0032 card: 1.0000 bytes: 21 alter session set events='10053 trace name context forever';
  • 67. No Unique Constraint A $: 75 #: 999 B A C NL: $: 10 #: 1 B A C $: 6$: 4 #: 1 $: 8 NL:$: 18 #: 1 B C A NL: $: 10 #: 1 B C A $: 6.01$: 4 #: 1 $: 8 C A B C B A A C B A B C A $: 75 #: 999 C $: 5428 #: 59999 C $: 5428 #: 59999 A B C B Join order[6]: C[C]#2 A[A]#1 B[B]#0 Join order aborted: cost > best plan cost $ HJ: $: 10 #: 1
  • 68. Unique Constraint A $: 75 #: 999 B A C NL: $: 10 #: 1 B A C $: 6$: 4 #: 1 $: 8 NL:$: 18 #: 1 B C A NL: $: 10 #: 1 B C A $: 5$: 4 #: 1 $: 7 C A B C B A A C B A B C A $: 75 #: 999 C $: 5428 #: 59999 C $: 5428 #: 59999 A B C B Join order[6]: C[C]#2 A[A]#1 B[B]#0 Join order aborted: cost > best plan cost $ HJ: $: 10 #: 1 NL:$: 16 #: 1
  • 69. Diagraming: what to do with many to many • With many to many we don’t know which direction to go • How an we improve the diagram? • -> Add two table join result set sizes
  • 70. Join sizes Join Sizes Use the Join sizes to determine path of least resistance
  • 71. Look at 3 queries • Query 1 runs more than 24 hours • Query 2 outer joins and scalar sub-queries • Query 3 create path not available to Oracle
  • 72. Query 1 : Over 24 hours to runSELECT A0.zuchinis, A0.brocoli, C0.Oranges FROM ( SELECT A1.planted_date, A1.pears, A1.zuchinis, A1.brocoli FROM FOO.A A1, ( SELECT zuchinis, brocoli FROM FOO.A A2 WHERE pears = 'M' AND planted_date + 0 >= ADD_MONTHS ((SELECT MAX (planted_date) FROM FOO.B B1 WHERE pears = 'M' ), - 11) GROUP BY zuchinis, brocoli HAVING COUNT (*) = 12 ) i2 WHERE A1.planted_date = (SELECT MAX (planted_date) FROM FOO.B B2 WHERE pears = 'M' ) AND A1.pears = 'M' AND A1.zuchinis = i2.zuchinis (+) AND A1.brocoli = i2.brocoli (+) UNION SELECT A4.planted_date, A4.pears,A4.zuchinis,A4.brocoli FROM FOO.A A4 WHERE A4.planted_date >'01-OCT-08' and A4.planted_date <'03-OCT-08' AND A4.pears = 'D' AND A4.green_beans = '1' AND NOT EXISTS (SELECT * FROM FOO.A A5 WHERE pears = 'M' AND planted_date = (SELECT MAX (planted_date) FROM FOO.B B3 WHERE pears = 'M' ) AND A4.zuchinis = A5.zuchinis AND A4.brocoli = A5.brocoli) ) b, FOO.A A0, FOO.C C0, FOO.D D0, FOO.E E0 WHERE A0.planted_date >'01-OCT-08' and A0.planted_date <'03-OCT-08' AND A0.pears = 'D' AND A0.green_beans = '1' AND A0.zuchinis = b.zuchinis AND A0.brocoli = b.brocoli AND A0.planted_date = C0.planted_date AND A0.pears = C0.pears AND A0.zuchinis = C0.zuchinis AND A0.brocoli = C0.brocoli AND A0.planted_date = D0.planted_date AND A0.pears = D0.pears AND A0.harvest_size = D0.harvest_size AND C0.Oranges = D0.Oranges AND C0.apples = D0.apples AND (D0.lemons = 0 OR D0.lemons IS NULL) AND A0.planted_date = E0.planted_date AND A0.pears = E0.pears AND A0.harvest_size = E0.harvest_size AND C0.Oranges = E0.Oranges AND C0.apples = E0.apples AND (E0.lemons = 0 OR E0.lemons IS NULL) ORDER BY A0.zuchinis, A0.brocoli;
  • 75. Where is the map?
  • 76. Comparing Plans : 24 hours to 5 mins NL NL NL NL HJ HJ NL NL
  • 77. Q2 SELECT CASE WHEN M.NYC IS NULL THEN (SELECT /*+ qb_name(qb1) */ MAX (Kona) FROM foo.F WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy') AND Argentina = TRIM ('D') AND Norway = F_OUTER.Norway ELSE M.NYC END AS NYC, CASE WHEN F_OUTER.Perth IS NULL THEN NULL ELSE (SELECT /*+ qb_name(qb2) */ Georgia FROM foo.P WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy') AND Argentina = TRIM ('D') AND Paris = F_OUTER.Perth) END AS richard, CASE WHEN F_OUTER.Aruba IS NULL THEN NULL ELSE (SELECT /*+ qb_name(qb3) */ Georgia FROM foo.P WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy') AND Argentina = TRIM ('D') AND Paris = F_OUTER.Aruba) END AS Jody, CASE WHEN F_OUTER.Portland IS NULL THEN NULL ELSE (SELECT /*+ qb_name(qb4) */ Georgia FROM foo.P WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy') AND Argentina = TRIM ('D') AND Paris = F_OUTER.Portland) END AS Tom FROM foo.F F_OUTER, foo.M , foo.J , foo.N , (SELECT /*+ qb_name(qb5) */ H.SF, Oregon, H.Haiti, K.Bermuda, L.Denmark FROM (foo.H LEFT OUTER JOIN foo.K ON H.harvest_date = K.harvest_date AND H.Argentina = K.Argentina AND H.SF = K.SF AND K.Dallas = '001') LEFT OUTER JOIN FOo.L ON H.harvest_date = L.harvest_date AND H.Argentina = L.Argentina AND H.SF = L.SF WHERE H.harvest_date = to_date('08/10/2008','dd/mm/yyyy') AND H.Argentina = TRIM ('D')) extra WHERE F_OUTER.harvest_date = M.harvest_date(+) AND F_OUTER.Argentina = M.Argentina(+) AND F_OUTER.Norway = M.Norway(+) AND M.Norway(+) = M.Texas(+) AND F_OUTER.harvest_date = to_date('08/10/2008','dd/mm/yyyy') AND F_OUTER.Argentina = TRIM ('D') AND M.harvest_date(+) = to_date('08/10/2008','dd/mm/yyyy') AND M.Argentina(+) = TRIM ('D') AND F_OUTER.Norway = F_OUTER.Hawaii AND F_OUTER.harvest_date = J.harvest_date(+) AND F_OUTER.Argentina = J.Argentina(+) AND F_OUTER.Norway = J.Texas(+) AND J.harvest_date(+) = to_date('08/10/2008','dd/mm/yyyy') AND J.Argentina(+) = TRIM ('D') AND F_OUTER.Iraq = extra.SF(+) AND F_OUTER.harvest_date = N.harvest_date(+) AND F_OUTER.Argentina = N.Argentina(+) AND F_OUTER.Norway = N.Hawaii(+) AND N.Jordon(+) = '0' /
  • 79. Q2 The subqueries in the select clause look like select CASE WHEN F.f1 IS NULL THEN NULL ELSE (SELECT X.f2 FROM X WHERE code_vl = F.f1) END AS f0 from F; and should be merged into the query like: select CASE WHEN F.f1 IS NULL THEN NULL ELSE ( X.f2) END AS f0 from F , X where code_vl(+) = F.f1; select CASE WHEN F.f1 IS NULL THEN NULL ELSE (SELECT X.f2 FROM X WHERE code_vl = F.f2) END AS f0 from F; select CASE WHEN F.f1 IS NULL THEN NULL ELSE ( X.f2) END AS f0 from F , X where code_vl(+) = F.f1;
  • 80. Q3 SELECT DISTINCT * FROM FOO.a a, FOO.c c, FOO.d d, FOO.g g WHERE a.planted_date > '01-OCT-08' AND a.planted_date < '03-OCT-08' AND a.pears = 'D' AND a.green_beans = '1' AND a.planted_date = c.planted_date AND a.pears = c.pears AND a.zuchinis = c.zuchinis AND a.brocoli = c.brocoli AND a.planted_date = d.planted_date AND a.pears = d.pears AND a.harvest_size = d.harvest_size AND c.oranges = d.oranges AND c.apples = d.apples AND (d.lemons = 0 OR d.lemons IS NULL) AND a.planted_date = g.planted_date AND a.pears = g.pears AND a.harvest_size = g.harvest_size AND c.oranges = g.oranges AND c.apples = g.apples AND (g.lemons = 0 OR g.lemons IS NULL) AND a.zuchinis = '0236' AND d.apples = g.apples AND d.oranges = g.oranges ORDER BY a.zuchinis, a.brocoli;
  • 82. Q3 82 6/22/2013 SELECT * FROM ( SELECT /*+ NO_MERGE */ c.apples, c.oranges, a.harvest_size FROM a, c WHERE a.planted_date = TO_DATE ('02/10/2008', 'dd/mm/yyyy') AND a.pears = 'D' AND a.green_beans = '1' AND a.planted_date = c.planted_date AND a.pears = c.pears AND a.zuchinis = c.zuchinis AND a.brocoli = c.brocoli AND a.zuchinis = '0236' ) X, ( SELECT /*+ NO_MERGE */ d.apples, d.oranges, d.harvest_size FROM d, g WHERE d.planted_date = TO_DATE ('02/10/2008', 'dd/mm/yyyy') AND g.planted_date = TO_DATE ('02/10/2008', 'dd/mm/yyyy') AND g.apples = d.apples AND d.oranges = g.oranges AND d.pears = 'D' AND g.pears = 'D' AND g.pears = d.pears AND g.harvest_size = d.harvest_size AND (d.lemons = 0 OR d.lemons IS NULL) AND (g.lemons = 0 OR g.lemons IS NULL) ) Y WHERE X.oranges = Y.oranges AND X.apples = Y.apples AND X.harvest_size = Y.harvest_size; This final version runs in elapsed 0.33 secs and 12K logical reads down from an original elapsed 4.5 secs and 1M logical reads
  • 83. HINTS • Leading (tab_alias , table_alias … ) 10g (9i use ORDERED, not as good ) • USE_NL (table_alias) – Inner Table (2cd in xpla not driving) • USE_HASH (table_alias) – probe into (1st in xplan) • INDEX (tab_alias index_name) • NO_MERGE Oracle first decides join order then join type (example http://www.adp-gmbh.ch/blog/2008/01/17.php) 83 6/22/2013
  • 84. F F 30% 0.02% S A OD P ODT C OT O Leading Hint, use table alias (not table) F F /*+ Leading (C,O,OT, OD ) */
  • 85. HJ X Y Hash X results Y NL X Y Y X select /*+ LEADING(X,Y) USE_HASH(Y) */ * select /*+ LEADING(X,Y) USE_NL(Y) */ *
  • 86. What tools to use to create VST diagrams? • Paper – Modifications messy and difficult • PowerPoint – Can move things around – Sticky connectors – Easy to modify • DB Optimizer – Automatic and still modifiable
  • 87. VST Steps Summary 1.Diagram tables 2.Draw connectors for each join 3.Calculate filter ratio 1.If many to many then calculate two table join sizes Execution Path • Start at the most selective join filter • Join to keep the running result set size small Many to Many relationships = problems 6/22/2013 Parent Child Parent Child F F 30% 0.02% S A OD P ODT C OT O
  • 90. Visual SQL Tuning (VST) Table Sizes Join Sizes Filter Ratios Exists
  • 92. Summary 1.Database - AAS – Profile database – Use wait interface and graphics – Identify machine, application, database or SQL 2.SQL - VST – Indexes, stats, execution path – Visual SQL Tuning
  • 93. END
  • 96. Types of Subqueries • subquery – query in where clause – Select 1 from dual where 1 = (select 1 from dual); • correlated subquery – Subquery uses fields from outer query – Select 1 from dual a where 1=(select 1 from dual b where a.dummy=b.dummy) • scalar subquery – Query in select list – Returns 1 value or null , ie scalar – Select (select 1 from dual) from dual; • inline views – Query in from clause – Select 1 from dual a, (select 1 from dual ) b;
  • 98. • Layout tables Graphically – Details tables above Masters – One to one relations side by side – Many to many any which way Many to single value
  • 99. Join Set Sizes Join type max result set size possible notes one-to-scalar A this is equivalent to a filter on A table B returns one value like a max(), min(), count() etc one-to-one min(rA,rB) one-to-many rA Joining from A to B will not increase the result set size many-to-many rA*rB ------------------------- min(ndv(A),ndv(B)) The more duplicates in both tables the greater chance the result set size will explode 99 6/22/2013 We can say a lot about the join set size between two tables just by the join type and the number of rows in the table and NDV in the join column, but the easiest way most often is just to extract the two table joins and run a count(*) on that subset of the query
  • 100. Join Filter ratios A B Jm=1 Jd ~> 1 FK PK A B Jm <= 1 Jd ~> 1 detail Master Unique index or unique constraint Jd, = join detail ratio , the avg number of rows returned when joining from the master to child Jm = master join ratio, the avg number of rows returned joining from the child into the master. Jm = 1 when PK/FK relations, Jm < 1 possible when unique indexes or unique constraints instead of PK/FK. Jd < 1 rare but acts as filter instead of a multiplier
  • 101. Hash Join vs NL Col A Col B Col C Filter & Join IndexCol D Table Y Table X Filter Index Join Index Col A Col B Col C Filter Index Join Index Col D Table Y Table X Filter Index Join Index NL HJ Driving Table (smaller set) Drive from Table Y off of set of rows returned from filter on column C Nested loops into Table X on Index on Join Filter results without Index even though index on filter column Create hash result set on Table Y from filter on column C Probe hash result set with rows from filter on table X on column A Filter Index Join Index Build Hash Table Probe Hash Table NL X Y HJ X Y
  • 102. Left Deep HJ HJ HJ HJ T1 T2 T3 T4 T1 T2 T3 T4 HJ HJ HJ T1 T2 T3 Hashed Hashed probe probe T4 probeHashed
  • 103. Right Deep HJ HJ T4 HJ T3 HJ T2 T1 T2 T1 T3 T4 HJ HJ HJ T2 T1 T3 T4 probehashed hashed hashed probe probe
  • 104. Nest Loops left deep T1 T2 T3 T4 NL NL NL T1 T2 T3 T4 NL NL NL probed probed probed
  • 105. Nest Loops can’t be right deep T3 T4 T2 T1 NL T1 NL T2 NL T3 T4 probed probed probed NL NL NL
  • 106. Bushy T1 T2 HJ NL T1 T2 NL T3 T4 NL T3 T4 NL HJ select t3id, a.*, b.* from ( select /*+ no_merge */ t2.id t2id, t1.data t1data, t2.data t2data from t1, t2 where t1.id = t2.id ) a, ( select /*+ no_merge */ t3.id t3id, t3.data t3data, t4.data t4data from t3, t4 where t3.id = t4.id ) b where a.t2id=b.t3id /

Notas del editor

  1. Layout a diagram tables as nodes and joins as connectorsDraw connectors for each join in where clause1 to 1 connectionuse blue line1 to many  use black linecrows feet towards manymany to many crows feet on both endsCalculate filter ratios for any tables with filtersfilter ratio = number of rows returned with filter / number of rowsdisplay in yellow below table nodeFind the table sizes for each tabledisplay in green above table nodeCalculate two table join sizes for all two table joins in diagram (ie for every connection line)extract the join information, including filters, and run count on that joindisplay in red on join lineAlternatively, or as a complement, calculate join filter ratios in both directionsdisplay at each end of join connection line
  2. SELECT order_line_dataFROM customers cus INNER JOIN orders ord ON ord.id_customer = cus.id INNER JOIN order_linesorl ON orl.id_order = ord.id INNER JOIN products prd1 ON prd1.id = orl.id_product INNER JOIN suppliers sup1 ON sup1.id = prd1.id_supplierWHERE cus.location = &apos;LONDON&apos; AND ord.date_placed BETWEEN &apos;04-JUN-10&apos; AND &apos;11-JUN-10&apos; AND sup1.location = &apos;LEEDS&apos; AND EXISTS ( SELECT NULL FROM alternatives alt INNER JOIN products prd2 ON prd2.id = alt.id_product_sub INNER JOIN suppliers sup2 ON sup2.id = prd2.id_supplier WHERE alt.id_product = prd1.id AND sup2.location != &apos;LEEDS&apos; )