Newsgroup: it.comp.software.database
Titolo: calcolo dello spazio degli indici

Salve a tutti,
dovrei fare una stima dello spazio occupato dagli indici di un database
Oracle che verrà messo in produzione tra non molto.
Ho eseguito un'analisi degli indici che esistono tuttora.
Ora dalla tabella dba_indexes quale campo devo usare per trovare la
dimensione media?
A presto,
Simone
"I'm a travelling man, I'm a drinking man, I'm a gentle when I'm sober"

 Simone
felice_pago
--------------------------------
Inviato via 
http://usenet.libero.it

 
1. Puoi controllare gli extent allocati per quell'indice
 select bytes/1024/1024 bytes, exetents
 from user_segments where segment_name='<NOME_INDICE'>
 Attenzione. In questo modo vedi lo spazio effettivamente
 allocato che però potrebbe anche essere vuoto.
2. L'indice per definizione contiene il valore della colonna
 indicizzata ed il rowid corrispondente. Facendo un calcolo
 approssimativo, potresti calcolare la dimensione della colonna
 ed aggiungere la metà del valore ottenuto
 SQL> select avg(vsize(SERVICEID))+
 	avg(vsize(SERVICEID))*1.5 dimensione from NOTIFICATION_DATA;
 
DIMENSIONE
----------
38.3443983
 Il tuo indice occupa circa 38,35 bytes.
3. Puoi fare un calcolo preciso. Leggi pagina A.5 del manuale
 Oracle7 Server Administrator's Guide, Release 7.3
In realtà ci sono tanti altri modi per calcolare la dimensione
 indici, ma dovrei mettrmeli a studiare (prima o poi lo farò).

 
Mi ero dimenticato di dell'nvl. Cmq, a rigor di logica, la funzione
 nvl va applicata alla colonna e non a vsize(colonna).
Domanda. PErché aggiungi 1 al risultato di vsize?

 Domanda. PErché aggiungi 1 al risultato di vsize?
AVG(NVL(VSIZE(PK_col_name),0)+1)
se lvsize(colonna) è 0, nvl mi restituisce 0.


 dimensione media?
Mi sbagliero' ma mi sembra che la dimensione di un record dell'indice,
a differenza di un record della tabella, sia fisso (per un motivo di
efficienza), e non venga mai sprecato spazio
In particolare, per i varchar2, e' pari alla lunghezza del record (per
questo motivo conviene spesso indicizzare solo l'inizio del varchar2)
Detto questo, ti calcoli la dimensione di un record dell'indice come
lo faresti per la dimensione di un record della tabella
Greetings,
Alessandro Trebbi
Pesaro, Italy
http://www.b3soft.com

 se lvsize(colonna) è 0, nvl mi restituisce 0.
Ed è giusto che restituisca 0 (zero). L'indice mantiene un 
 puntatore alla riga della tabella solo se questo ha valore
 non nullo.
 In soldoni, i null non sono nell'indice. E' per questo motivo
 che se nella query viene specificata la clausola 
	where <campo indicizzato> is null
oppure
	where <campo indicizzato> is not null
 l'rdbms fa un full table scan. In entrambi i casi Oracle non
 sa quali sono i valori nulli sono non interroga tutta la tabella.

 >

il problema è che se lo metto, come dovrebbe essere, su raw device è
un pò complicato cambiare la storage della tbs , e :
1 byte non si nega a nessuno :)
cmq per Simone,
grande IMHO, derivato da ...
a spanne se le storage sono calcolate "correttamente" ,
dovresti assegnare al tbs degli indici il 75% della dimensione del tbs dei
dati.
e tbs che difettano sulla percentuale, diciamo da 60%-80%, hanno sempre
sbilanciamenti di spazio insufficienti/eccessivi.


 un pò complicato cambiare la storage della tbs ,
non ho capito

 ha
scritto:

è il mio dramma :(
i datafile dovrebbero stare su raw-device, il che implica maggiore
velocità di accesso e di rimando maggiore difficoltà di gestione,
di tutti gli oggetti che ci finiscono sopra, quindi un pò di spazio
per futura gestione, calcolato però, serve a mettere l'anima
in pace.


 1 byte non si nega a nessuno :)
Ma il concetto di tablespace non serve proprio a rendere la vita
 + semplice?
Se creo una tabella in un tablespace, è l'rdbms che si preoccupa
 di gestire il segmento dati oracle all'interno del tablespace
 stesso. L'utente non se ne deve preoccupare.
 Il compito del dba è quello di creare inizialmente il ts su
 file system o raw device, ma questo è tutto.
Non capisco quindi il problema relativo al calcolo dello spazio
 allocato da una tabella o da un indice.

 allocato da una tabella o da un indice.
hai presente:
ORA-1654: unable to extend index
lo ottiene anche quando ti "scoppia" il tbs, e se sei su raw
non basta mica fare:
alter DATABASE DATAFILE '/dev/xxxx.dbf' RESIZE xxxx
certo un dba puň chiedere un nuovo raw al systemista,
ma se č anche data architect fŕ una figura barbina .


 ma se è anche data architect fà una figura barbina .
 
Capisco.
Ti chiedo scusa, ma non capivo cosa centrava la richiesta
 di calcolo di spazio di Simone con il problema dei raw device.

 di calcolo di spazio di Simone con il problema dei raw device.
non c'č proprio niente da scusarsi, solo che quando si parla di
storage bisogna andare con i piedi di piombo!
ho appena conosciuto un'azienda che previsti 10GB all'avvio
allo start si č trovata con 150 GB, ed erano su raw device !
solo per i dati e ciccia per gli indici.
per questo che io applico la regola del 75% per gli indici,
per fortuna che dalla 8i si possono muovere anche le table
:)
felice_pago
-


 
bhe, esiste anche l'opzione di partitioning nella versione
enterprise di oracle. Devo dire che è molto utile.

Vi ringrazio tutti,
scusatemi se non l'ho fatto prima ma ero a Roma per un corso ;)
Non volevo creare questa discussione ma mi è servita!
Grazie ancora per le vostre risposte.
