2009-05-05 7 views
7

J'envisage d'ajouter un index à une table Oracle, mais je voudrais d'abord estimer la taille de l'index après sa construction (je n'ai pas besoin d'une taille précise - juste une estimation.)Comment puis-je estimer la taille d'un index Oracle?

Supposons que j'aie accès à toutes les métadonnées de la table (nombre de lignes, colonnes, types de données de colonne, etc.) que je puisse exécuter n'importe quelle requête SQL Oracle arbitraire pour obtenir des données supplémentaires sur l'état actuel de la table. Je sais ce que je voudrais que la définition d'index soit, comment puis-je estimer cette taille?

Répondre

10

Vous pouvez utiliser ces Oracle Capacity planning and Sizing Spreadsheets.

Pour quelque chose de pas tout à fait complet, si vous voulez juste en arrière du type d'enveloppe rough estimates for the index:

Calculer la taille moyenne de chacun des les colonnes qui composent l'index de clé et la somme des colonnes plus un rowid et ajoutez 2 octets pour l'en-tête de ligne d'index pour obtenir la taille moyenne des lignes. Maintenant, ajoutez juste un peu à la valeur PCTFREE pour l'index pour trouver un facteur frais généraux, peut-être 1.125 pour pctfree 10.

nombre de lignes de table indexées X avg rangée len X 1,125

Remarque - Si l'index contient des colonnes pouvant être annulées, chaque ligne de table ne peut pas apparaître dans l'index . Sur un seul index de colonne où 90% des colonnes sont nulles seulement 10% entreraient dans l'index .

Comparer l'estimation à l'étendue de tablespace méthode d'allocation et ajuster final répondre si nécessaire.

également un facteur plus important est peut-être en tête mieux que l'indice grossit depuis plus les données indexées plus branche blocs nécessaires pour soutenir la structure indice et le calcul vraiment les chiffres juste pour les blocs de feuilles.

2

Vous pouvez estimer la taille d'un index en exécutant un explain plan sur la 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  

Regardez la section "Note" en bas: taille de l'index estimé: 4194K octets

0

À partir de la version 10gR2 vous pouvez utiliser 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); 

De la documentation: "Cette procédure détermine le coût de création d'un index sur une table existante. L'entrée est l'instruction DDL qui sera utilisée pour créer l'index. La procédure générera le stockage requis pour créer l'index."

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

Exemple (également à 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; 
/

Sortie:

Used MBytes: 1 
Alloc MBytes: 2 
+0

seulement 8 ans après avoir besoin - mais, à portée de main, tout de même :) – Jared

Questions connexes