Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
(Versione 1.0)
1 Impostare lesercizio
1.1 Individuare i costi
Copiare la query in SQL Developer e (dopo aver premuto F10) osservare il piano daccesso
corrispondente.
A seconda delle operazioni svolte il costo totale :
con
, il
numero di operazioni di Join e considerando uguale a 0 il costo di un operazione che non viene
eseguita nel piano daccesso.
Partendo dalloperazione pi in basso del piano daccesso, calcolare ogni singolo costo.
1.2 Valori standard
Nel compito, i seguenti valori sono indicati nella traccia dellesercizio:
1.3 Join concatenati
In caso di Join concatenati, ovvero , si ha nel costo di accesso due
operazioni: e .
In questo paragrafo si vuole ricordare che .
Questa formula utile quando ci sono pi Join nella query da analizzare.
possibile reperire tramite la seguente query
SELECT COUNT(*)
FROM T1, T2
WHERE T1_ATTRIBUTO=T2_ATTRIBUTO
In caso ci fossero dei predicati su T1 e/o T2 vanno inseriti.
Costo(Totale) = Costo(Order_By) + Costo(Having) + Costo(Group_by) + Costo(Join
i
)
i=1
N
!
Costo(Join
i
) ! Costo(Nested_Loop), Costo(Sort_Merge_Join), Costo(Hash_Join) { } N
D, len(k), len(p), NB,
T
RIS
= T
1
!" T
2
!" T
3
T
12
= T
1
!" T
2
T
RIS
= T
12
!" T
3
NP
12
=
NT
12
! lunghezza(tupla
1
+ tupla
2
)
D!
"
#
#
$
%
%
NT
12
2 Costi di Join
2.1 Nested_Loop (NESTED LOOPS)
Identicare qual la tabella interna (S) e qual quella esterna (R). [1]
Calcolare gli di entrambe le tabelle. [2]
Se non ci sono predicati sugli attributi della tabella esterna
Calcolare i costi daccesso alle tabelle, [3]
altrimenti , dopo aver identicato selettivit dei predicati [5], si
Calcolare il costo daccesso alla tabella R, [3]
con
in caso di accesso TABLE ACCESS FULL
in caso di accesso TABLE ACCESS BY INDEX
Vericare la tipologia di indice sulla tabella S, [4]
in caso di indice clustered
nel caso sia unclustered [10]
con riferito allattributo di Join
Per trovare seguire i seguenti passi: [6] [7] [8]
2.2 Sort_Merge_Join (MERGE JOIN)
Identicare qual la tabella interna (S) e qual quella esterna (R). [1]
Calcolare gli di entrambe le tabelle. [2]
Calcolare i costi daccesso alle tabelle. [3]
Controllare se le tabelle sono ordinate: per eseguire un Sort_Merge_Join le tabelle devono essere
ordinate. Quando una tabella non lo , ORACLE lancia un SORT JOIN provvedendo ad
ordinarla.
NP
Costo(Nested_Loop) = NP
R
+ NR
R
! NP
S
Costo(Nested_Loop) = NP
R
+ sel(predicato
R
) ! NR
R
! Costo(S)
Costo(S)= NP
S
Costo(S)= h !1+
NL
S
NK
S
"
#
#
$
%
%
+
NP
S
NK
S
"
#
#
$
%
%
Costo(S) = h !1+
NL
S
NK
S
"
#
#
$
%
%
+ &
NR
S
NK
S
, NP
S
'
(
)
*
+
,
NK
S
h, NL
S
, NK
S
NP
Se non ce stato ordinamento il costo
altrimenti
con
2.3 Hash Join (HASH JOIN)
Identicare qual la tabella interna (S) e qual quella esterna (R). [1]
Calcolare gli di entrambe le tabelle. [2]
Calcolare i costi daccesso alle tabelle. [3]
Se si tratta di Hash_Join
altrimenti un Hybrid_Hash_Join
se non ci sono selettivit sulle tabelle
se ci sono selettivit solo sulla tabella R
se ci sono selettivit solo sulla tabella S
se ci sono selettivit su entrambe le tabelle
con .
Costo(Sort _Merge_ Join) = NP
R
+ NP
S
Costo(Sort _Merge_ Join) = NP
R
+ NP
S
+ Sort(R) + Sort(S)
Costo(R) = Costo(Sort _Merge) = 2NP
R
( log
NB!1
(NP
R
) "
#
$
%
+1)
Costo(S) = Costo(Sort _Merge) = 2NP
S
( log
NB!1
(NP
S
) "
#
$
%
+1)
NP
NP
R
+ NP
S
! NB
Costo(Hash_ Join) = NP
R
+ NP
S
Costo(Hash_ Join) = 3 ( NP
R
+ NP
S
)
Costo(Hash_ Join) = NP
R
+ NP
S
+ 2(EP
R
+ NP
S
)
Costo(Hash_ Join) = NP
R
+ NP
S
+ 2(NP
R
+ EP
S
)
Costo(Hash_ Join) = NP
R
+ NP
S
+ 2(EP
R
+ EP
S
)
EP
R/S
= NP
R/S
! (sel(p
1
)
R/S
!... ! sel(p
n
)
R/S
)
3 Costi di ordinamento e ltraggio
3.1 Group_by (SORT GROUP BY - SORT GROUP BY NOSORT)
Loperazione di Group_by impone un costo aggiuntivo pari al costo dellordinamento.
In caso di SORT GROUP BY il costo
in caso di SORT GROUP BY NOSORT o (lordinamento viene svolto in memoria
interna) il costo
indica il numero di pagine occupate da tutte le tuple considerate nelloperazione di Group_by.
calcolato come
con
se non ci sono predicati sulle tabelle
se ci sono predicati
la somma delle lunghezze delle righe su cui opera il Group_By
Nota bene: indica il prodotto di tutti i predicati in gioco nella query
che interessano le tabelle a cui viene applicato il Group_By.
3.2 Having (FILTER)
LHaving applica un ltraggio sul Group_by. Lesecuzione introduce un costo di
con
calcolata sommando le lunghezze dei campi del SELECT
Costo(Group_by) = Costo(Sort _Merge) = 2NP
GB
! ( log
NB"1
(NP
GB
) #
$
%
&
+1)
NP
GB
! NB
Costo(Group_by) = NP
GB
NP
GB
NP
GB
=
NT
GB
! lunghezza(tuple
GB
)
D!
"
#
#
$
%
%
NT
GB
= NR
TABELLAMAX
NT
GB
= NR
TABELLAMAX
! (sel(p
1
)! sel(p
2
)!... ! sel(p
n
)) "
#
$
%
lunghezza(tuple
GB
)
(sel(p
1
)! sel(p
2
)!... ! sel(p
n
))
Costo(Having) =
NT
H
! len(tupla
H
)
D!
"
#
#
$
%
%
len(tupla
H
)
NT
H
= ! NT
GB
, ND
i
i=1
N
"
#
$
%
&
'
(
il valore calcolato precedentemente nel paragrafo 1.3.1
(il simbolo indica una produttoria)
identica il numero di tabelle in gioco nel Group_by
il massimo numero fra tutti i valori distinti degli attributi della tabella i-esima.
Per capire meglio si osservi i seguenti esempi:
con un operazione di GROUPBY C_CUSTKEY,C_NAME si ha che perch gli attributi sono
presi solo dalla tabella CUSTOMER, e sar il valore massimo tra il numero dei valori
distinti di C_CUSTKEY e quello di C_NAME.
con un operazione di GROUPBY PS_PARTKEY,N_NAME si ha che perch gli attributi
sono presi sia dalla tabella PARTSUPP e sia dalla tabella NATION. In questo caso, sar il
numero di valori distinti di PS_PARTKEY e sar il numero dei valori distinti di
N_NAME.
come ultimo esempio
con GROUPBY C_CUSTKEY,C_NAME, PS_PARTKEY, PS_SUPPKEY, N_NAME, si ha che
, sar il valore massimo tra il numero dei valori distinti di C_CUSTKEY e quello di
C_NAME, sar il valore massimo tra il numero dei valori distinti di PS_PARTKEY e
quello di PS_SUPPKEY e sar il numero dei valori distinti di N_NAME.
Per ottenere il numero dei valori distinti di un attributo di pu seguire il procedimento [8].
3.3 Order_By (ORDER BY)
Lesecuzione di un Order_By, applica un costo per il riordino che pu non essere considerato se
prima presente un GROUP BY con gli stessi attributi. Il costo :
con
la somma delle lunghezze delle righe su cui opera il Order_By.
sono il numero di tuple residue nali su cui opererebbe (o ha operato) il Group_By
reperibile in modo analogo all presentato nell 1.3.1.
identica il numero di tabelle in gioco nel Order_by.
il massimo numero fra tutti i valori distinti degli attributi della tabella i-esima.
NT
GB
ND
i
i=1
N
!
= ND
1
" ND
2
"..." ND
N !
N
ND
i
N =1
ND
1
N = 2
ND
1
ND
2
N = 3 ND
1
ND
2
ND
3
Costo(Order _by) = Costo(Sort _Merge) = 2NP
OB
! ( log
NB"1
(NP
OB
) #
$
%
&
+1)
NP
OB
=
NT
OB
! len(tupla
OB
)
D!
"
#
#
$
%
%
len(tupla
OB
)
NT
OB
= ! NT
RES
, ND
i
i=1
N
"
#
$
%
&
'
(
NT
RES
NT
GB
N
ND
i
Nota bene: in caso di GROUP BY prima del ORDER BY.
Se allora
NT
RES
= NT
GB
NP
OB
! NB
Costo(Order _By) = NP
OB
[1] TABELLA INTERNA/ESTERNA
Un operazione di join rende partecipi due tabelle, una identicata come esterna (R) e laltra come
interna (S). Valutare questa differenza importante nel caso del Nested_Loops, nelle altre
operazioni serve solo a rappresentare la distinzione fra le tabelle.
Per sapere qual la tabella esterna, seguire questi passi:
Osservare in (OBJECT_NAME) lindici delle tabelle -> per ogni indice, andare sulla cartella
Indici -> Sezione Colonne -> controllare COLUMN_NAME e TABLE_NAME.
Se lattributo in COLUMN_NAME uno degli attributi di Join nella query, allora la tabella
interna, altrimenti esterna. La tipologia della seconda tabella viene identicata per esclusione (se
una interna, laltra deve essere esterna, e viceversa).
Se entrambe le tabelle vengono accedute tramite TABLE ACCESS FULL allora viene considerata
esterna la prima tabella, che troviamo nel piano daccesso, dentro alloperazione di Join.
[2] NUMERO PAGINE
Nota bene:
[3] ACCESSO ALLA TABELLA
Nel caso dei Join, e (indicati nelle formule nei costi) non indicano esplicitamente il
numero di pagine delle tabelle rispettive ma il costo daccesso ad esse. In seguito indicheremo con
il costo daccesso alla generica tabella esterna (R) o interna (S) e con il numero di
pagine della stessa.
Se laccesso alla tabella risulta TABLE ACCESS FULL (accesso sequenziale) allora
Se laccesso TABLE ACCESS BY INDEX (accesso tramite indice)
Individuare il tipo di indice [3]
nel caso clustered
nel caso unclustered
Per trovare i valori da inserire seguire i seguenti passi: [6] [7] [8] [9]
NP =
NR! lunghezza(tupla)
D!
"
#
#
$
%
%
NR=NT
NP
S
NP
R
NP
R/S
NP
R/S
!
NP
R/S
= NP
R/S
!
NP
R/S
= h !1+
EK
R/S
NK
R/S
NL
R/S
"
#
#
$
%
%
+
EK
R/S
NK
R/S
NP
R/S
!
"
#
#
$
%
%
NP
R/S
= h !1+
EK
R/S
NK
R/S
NL
R/S
"
#
#
$
%
%
+ EK
R/S
& '
NR
R/S
NK
R/S
, NP
R/S
!
(
)
*
+
,
-
NL, NK, EK, h
[4] INDICE CLUSTERED/UNCLUSTERED
Andare sulla cartella Indici -> Sezione Colonne -> controllare COLUMN_NAME
Se tale attributo anche chiave della tabella che si sta considerando, allora lindice clustered,
altrimenti unclustered.
[5] CALCOLO DEI PREDICATI
Predicato = Predicato IN
Predicato < Predicato >
Predicato BETWEEN Predicato AND
Predicato OR
Per trovare NK [7], per trovare max/min [11]
[6] ALTEZZA DELLALBERO h
Individuare lindice della tabella a cui si calcola il costo in OBJECT_NAME e seguire i passaggi:
Andare sullindice individuato nella cartella Indici -> Sezione Statistiche -> Il valore nel campo
BLEVEL indica h-1.
[7] NUMERO FOGLIE ( ) DI INDICI B+TREE e BITMAP
Se un indice B+tree, il numero di foglie sar
Se un indice Bitmap, il numero di foglie sar
In generale, un indice B+Tree, a meno che si ha una B davanti al nome dellindice.
[8] NUMERO CHIAVI ( )
SQL DEVELOPER -> Cliccare sulla tabella desiderata -> Sezione Statistiche ->
il valore nella colonna NUM_DISTINCT corrispondente allattributo desiderato.
[9] ESTIMATED KEY ( )
In generale , se non ci sono predicati sullattributo, allora .
1
NK
n
NK
n ! min
max! min
max! n
max! min
n
2
! n
1
max! min
sel(p
1
)! sel(p
2
)
sel(p
1
) + sel(p
2
)
NL
NL =
NK! len(k) + NR !len(p)
D!
"
#
#
$
%
%
NL =
NK! len(k) +
NR! NR
8
D
"
#
#
#
#
$
%
%
%
%
NK
NK
EK
EK = NK ! sel(predicato) EK = NK
[10] FORMULA DI CARDENAS
con
[11] QUERY UTILI
SELECT MAX(ATTRIBUTO) SELECT MIN(ATTRIBUTO)
FROM TABELLA FROM TABELLA
[12] LUNGHEZZA MEDIA ATTRIBUTO
SQL DEVELOPER -> Cliccare sulla tabella desiderata -> Sezione Statistiche ->
la lunghezza (media) di unattributo il valore corrispondente nella colonna AVG_COL_LEN.
! ET, NP ( ) = NP" 1# 1#
1
NP
$
%
&
'
(
)
ET
$
%
&
'
(
)
ET=
NR
NK
TPC Benchmark D Standard Specification Revision 1.2.3 Page 8
Figure 2: The TPC-D Schema
PARTKEY
NAME
MFGR
BRAND
TYPE
SIZE
CONTAINER
COMMENT
RETAILPRICE
PARTKEY
SUPPKEY
AVAILQTY
SUPPLYCOST
COMMENT
SUPPKEY
NAME
ADDRESS
NATIONKEY
PHONE
ACCTBAL
COMMENT
TIMEKEY
ALPHA
YEAR
MONTH
WEEK
DAY
ORDERKEY
PARTKEY
SUPPKEY
LINENUMBER
RETURNFLAG
LINESTATUS
SHIPDATE
COMMITDATE
RECEIPTDATE
SHIPINSTRUCT
SHIPMODE
COMMENT
CUSTKEY
ORDERSTATUS
TOTALPRICE
ORDERDATE
ORDER-
PRIORITY
SHIP-
PRIORITY
CLERK
COMMENT
CUSTKEY
NAME
ADDRESS
PHONE
ACCTBAL
MKTSEGMENT
COMMENT
PART (P_)
SF*200K
PARTSUPP (PS_)
SF*800K
LINEITEM (L_)
SF*6000K
ORDER (O_)
SF*1500K
CUSTOMER (C_)
SF*150K
TIME (T_)
2557
SUPPLIER (S_)
SF*10K
ORDERKEY
NATIONKEY
EXTENDEDPRICE
DISCOUNT
TAX
QUANTITY
NATIONKEY
NAME
REGIONKEY
NATION (N_)
25
COMMENT
REGIONKEY
NAME
COMMENT
REGION (R_)
5
Legend:
The parentheses following each table name contain the prefix of the column names for that table;
The arrows point in the direction of the one-to-many relationships between tables;
Dashed lines represent optional tables and relationships;
The number/formula below each table name represents the cardinality (number of rows) of the table.
Some are factored by SF, the Scale Factor, to obtain the chosen database size (K means one thousand).
The cardinality for the LINEITEM table is approximate (see Clause 4.2.5).
NB: Gli attributi
sottolineati indicano le
chiavi delle rispettive