2009-05-05 18 views
7

Sto considerando l'aggiunta di un indice a una tabella Oracle, ma mi piacerebbe prima stimare la dimensione dell'indice dopo che è stato costruito (non ho bisogno di una dimensione precisa - solo una stima)Come posso stimare la dimensione di un indice Oracle?

Supponendo di avere accesso a tutti i metadati sulla tabella (numero di righe, colonne, tipi di dati di colonna, ecc.) Che posso eseguire qualsiasi query Oracle SQL arbitraria per ottenere dati aggiuntivi sullo stato corrente della tabella, e So cosa vorrei che fosse la definizione dell'indice, come posso stimare questa dimensione?

risposta

10

È possibile utilizzare questi Oracle Capacity planning and Sizing Spreadsheets.

Per qualcosa di non così in piena regola, se si desidera solo posteriore del tipo di busta rough estimates for the index:

calcolare la dimensione media di ciascuna delle delle colonne che compongono l'indice chiave e sommare i le colonne più un rowid e aggiungono 2 byte per l'intestazione della riga dell'indice per ottenere la dimensione della riga media. Ora aggiungere solo un po 'al valore PCTFREE per l'indice a venire con un overhead fattore, forse 1.125 per PCTFREE 10.

numero di righe della tabella indicizzati riga X medio len X 1.125

Nota: se l'indice contiene colonne Nulle , ogni riga della tabella potrebbe non apparire nell'indice. In un singolo indice di colonna in cui il 90% delle colonne è nullo, solo il 10% entrerebbe nell'indice .

Confrontare la stima con il metodo di allocazione del tablespace e regolare la risposta finale se necessario.

anche un fattore maggiore overhead può essere meglio come indice diventa più grande poiché più dati indicizzati più ramo blocchi necessaria per sostenere la struttura di indice e il calcolo realmente solo dati relativi blocchi foglia.

2

È possibile stimare le dimensioni di un indice eseguendo un explain plan sul istruzione CREATE INDEX:

create table t as 
    select rownum r 
    from dual 
    connect by level <= 1000000; 

explain plan for 
    create index i on t (r); 

select * 
from table(dbms_xplan.display(null, null, 'BASIC +NOTE')); 

PLAN_TABLE_OUTPUT                               
-------------------------------------------------------------------------------------------------------------------------------------------- 
Plan hash value: 1744693673                             

---------------------------------------                          
| Id | Operation    | Name |                          
---------------------------------------                          
| 0 | CREATE INDEX STATEMENT |  |                          
| 1 | INDEX BUILD NON UNIQUE| I |                          
| 2 | SORT CREATE INDEX |  |                          
| 3 | TABLE ACCESS FULL | T |                          
---------------------------------------                          

Note                                   
-----                                  
    - estimated index size: 4194K bytes  

un'occhiata alla sezione "Note" in fondo: dimensioni dell'indice stimato: 4194K byte

0

a partire dalla versione 10gR2 è possibile utilizzare DBMS_SPACE.CREATE_INDEX_COST

DBMS_SPACE.CREATE_INDEX_COST (
    ddl    IN VARCHAR2, 
    used_bytes  OUT NUMBER, 
    alloc_bytes  OUT NUMBER, 
    plan_table  IN VARCHAR2 DEFAULT NULL); 

Dalla documentazione: "Questa procedura determina il costo di creazione di un indice su una tabella esistente. L'input è l'istruzione DDL che verrà utilizzata per creare l'indice. La procedura genererà la memoria necessaria per creare l'indice."

Vedi https://docs.oracle.com/database/121/ARPLS/d_space.htm#ARPLS68101

Esempio (anche sqlfiddle):

DECLARE 
ub NUMBER; 
ab NUMBER; 
BEGIN 
DBMS_SPACE.CREATE_INDEX_COST (
    ddl    => 'CREATE INDEX x_1 ON t1 (a,b,c) TABLESPACE users', 
    used_bytes  => ub, 
    alloc_bytes  => ab 
    ); 
DBMS_OUTPUT.PUT_LINE('Used MBytes: ' || ROUND(ub/1024/1024)); 
DBMS_OUTPUT.PUT_LINE('Alloc MBytes: ' || ROUND(ab/1024/1024)); 
END; 
/

uscita:

Used MBytes: 1 
Alloc MBytes: 2 
+0

Solo 8 anni dopo ne avevo bisogno - ma, a portata di mano, comunque :) – Jared

Problemi correlati