Sei sulla pagina 1di 12

SCHEMA ESERCIZIO COSTI LABORATORIO BASI DI DATI

(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

Potrebbero piacerti anche