Lezione1: Basic cost arithmetic (40 slides)
(
slide 1.6) A partire da Oracle 9i, l'obiettivo dell'ottimizzatore è stato modificato. E' adesso presente anche
"first_rows_N", dove N può essere 1, 10, 100, o 1000. In questo caso l'RDBMS "optimizes with a goal of best response time to
return the first n number of rows" (dal manuale
10gR2). Esiste
anche un equivalente HINT: "/*+ first_rows(n) */", dove n però può essere un qualunque intero.
La cosa interessante è che per uno statement del tipo:
select ...
from ...
WHERE ROWNUM < N
Oracle 10g si accorege che vogliamo le prime N righe e lo trasforma in:
select /*+ first_rows(n) */ ...
from ...
WHERE ROWNUM < N
Questo vuol dire che a seguito di un upgrade del database, il comportamento cambia ottenendo risultati inattesi.
Durante il seminario, Lewis ha precisato più volte che non bisogna più utilizzare come obiettivo "first_rows", che tra l'altro è stato
deprecato in 9i, ma quanto piuttosto proprio il "first_rows_N". Il motivo, anche se non detto durante i 2 giorni, lo si può trovare
nell'
errata corrige al primo capitolo del suo libro.
(
slide 1.7) A partire da Oracle 9i, è stato introdotto un nuovo tipo di costo: CPU Costing. Le statistiche possono
essere raccolte
sempre con il package DBMS_STATS. La procedura è la seguente (come indicato nelle slide):
dbms_stats.gather_system_stats('start')
-- allow some time for typical processing
dbms_stats.gather_system_stats('stop')
Di fatto, possiamo dire che le statistiche di sistema, misurano le performance di sistema durante la loro raccolta. Talvota però, queste
statistiche possono risultare falsate. Il motivo viene descritto in un
articolo scritto da Lewis stesso (di seguito riporto un piccolissimo estratto):
This is a particular problem in a SAN environment, as SANs tend to have very good algorithms for handling high volume reads, using
predictive read-ahead methods to pre-load the SAN cache.
Se le statistiche risultano errate, è possibile utilizzare tools esterni. Sul sito www.iozone.org è possibile trovarne uno, oppure
utilizzarne uno equivalente della Oracle stessa: Orion.
(slide 1.8)