SlideShare uma empresa Scribd logo
1 de 109
Visual SQL Tuning (VST)
Kyle Hailey
Kscope 2013 New Orleans
kylelf@gmail.com
http://dboptimizer.com
Who is Kyle Hailey
 1990 Oracle
– 90 support
– 92 Ported v6
– 93 France
– 95 Benchmarking
– 98 ST Real World Performance
 2000 Dot.Com
 2001 Quest
 2002 Oracle OEM 10g
Success!
First successful OEM design
Who is Kyle Hailey
 1990 Oracle
– 90 support
– 92 Ported v6
– 93 France
– 95 Benchmarking
– 98 ST Real World Performance
 2000 Dot.Com
 2001 Quest a
 2002 Oracle OEM 10g
 2005 Embarcadero
– DB Optimizer
Who is Kyle Hailey
• 1990 Oracle
 90 support
 92 Ported v6
 93 France
 95 Benchmarking
 98 ST Real World Performance
• 2000 Dot.Com
• 2001 Quest
• 2002 Oracle OEM 10g
• 2005 Embarcadero
 DB Optimizer
• 2010 Delphix
When not being a Geek
- Have a little 4 year old boy who takes up all my time
Typical Architecture
Database
File system
Production
Instance
Database
File system
Development
Instance
Database
File system
QA
Instance
Database
UAT
Instance
File system
Clones share duplicate blocks
Development
Instance
Database
Instance
File system
Database
QA
Instance
UAT
Instance
Database Database
Source
Database
Virtual Databases
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
OEM
Perf
DB
Home
Top
Activity
Performance
Top Activity
Copyright 2006
OEM
SQL
SQL Tune
Session
Top
Activity
• Schedule Advisor
– Statistics
– SQL Profile
– Index
– Restructure SQL
– Miscellaneous
• Implement Task
<< If developers
don't have access to the
same performance tools
as DBAs
then we are setting
them up for failure >>
@DBAKevlar
EM Express 12c
Granted EM_EXPRESS_BASIC (read only) or EM_EXPRESS_ALL role.
Found SQL, now we get the Execution Plan
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
Explain Plan: Like Directions
Two Table Joins – looks simple
A B
Inner Join
Select
*
from
A, B
where
A.field=B.field
SQL Joins
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
A B
A B
Full outer (union)
Union of Not Exists
Blue = return
White = found but Excluded
Gray = Filtered out
A B
Select *
from
A, B
where
A.field=B.field
and
A.field in (1,2)
Inner Join
One to One - intersection
1
2
1
2
1 1
2 2
A B
A B
One to Many - projection
1
1
2
2
1
2
1 1
1 1
2 2
2 2
B
A
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
rA*rB
-------------------------
min(ndv(A),ndv(B))
Mapping
– One to One
BA
A B
A B
– One to Many
– Many to Many
Join Direction
1 row4 rows8 rows
1 row1 row1 row
order_lines orders customer
Three table join
order_lines orders customer
Select
*
From
order_lines ol,
orders o,
customers c
Where
c.oid=o.id and o.olid=ol.id
Three table join
order_lines orders customer
F
A Filter eliminates work
start at filter
Select
*
From
order_lines ol,
orders o,
customers c
Where
c.oid=o.id and o.olid=ol.id and
order_lines.field = value
Three table join
order_lines orders customer
F
1
2
Select
*
From
order_lines ol,
orders o,
customers c
Where
c.oid=o.id and
o.olid=ol.id and
orders.field = value
Three table join
order_lines orders customer
F
Select
*
From
order_lines ol,
orders o,
customers c
Where
c.oid=o.id and o.olid=ol.id and
customer.field = value
Three table join
order_lines orders customer
FFF
Filter on all three?
Choose best filter
100% * (select count(*) from TAB where condition)
---------------------------
(select count(*) from Tab)
Best Filter
100% * (select count(*) from TAB where condition)
---------------------------
(select count(*) from Tab)
Rows Returned
-------------------------
Rows in Table
Filter Ratio =
4 or more table join
Can only join ONE table at a time
Can’t (normally) join 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
3. Filters
– mark on each table with filter in where clause
35 6/27/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, T11,
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, T1
1, T15, T16,
M, T1, T4,T9
T5
T7 -> T13
T7, T13, T12
, T2
, T6, T10, T1
1, T15, T16,
M, T1, T4,T9,
T3,T8T14
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
many to many ?
• Where do we go?
• How to improve?
-> Add result sizes
Join sizes
Join Sizes
Pick
Smallest
result
Visual SQL Tuning (VST)
Table Sizes
Join Sizes
Filter Ratios
Exists
Execution Plan
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
80 6/27/2013
1,126,402
7,136,362
Q3
81 6/27/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
First join order
• LEADING (tab_alias , table_alias … ) 10g (9i use ORDERED, not as good )
• NO_MERGE
Then choose join type
• USE_NL (table_alias) – Inner Table probed into (2cd in xplan not driving)
• USE_HASH (table_alias) – Inner hash result probe into (1st in xplan)
• INDEX (tab_alias index_name)
(examples http://www.adp-gmbh.ch/blog/2008/01/17.php)
82 6/27/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 ) */
Y
X
LEADING(X,Y) USE_NL(Y)
Nested Loops X and Y
Select from X search in Y
NL
X
Y
Y
Hash
results
LEADING(Y, X ) USE_HASH(Y)
X
Hash Join X and Y
Select from X search in Y Hash
HJ
Y
X
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/27/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
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
97 6/27/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
/
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(+)
B returns no data, useless in Query
Select a.* from a, b where b.field(+) = a.field;
A B
V
A B
V
Multiplier
o
o ?
Useless
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
B
B
Multiplier, Useless?
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
Drawing Map
– One to One / One to Many / Many to Many
A BNA Bo
BA A B A B
– Outer Joins / Not Exists

Mais conteúdo relacionado

Mais procurados

Closures
ClosuresClosures
ClosuresSV.CO
 
Db2考试测试题
Db2考试测试题Db2考试测试题
Db2考试测试题fm2008
 
SQL for pattern matching (Oracle 12c)
SQL for pattern matching (Oracle 12c)SQL for pattern matching (Oracle 12c)
SQL for pattern matching (Oracle 12c)Logan Palanisamy
 
Stack data structure
Stack data structureStack data structure
Stack data structureSoumyajit Pal
 
Gsp 215 Future Our Mission/newtonhelp.com
Gsp 215 Future Our Mission/newtonhelp.comGsp 215 Future Our Mission/newtonhelp.com
Gsp 215 Future Our Mission/newtonhelp.comamaranthbeg8
 
OSTU - Sake Blok on Scripting with TShark
OSTU - Sake Blok on Scripting with TSharkOSTU - Sake Blok on Scripting with TShark
OSTU - Sake Blok on Scripting with TSharkDenny K
 
My sql statements by okello erick
My sql statements by okello erickMy sql statements by okello erick
My sql statements by okello erickokelloerick
 
Window functions in MariaDB 10.2
Window functions in MariaDB 10.2Window functions in MariaDB 10.2
Window functions in MariaDB 10.2Sergey Petrunya
 
Data structures stacks
Data structures   stacksData structures   stacks
Data structures stacksmaamir farooq
 
Insertion Sort Algorithm
Insertion Sort AlgorithmInsertion Sort Algorithm
Insertion Sort AlgorithmGail Carmichael
 
Data Structures - Lecture 8 [Sorting Algorithms]
Data Structures - Lecture 8 [Sorting Algorithms]Data Structures - Lecture 8 [Sorting Algorithms]
Data Structures - Lecture 8 [Sorting Algorithms]Muhammad Hammad Waseem
 
Understanding Erlang Terms
Understanding Erlang TermsUnderstanding Erlang Terms
Understanding Erlang TermsBoshan Sun
 
Implementing qrcode
Implementing qrcodeImplementing qrcode
Implementing qrcodeBoshan Sun
 
Swift the implicit parts
Swift the implicit partsSwift the implicit parts
Swift the implicit partsMaxim Zaks
 
Understanding indexing-webinar-deck
Understanding indexing-webinar-deckUnderstanding indexing-webinar-deck
Understanding indexing-webinar-deckAtner Yegorov
 

Mais procurados (18)

Closures
ClosuresClosures
Closures
 
Db2考试测试题
Db2考试测试题Db2考试测试题
Db2考试测试题
 
Counting Sort
Counting SortCounting Sort
Counting Sort
 
SQL for pattern matching (Oracle 12c)
SQL for pattern matching (Oracle 12c)SQL for pattern matching (Oracle 12c)
SQL for pattern matching (Oracle 12c)
 
Stack data structure
Stack data structureStack data structure
Stack data structure
 
Ch3
Ch3Ch3
Ch3
 
Gsp 215 Future Our Mission/newtonhelp.com
Gsp 215 Future Our Mission/newtonhelp.comGsp 215 Future Our Mission/newtonhelp.com
Gsp 215 Future Our Mission/newtonhelp.com
 
OSTU - Sake Blok on Scripting with TShark
OSTU - Sake Blok on Scripting with TSharkOSTU - Sake Blok on Scripting with TShark
OSTU - Sake Blok on Scripting with TShark
 
My sql statements by okello erick
My sql statements by okello erickMy sql statements by okello erick
My sql statements by okello erick
 
Window functions in MariaDB 10.2
Window functions in MariaDB 10.2Window functions in MariaDB 10.2
Window functions in MariaDB 10.2
 
Data structures stacks
Data structures   stacksData structures   stacks
Data structures stacks
 
Cs101 endsem 2014
Cs101 endsem 2014Cs101 endsem 2014
Cs101 endsem 2014
 
Insertion Sort Algorithm
Insertion Sort AlgorithmInsertion Sort Algorithm
Insertion Sort Algorithm
 
Data Structures - Lecture 8 [Sorting Algorithms]
Data Structures - Lecture 8 [Sorting Algorithms]Data Structures - Lecture 8 [Sorting Algorithms]
Data Structures - Lecture 8 [Sorting Algorithms]
 
Understanding Erlang Terms
Understanding Erlang TermsUnderstanding Erlang Terms
Understanding Erlang Terms
 
Implementing qrcode
Implementing qrcodeImplementing qrcode
Implementing qrcode
 
Swift the implicit parts
Swift the implicit partsSwift the implicit parts
Swift the implicit parts
 
Understanding indexing-webinar-deck
Understanding indexing-webinar-deckUnderstanding indexing-webinar-deck
Understanding indexing-webinar-deck
 

Destaque

Average Active Sessions RMOUG2007
Average Active Sessions RMOUG2007Average Active Sessions RMOUG2007
Average Active Sessions RMOUG2007John Beresniewicz
 
Average Active Sessions - OaktableWorld 2013
Average Active Sessions - OaktableWorld 2013Average Active Sessions - OaktableWorld 2013
Average Active Sessions - OaktableWorld 2013John Beresniewicz
 
How to find and fix your Oracle application performance problem
How to find and fix your Oracle application performance problemHow to find and fix your Oracle application performance problem
How to find and fix your Oracle application performance problemCary Millsap
 
Oracle Open World Thursday 230 ashmasters
Oracle Open World Thursday 230 ashmastersOracle Open World Thursday 230 ashmasters
Oracle Open World Thursday 230 ashmastersKyle Hailey
 
AWR Ambiguity: Performance reasoning when the numbers don't add up
AWR Ambiguity: Performance reasoning when the numbers don't add upAWR Ambiguity: Performance reasoning when the numbers don't add up
AWR Ambiguity: Performance reasoning when the numbers don't add upJohn Beresniewicz
 
Awr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reportsAwr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reportsJohn Beresniewicz
 
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
 
Christo kutrovsky oracle, memory & linux
Christo kutrovsky   oracle, memory & linuxChristo kutrovsky   oracle, memory & linux
Christo kutrovsky oracle, memory & linuxKyle Hailey
 
OOUG - Oracle Performance Tuning with AAS
OOUG - Oracle Performance Tuning with AASOOUG - Oracle Performance Tuning with AAS
OOUG - Oracle Performance Tuning with AASKyle Hailey
 
History of database monitoring
History of database monitoringHistory of database monitoring
History of database monitoringKyle Hailey
 
Awr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reportsAwr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reportsJohn Beresniewicz
 

Destaque (13)

NFS and Oracle
NFS and OracleNFS and Oracle
NFS and Oracle
 
Average Active Sessions RMOUG2007
Average Active Sessions RMOUG2007Average Active Sessions RMOUG2007
Average Active Sessions RMOUG2007
 
Average Active Sessions - OaktableWorld 2013
Average Active Sessions - OaktableWorld 2013Average Active Sessions - OaktableWorld 2013
Average Active Sessions - OaktableWorld 2013
 
Intro to ASH
Intro to ASHIntro to ASH
Intro to ASH
 
How to find and fix your Oracle application performance problem
How to find and fix your Oracle application performance problemHow to find and fix your Oracle application performance problem
How to find and fix your Oracle application performance problem
 
Oracle Open World Thursday 230 ashmasters
Oracle Open World Thursday 230 ashmastersOracle Open World Thursday 230 ashmasters
Oracle Open World Thursday 230 ashmasters
 
AWR Ambiguity: Performance reasoning when the numbers don't add up
AWR Ambiguity: Performance reasoning when the numbers don't add upAWR Ambiguity: Performance reasoning when the numbers don't add up
AWR Ambiguity: Performance reasoning when the numbers don't add up
 
Awr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reportsAwr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reports
 
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
 
Christo kutrovsky oracle, memory & linux
Christo kutrovsky   oracle, memory & linuxChristo kutrovsky   oracle, memory & linux
Christo kutrovsky oracle, memory & linux
 
OOUG - Oracle Performance Tuning with AAS
OOUG - Oracle Performance Tuning with AASOOUG - Oracle Performance Tuning with AAS
OOUG - Oracle Performance Tuning with AAS
 
History of database monitoring
History of database monitoringHistory of database monitoring
History of database monitoring
 
Awr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reportsAwr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reports
 

Semelhante a SQL Tuning Methodology, Kscope 2013

kscope2013vst-130627142814-phpapp02.pdf
kscope2013vst-130627142814-phpapp02.pdfkscope2013vst-130627142814-phpapp02.pdf
kscope2013vst-130627142814-phpapp02.pdfTricantinoLopezPerez
 
SQL Tuning and VST
SQL Tuning and VST SQL Tuning and VST
SQL Tuning and VST Kyle Hailey
 
Hailey_Database_Performance_Made_Easy_through_Graphics.pdf
Hailey_Database_Performance_Made_Easy_through_Graphics.pdfHailey_Database_Performance_Made_Easy_through_Graphics.pdf
Hailey_Database_Performance_Made_Easy_through_Graphics.pdfcookie1969
 
SQL techniques for faster applications
SQL techniques for faster applicationsSQL techniques for faster applications
SQL techniques for faster applicationsConnor McDonald
 
Top 10 tips for Oracle performance
Top 10 tips for Oracle performanceTop 10 tips for Oracle performance
Top 10 tips for Oracle performanceGuy Harrison
 
Modern query optimisation features in MySQL 8.
Modern query optimisation features in MySQL 8.Modern query optimisation features in MySQL 8.
Modern query optimisation features in MySQL 8.Mydbops
 
Overview of Postgres 9.5
Overview of Postgres 9.5 Overview of Postgres 9.5
Overview of Postgres 9.5 EDB
 
Chapter8.ppt
Chapter8.pptChapter8.ppt
Chapter8.pptAllwin19
 
Sydney Oracle Meetup - access paths
Sydney Oracle Meetup - access pathsSydney Oracle Meetup - access paths
Sydney Oracle Meetup - access pathspaulguerin
 
MySQL 8.0 Preview: What Is Coming?
MySQL 8.0 Preview: What Is Coming?MySQL 8.0 Preview: What Is Coming?
MySQL 8.0 Preview: What Is Coming?Gabriela Ferrara
 
B.sc cs-ii-u-4 central processing unit and pipeline
B.sc cs-ii-u-4 central processing unit and pipelineB.sc cs-ii-u-4 central processing unit and pipeline
B.sc cs-ii-u-4 central processing unit and pipelineRai University
 
UKOUG 2019 - SQL features
UKOUG 2019 - SQL featuresUKOUG 2019 - SQL features
UKOUG 2019 - SQL featuresConnor McDonald
 
Bca 2nd sem-u-4 central processing unit and pipeline
Bca 2nd sem-u-4 central processing unit and pipelineBca 2nd sem-u-4 central processing unit and pipeline
Bca 2nd sem-u-4 central processing unit and pipelineRai University
 
central processing unit and pipeline
central processing unit and pipelinecentral processing unit and pipeline
central processing unit and pipelineRai University
 
Mca i-u-4 central processing unit and pipeline
Mca i-u-4 central processing unit and pipelineMca i-u-4 central processing unit and pipeline
Mca i-u-4 central processing unit and pipelineRai University
 

Semelhante a SQL Tuning Methodology, Kscope 2013 (20)

kscope2013vst-130627142814-phpapp02.pdf
kscope2013vst-130627142814-phpapp02.pdfkscope2013vst-130627142814-phpapp02.pdf
kscope2013vst-130627142814-phpapp02.pdf
 
SQL Tuning and VST
SQL Tuning and VST SQL Tuning and VST
SQL Tuning and VST
 
sqltuningcardinality1(1).ppt
sqltuningcardinality1(1).pptsqltuningcardinality1(1).ppt
sqltuningcardinality1(1).ppt
 
Hailey_Database_Performance_Made_Easy_through_Graphics.pdf
Hailey_Database_Performance_Made_Easy_through_Graphics.pdfHailey_Database_Performance_Made_Easy_through_Graphics.pdf
Hailey_Database_Performance_Made_Easy_through_Graphics.pdf
 
SQL techniques for faster applications
SQL techniques for faster applicationsSQL techniques for faster applications
SQL techniques for faster applications
 
Top 10 tips for Oracle performance
Top 10 tips for Oracle performanceTop 10 tips for Oracle performance
Top 10 tips for Oracle performance
 
Modern query optimisation features in MySQL 8.
Modern query optimisation features in MySQL 8.Modern query optimisation features in MySQL 8.
Modern query optimisation features in MySQL 8.
 
Overview of Postgres 9.5
Overview of Postgres 9.5 Overview of Postgres 9.5
Overview of Postgres 9.5
 
Chapter8.ppt
Chapter8.pptChapter8.ppt
Chapter8.ppt
 
Sydney Oracle Meetup - access paths
Sydney Oracle Meetup - access pathsSydney Oracle Meetup - access paths
Sydney Oracle Meetup - access paths
 
MySQL 8.0 Preview: What Is Coming?
MySQL 8.0 Preview: What Is Coming?MySQL 8.0 Preview: What Is Coming?
MySQL 8.0 Preview: What Is Coming?
 
B.sc cs-ii-u-4 central processing unit and pipeline
B.sc cs-ii-u-4 central processing unit and pipelineB.sc cs-ii-u-4 central processing unit and pipeline
B.sc cs-ii-u-4 central processing unit and pipeline
 
UKOUG 2019 - SQL features
UKOUG 2019 - SQL featuresUKOUG 2019 - SQL features
UKOUG 2019 - SQL features
 
Bca 2nd sem-u-4 central processing unit and pipeline
Bca 2nd sem-u-4 central processing unit and pipelineBca 2nd sem-u-4 central processing unit and pipeline
Bca 2nd sem-u-4 central processing unit and pipeline
 
unit-3-L1.ppt
unit-3-L1.pptunit-3-L1.ppt
unit-3-L1.ppt
 
Cpu unit
Cpu unitCpu unit
Cpu unit
 
COA_mod2.ppt
COA_mod2.pptCOA_mod2.ppt
COA_mod2.ppt
 
central processing unit and pipeline
central processing unit and pipelinecentral processing unit and pipeline
central processing unit and pipeline
 
Mca i-u-4 central processing unit and pipeline
Mca i-u-4 central processing unit and pipelineMca i-u-4 central processing unit and pipeline
Mca i-u-4 central processing unit and pipeline
 
Chapter8.ppt
Chapter8.pptChapter8.ppt
Chapter8.ppt
 

Mais 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
 
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
 
Profiling the logwriter and database writer
Profiling the logwriter and database writerProfiling the logwriter and database writer
Profiling the logwriter and database writerKyle Hailey
 
Oaktable World 2014 Kevin Closson: SLOB – For More Than I/O!
Oaktable World 2014 Kevin Closson:  SLOB – For More Than I/O!Oaktable World 2014 Kevin Closson:  SLOB – For More Than I/O!
Oaktable World 2014 Kevin Closson: SLOB – For More Than I/O!Kyle Hailey
 

Mais 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
 
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
 
Profiling the logwriter and database writer
Profiling the logwriter and database writerProfiling the logwriter and database writer
Profiling the logwriter and database writer
 
Oaktable World 2014 Kevin Closson: SLOB – For More Than I/O!
Oaktable World 2014 Kevin Closson:  SLOB – For More Than I/O!Oaktable World 2014 Kevin Closson:  SLOB – For More Than I/O!
Oaktable World 2014 Kevin Closson: SLOB – For More Than I/O!
 

Último

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 

Último (20)

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 

SQL Tuning Methodology, Kscope 2013

  • 1. Visual SQL Tuning (VST) Kyle Hailey Kscope 2013 New Orleans kylelf@gmail.com http://dboptimizer.com
  • 2. Who is Kyle Hailey  1990 Oracle – 90 support – 92 Ported v6 – 93 France – 95 Benchmarking – 98 ST Real World Performance  2000 Dot.Com  2001 Quest  2002 Oracle OEM 10g Success! First successful OEM design
  • 3. Who is Kyle Hailey  1990 Oracle – 90 support – 92 Ported v6 – 93 France – 95 Benchmarking – 98 ST Real World Performance  2000 Dot.Com  2001 Quest a  2002 Oracle OEM 10g  2005 Embarcadero – DB Optimizer
  • 4. Who is Kyle Hailey • 1990 Oracle  90 support  92 Ported v6  93 France  95 Benchmarking  98 ST Real World Performance • 2000 Dot.Com • 2001 Quest • 2002 Oracle OEM 10g • 2005 Embarcadero  DB Optimizer • 2010 Delphix When not being a Geek - Have a little 4 year old boy who takes up all my time
  • 5. Typical Architecture Database File system Production Instance Database File system Development Instance Database File system QA Instance Database UAT Instance File system
  • 6. Clones share duplicate blocks Development Instance Database Instance File system Database QA Instance UAT Instance Database Database Source Database Virtual Databases
  • 7. SQL Tuning Methodology 1. Find: Problem SQL 2. Study: SQL Execution Plan 3. Fix: How ?
  • 8. Step 1 : Find “bad” SQL 1. Users complain 2. High Resources 3. Monitoring
  • 11. OEM SQL SQL Tune Session Top Activity • Schedule Advisor – Statistics – SQL Profile – Index – Restructure SQL – Miscellaneous • Implement Task
  • 12. << If developers don't have access to the same performance tools as DBAs then we are setting them up for failure >> @DBAKevlar
  • 13. EM Express 12c Granted EM_EXPRESS_BASIC (read only) or EM_EXPRESS_ALL role.
  • 14. Found SQL, now we get the Execution Plan 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
  • 15. 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
  • 16. Explain Plan: Like Directions Where is the Map?
  • 17. Explain Plan: Like Directions
  • 18. Explain Plan: Like Directions
  • 19. Two Table Joins – looks simple A B Inner Join Select * from A, B where A.field=B.field
  • 21. 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 A B A B Full outer (union) Union of Not Exists Blue = return White = found but Excluded Gray = Filtered out
  • 22. A B Select * from A, B where A.field=B.field and A.field in (1,2) Inner Join
  • 23. One to One - intersection 1 2 1 2 1 1 2 2 A B A B
  • 24. One to Many - projection 1 1 2 2 1 2 1 1 1 1 2 2 2 2 B A
  • 25. 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 rA*rB ------------------------- min(ndv(A),ndv(B))
  • 26. Mapping – One to One BA A B A B – One to Many – Many to Many
  • 27. Join Direction 1 row4 rows8 rows 1 row1 row1 row order_lines orders customer
  • 28. Three table join order_lines orders customer Select * From order_lines ol, orders o, customers c Where c.oid=o.id and o.olid=ol.id
  • 29. Three table join order_lines orders customer F A Filter eliminates work start at filter Select * From order_lines ol, orders o, customers c Where c.oid=o.id and o.olid=ol.id and order_lines.field = value
  • 30. Three table join order_lines orders customer F 1 2 Select * From order_lines ol, orders o, customers c Where c.oid=o.id and o.olid=ol.id and orders.field = value
  • 31. Three table join order_lines orders customer F Select * From order_lines ol, orders o, customers c Where c.oid=o.id and o.olid=ol.id and customer.field = value
  • 32. Three table join order_lines orders customer FFF Filter on all three? Choose best filter 100% * (select count(*) from TAB where condition) --------------------------- (select count(*) from Tab)
  • 33. Best Filter 100% * (select count(*) from TAB where condition) --------------------------- (select count(*) from Tab) Rows Returned ------------------------- Rows in Table Filter Ratio =
  • 34. 4 or more table join Can only join ONE table at a time Can’t (normally) join 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 3. Filters – mark on each table with filter in where clause 35 6/27/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, T11, 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, T1 1, T15, T16, M, T1, T4,T9
  • 58. T5 T7 -> T13 T7, T13, T12 , T2 , T6, T10, T1 1, T15, T16, M, T1, T4,T9, T3,T8T14
  • 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. many to many ? • Where do we go? • How to improve? -> Add result sizes
  • 68. Visual SQL Tuning (VST) Table Sizes Join Sizes Filter Ratios Exists
  • 70. 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
  • 71. 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;
  • 74. Where is the map?
  • 75. Comparing Plans : 24 hours to 5 mins NL NL NL NL HJ HJ NL NL
  • 76. 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' /
  • 78. 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;
  • 79. 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;
  • 81. Q3 81 6/27/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
  • 82. HINTS First join order • LEADING (tab_alias , table_alias … ) 10g (9i use ORDERED, not as good ) • NO_MERGE Then choose join type • USE_NL (table_alias) – Inner Table probed into (2cd in xplan not driving) • USE_HASH (table_alias) – Inner hash result probe into (1st in xplan) • INDEX (tab_alias index_name) (examples http://www.adp-gmbh.ch/blog/2008/01/17.php) 82 6/27/2013
  • 83. 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 ) */
  • 84. Y X LEADING(X,Y) USE_NL(Y) Nested Loops X and Y Select from X search in Y NL X Y
  • 85. Y Hash results LEADING(Y, X ) USE_HASH(Y) X Hash Join X and Y Select from X search in Y Hash HJ Y X
  • 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/27/2013 Parent Child Parent Child F F 30% 0.02% S A OD P ODT C OT O
  • 90. 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
  • 91. END
  • 94. 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;
  • 96. • Layout tables Graphically – Details tables above Masters – One to one relations side by side – Many to many any which way Many to single value
  • 97. 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 97 6/27/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
  • 98. 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
  • 99. 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
  • 100. 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
  • 101. 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
  • 102. Nest Loops left deep T1 T2 T3 T4 NL NL NL T1 T2 T3 T4 NL NL NL probed probed probed
  • 103. Nest Loops can’t be right deep T3 T4 T2 T1 NL T1 NL T2 NL T3 T4 probed probed probed NL NL NL
  • 104. 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 /
  • 105. Two Table Joins A B A B Left join B B(+) Right join B A(+) A B MAP MAP A Bo o
  • 106. Two Table Joins A B Left join B B(+) B returns no data, useless in Query Select a.* from a, b where b.field(+) = a.field; A B V A B V Multiplier o o ? Useless 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 B B Multiplier, Useless?
  • 107. 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
  • 108. 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
  • 109. Drawing Map – One to One / One to Many / Many to Many A BNA Bo BA A B A B – Outer Joins / Not Exists

Notas do 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; )