Sei sulla pagina 1di 12

SCHEMA “ESERCIZIO COSTI” LABORATORIO BASI DI DATI (Versione 1.0)!

! 1 Impostare l’esercizio ! ! ! ! 1.1 Individuare i costi! !
!
1 Impostare l’esercizio !
!
!
!
1.1
Individuare i costi!
!

Copiare la query in SQL Developer e (dopo aver premuto “F10”) osservare il piano d’accesso corrispondente. !

A seconda delle operazioni svolte il costo totale è: !

!

Costo(Totale) = Costo(Order_By) + Costo(Having) + Costo(Group_by) +

"

N

i =1

Costo(Join i )

!

il

numero di operazioni di Join e considerando uguale a 0 il costo di un operazione che non viene eseguita nel piano d’accesso. !

Costo(Join i ) {Costo(Nested_Loop),Costo(Sort_Merge_Join), Costo(Hash_Join)}

,

"

N

Partendo dall’operazione più in basso del piano d’accesso, calcolare ogni singolo costo. !

Valori standard !

Nel compito, i seguenti valori sono indicati nella traccia dell’esercizio: "

D, len ( k ), len ( p ), NB, µ

!

“Join concatenati” !

In caso di “Join concatenati”, ovvero "

operazioni: "

T RIS = T 1 ▹◃ T 2 ▹◃ T 3

. !

T 12 = T 1 ▹◃ T 2

e "

T RIS = T 12 ▹◃ T 3

,

si

ha nel costo

di accesso

In

questo paragrafo si vuole ricordare che "

NP 12 =

NT 12 lu n g h ezza ( tu p la 1 + tu p la 2 )

⎥ ⎥

D µ

. !

due

Questa formula è utile quando ci sono più Join nella query da analizzare. !

possibile reperire "

NT 12

tramite la seguente query!

SELECT COUNT(*) ! FROM T1, T2! WHERE T1_ATTRIBUTO=T2_ATTRIBUTO !

caso ci fossero dei predicati su T1 e/o T2 vanno inseriti. !

2 Costi di Join !

! ! ! 2.1 Nested_Loop (NESTED LOOPS) ! !
!
!
!
2.1
Nested_Loop (NESTED LOOPS) !
!

Identificare qual’è la tabella interna (S) e qual’è quella esterna (R). [1] !

Calcolare gli " NP di entrambe le tabelle. [2]! ! Se non ci sono predicati
Calcolare gli "
NP
di entrambe le tabelle. [2]!
!
Se non ci sono predicati sugli attributi della tabella esterna!
!
!
Calcolare i costi d’accesso alle tabelle, [3] !
!
"
Co sto ( Nested _ Lo o p ) =
NP R
+ NR R ⋅ NP S
!
!
altrimenti , dopo aver identificato selettività dei predicati [5], si !
!
!
Calcolare il costo d’accesso alla tabella R, [3] !
!
"
Co sto ( Nested _ Lo o p ) = NP R + sel( p red icato R ) ⋅ NR R ⋅ Co sto (S )
!
!
!
!
con !
!
!
in caso di accesso “TABLE ACCESS FULL”!
!
!!!
"
Co sto (S ) = NP S
!
!
!
!
in caso di accesso “TABLE ACCESS BY INDEX” !
!
!!! Verificare la tipologia di indice sulla tabella S, [4] ! ⎡ NL S ⎤
!!!
Verificare la tipologia di indice sulla tabella S, [4] !
NL S ⎤ ⎡ NP S ⎤
!!!
"
Co sto (S ) = h − 1 +
in caso di indice clustered!
⎥ +
NK S
NK S
⎛ NR S
!!!
"
Co sto (S ) = h − 1 +
⎡ NL S ⎤ ⎥ + Φ
, NP S
nel caso sia unclustered [10] !
NK S
NK S
!!!
con "
NK S
riferito all’attributo di Join !
!
Per trovare "
h, NL S , NK S
seguire i seguenti passi: [6] [7] [8]!
!
!
!
2.2
Sort_Merge_Join (MERGE JOIN) !
!
Identificare qual’è la tabella interna (S) e qual’è quella esterna (R). [1] !
Calcolare gli "
NP
di entrambe le tabelle. [2]!
Calcolare i costi d’accesso 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. !
!
!

Se non c’e’ stato ordinamento il costo è!

Co sto (So rt _ Merg e _ Jo in )

=

NP R + NP S

!

Co sto (So rt _ Merg e _ Jo in ) = NP R + NP S + So rt ( R ) + So rt (S )

!

Co sto ( R ) = Co sto (So rt _ Merg e ) = 2 NP R ( lo g NB1 ( NP R

) + 1)

) + 1)

Co sto (S ) = Co sto (So rt _ Merg e ) = 2 NP S ( lo g NB1 ( NP S

2.3 Hash Join (HASH JOIN) !

Identificare qual’è la tabella interna (S) e qual’è quella esterna (R). [1] !

Calcolare gli "

Calcolare i costi d’accesso alle tabelle. [3] !

NP

di entrambe le tabelle. [2]!

!

!

! Se " NP R + NP S ≤ NB si tratta di Hash_Join !
!
Se "
NP R + NP S ≤ NB
si tratta di Hash_Join !
!
!
"
Co sto ( Hash _ Jo in ) = NP R +
NP S
!
!
altrimenti è un Hybrid_Hash_Join!
!
!
se non ci sono selettività sulle tabelle!
!
!
!
"
Co sto ( Hash _ Jo in ) =
3 ( NP R +
NP S )
!
!
!
se ci sono selettività solo sulla tabella R !
!
!
!
!
"
Co sto ( Hash _ Jo in ) = NP R + NP S + 2 ( EP R + NP S )
!
!
!
se ci sono selettività solo sulla tabella S !
!!!
!
!
!
"
Co sto ( Hash _ Jo in ) = NP R + NP S + 2 ( NP R + EP S )
!
!
!
se ci sono selettività su entrambe le tabelle!
!
!
!
"
Co sto ( Hash _ Jo in ) = NP R + NP S + 2 ( EP R + EP S )
!
!
con "
EP R / S = NP R / S ⋅ (sel( p 1 ) R / S ⋅
⋅ sel( p n ) R / S )
. !
!
!
!

3 Costi di ordinamento e filtraggio !

Group_by (SORT GROUP BY - SORT GROUP BY NOSORT) !

L’operazione di Group_by impone un costo aggiuntivo pari al costo dell’ordinamento. ! In caso di SORT GROUP BY il costo è!

Co sto (Gro u p _ b y ) = Co sto (So rt _ Merg e ) = 2 NP GB ( ⎡ ⎢ lo g NB1 ( NP GB

"

NP GB NB

)

+ 1)

!

in caso di SORT GROUP BY NOSORT o " interna) il costo è!

(l’ordinamento viene svolto in memoria

Co sto (Gro u p _ b y ) = NP GB

"

!

indica il numero di pagine occupate da tutte le tuple considerate nell’operazione di Group_by.

NP GB

È calcolato come!

NP GB =

"

con !

!

!

NT GB lu n g h ezza ( tu p le GB )

D µ

!

NT GB = NR TABELLAMAX

"

"

NT GB =

se non ci sono predicati sulle tabelle!

sel( p n ))

NR TABELLAMAX (sel( p 1 ) sel( p 2 )

se ci sono predicati!

lu n g h ezza ( tu p le GB )

"

è la somma delle lunghezze delle righe su cui opera il Group_By!

! ! Nota bene: "

che interessano le tabelle a cui viene applicato il Group_By. !

(sel( p 1 ) sel( p 2 )

sel( p n ))

indica il prodotto di tutti i predicati in gioco nella query

Having (FILTER) !

L’Having applica un filtraggio sul Group_by. L’esecuzione introduce un costo di !

Co sto ( Hav in g ) =

con !

NT H len (tu p la H )

D µ

!

"

"

len ( tu p la H )

calcolata sommando le lunghezze dei campi del “SELECT”!

NT H

= Φ

NT GB ,

N

i

=1

ND i

!

! ! " è il valore calcolato precedentemente nel paragrafo 1.3.1 !! ! NT GB
!
!
"
è il valore calcolato precedentemente nel paragrafo 1.3.1 !!
!
NT GB
N
!
"
ND i = ND 1 ⋅ ND 2 ⋅
⋅ ND N
(il simbolo "
indica una “produttoria”) !
i
=1
!
"
N
identifica il numero di tabelle in gioco nel Group_by !
!
"
ND i
è 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
N = 1
presi solo dalla tabella “CUSTOMER”, e " sarà il valore massimo tra il numero dei valori
ND 1
distinti di “C_CUSTKEY” e quello di “C_NAME”. !
!
con un operazione di GROUPBY PS_PARTKEY,N_NAME si ha che " perché gli attributi
N = 2
sono presi sia dalla tabella “PARTSUPP” e sia dalla tabella “NATION”. In questo caso, " sarà il
ND 1
numero di valori distinti di “PS_PARTKEY” e "
“N_NAME”. !
ND 2
sarà il numero dei valori distinti di
!
come ultimo esempio !
con GROUPBY C_CUSTKEY,C_NAME, PS_PARTKEY, PS_SUPPKEY, N_NAME, si ha che
"
N = 3 ND 1
, " 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
ND 2
quello di “PS_SUPPKEY” e " sarà il numero dei valori distinti di “N_NAME”. !
ND 3
!
Per ottenere il numero dei valori distinti di un attributo di può seguire il procedimento [8]. !
!
!
!
3.3 Order_By (ORDER BY)!
!
L’esecuzione 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 è:!
!
!
"
Co sto (Ord er _ b y ) = Co sto (So rt _ Merg e ) = 2 NP OB ⋅ ( ⎡ ⎢ lo g NB−1 ( NP OB
)
⎤ ⎥ + 1)
!
!
!
!
con !
⎡ NT OB ⋅ len (tu p la OB ) ⎤
!
"
NP OB =
!
D ⋅ µ
!
"
len ( tu p la OB )
è la somma delle lunghezze delle righe su cui opera il Order_By.!
N
!
"
NT OB = Φ
⎝ ⎜ NT RES ,
ND i
!
i
=1
!
" sono il numero di tuple residue finali su cui opererebbe (o ha operato) il Group_By
NT RES
!
reperibile in modo analogo all’ "
presentato nell’ 1.3.1. !
NT GB
!
"
N
identifica il numero di tabelle in gioco nel Order_by. !
!
"
ND i
è il massimo numero fra tutti i valori distinti degli attributi della tabella i-esima. !
Nota bene: " in caso di GROUP BY prima del ORDER BY. ! NT RES
Nota bene: "
in caso di GROUP BY prima del ORDER BY. !
NT RES = NT GB
!
Se "
NP OB ≤ NB
allora!
!
!
"
Co sto (Ord er _ By ) = NP OB
!

[1] TABELLA INTERNA/ESTERNA !

! Un operazione di join rende partecipi due tabelle, una identificata come esterna (R) e
!
Un operazione di join rende partecipi due tabelle, una identificata come esterna (R) e l’altra 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) l’indici delle tabelle -> per ogni indice, andare sulla cartella
“Indici” -> Sezione “Colonne” -> controllare “COLUMN_NAME” e “TABLE_NAME”. !
!
Se l’attributo in “COLUMN_NAME” è uno degli attributi di Join nella query, allora la tabella è
interna, altrimenti è esterna. La tipologia della seconda tabella viene identificata per esclusione (se
una è interna, l’altra 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 d’accesso, dentro all’operazione di Join. !
!
[2] NUMERO PAGINE!
!
⎡ NR ⋅ lu n g h ezza ( tu p la ) ⎤
"
NP =
!
D ⋅ µ
!
Nota bene: "
NR=NT
!
!
[3] ACCESSO ALLA TABELLA !
!
Nel caso dei Join, " e " (indicati nelle formule nei costi) non indicano esplicitamente il
NP S
NP R
numero di pagine delle tabelle rispettive ma il costo d’accesso ad esse. In seguito indicheremo con
!
"
il costo d’accesso alla generica tabella esterna (R) o interna (S) e con "
il numero di
NP R / S
NP R / S
pagine della stessa. !
Se l’accesso alla tabella risulta “TABLE ACCESS FULL” (accesso sequenziale) allora !
!
!
!
"
!
NP R / S = NP R / S
!
Se l’accesso è TABLE ACCESS BY INDEX (accesso tramite indice) !
!
!
Individuare il tipo di indice [3]!
⎡ EK R / S
EK R / S
!
!
!
"
h
− 1 +
nel caso clustered !
NP R / S =
⎢ NK R / S
⎥ +
NL R / S
NP R / S
NK R / S
⎡ EK R / S
NR R / S
!
!
!
"
h − 1 +
+ EK R / S ⋅ Φ
NP R / S =
⎢ NK R / S
, NP R / S
NL R / S
⎟ nel caso unclustered !
NK R / S
!
Per trovare i valori "
NL , NK , EK , h
da inserire seguire i seguenti passi: [6] [7] [8] [9]!
!
!
!
!

[4] INDICE CLUSTERED/UNCLUSTERED !

! ! ! Predicato “=“!! ! Predicato “<”!!
!
!
!
Predicato “=“!!
!
Predicato “<”!!

Andare sulla cartella “Indici” -> Sezione “Colonne” -> controllare “COLUMN_NAME”! Se tale attributo è anche chiave della tabella che si sta considerando, allora l’indice è clustered, altrimenti è unclustered. !

[5] CALCOLO DEI PREDICATI!

!

1

Predicato “IN”!!

n " !
n
"
!

NK

max n

Predicato “>”!!

 
 

max min

Predicato “AND”!

sel( p 1 ) sel( p 2 )

" !! ! NK n − min " ! ! max − min n 2
"
!!
!
NK
n − min
"
!
!
max − min
n 2 − n 1
"
!
!
max − min
"
sel( p 1 ) + sel( p 2 )
!

!

Predicato “BETWEEN”!

!

Per trovare NK [7], per trovare max/min [11]!

[6] ALTEZZA DELL’ALBERO “h”!

Individuare l’indice della tabella a cui si calcola il costo in “OBJECT_NAME” e seguire i passaggi:!

Andare sull’indice individuato nella cartella “Indici” -> Sezione “Statistiche” -> Il valore nel campo “BLEVEL” indica h-1. !

NL

) DI INDICI B+TREE e BITMAP !

NL =

NL =

NK len ( k ) + NR len ( p )

D µ

NK len ( k ) + NR NR

8

D

!

!

[7] NUMERO FOGLIE ("

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 dell’indice.!

NK

!

)

[8] NUMERO CHIAVI ("

SQL DEVELOPER -> Cliccare sulla tabella desiderata -> Sezione “Statistiche” -> !

è il valore nella colonna NUM_DISTINCT corrispondente all’attributo desiderato. !

EK

)!

, se non ci sono predicati sull’attributo, allora "

[9] ESTIMATED KEY ( "

EK = NK sel( p red icato )

EK = NK

!

.

[10] FORMULA DI CARDENAS !

Φ ( ET,

NP ) = NP

1

1

1

NP

ET

con "

ET = NR NK

!

[11] QUERY UTILI !

! FROM TABELLA !! ! ! FROM TABELLA !

SELECT MAX(ATTRIBUTO) !

SELECT MIN(ATTRIBUTO)!

[12] LUNGHEZZA MEDIA ATTRIBUTO !

SQL DEVELOPER -> Cliccare sulla tabella desiderata -> Sezione “Statistiche” -> ! la lunghezza (media) di un’attributo è il valore corrispondente nella colonna AVG_COL_LEN. !

Figure 2: The TPC-D Schema

PART (P_) PARTSUPP (PS_) LINEITEM (L_) ORDER (O_) SF*200K SF*800K SF*6000K SF*1500K PARTKEY PARTKEY ORDERKEY
PART (P_)
PARTSUPP (PS_)
LINEITEM (L_)
ORDER (O_)
SF*200K
SF*800K
SF*6000K
SF*1500K
PARTKEY
PARTKEY
ORDERKEY
ORDERKEY
NAME
SUPPKEY
PARTKEY
CUSTKEY
MFGR
AVAILQTY
SUPPKEY
ORDERSTATUS
BRAND
SUPPLYCOST
LINENUMBER
TOTALPRICE
TYPE
COMMENT
QUANTITY
ORDERDATE
ORDER-
SIZE
EXTENDEDPRICE
CUSTOMER (C_)
PRIORITY
SF*150K
CONTAINER
DISCOUNT
CLERK
CUSTKEY
RETAILPRICE
TAX
SHIP-
NAME
PRIORITY
COMMENT
RETURNFLAG
ADDRESS
COMMENT
LINESTATUS
SUPPLIER (S_)
NATIONKEY
SF*10K
SHIPDATE
TIME (T_)
PHONE
SUPPKEY
2557
COMMITDATE
ACCTBAL
NAME
TIMEKEY
RECEIPTDATE
MKTSEGMENT
ADDRESS
ALPHA
SHIPINSTRUCT
COMMENT
NATIONKEY
YEAR
SHIPMODE
PHONE
NATION (N_)
MONTH
COMMENT
25
ACCTBAL
WEEK
NATIONKEY
REGION (R_)
COMMENT
5
DAY
NAME
REGIONKEY
REGIONKEY
NAME
COMMENT
COMMENT

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).

TPC Benchmark™ D

Standard Specification Revision 1.2.3

Page

8

! !
! !
! !

!

!

! !
! !
! !
! !
! ! !
!
!
!
! ! !