2009-05-05 15 views
7

Ich überlege, einen Index zu einer Oracle-Tabelle hinzuzufügen, aber ich möchte zuerst die Größe des Index nach seiner Erstellung schätzen (ich brauche keine genaue Größe - nur eine Schätzung.)Wie kann ich die Größe eines Oracle-Index schätzen?

Angenommen, ich habe Zugriff auf alle Metadaten über die Tabelle (Anzahl der Zeilen, Spalten, Spaltendatentypen usw.), die ich jede beliebige Oracle SQL-Abfrage ausführen kann, um zusätzliche Daten über den aktuellen Status der Tabelle zu erhalten, und Ich weiß, wie die Indexdefinition aussehen soll. Wie kann ich diese Größe schätzen?

Antwort

10

Sie können diese Oracle Capacity planning and Sizing Spreadsheets verwenden.

Für etwas nicht ganz so ausgewachsene, wenn Sie gerade von der Art Umschlag wollen rough estimates for the index:

Berechnen Sie die durchschnittliche Größe der einzelnen die Spalten, die den Index Schlüssel bilden und die Summe der Spalten plus eine rowid und fügen Sie 2 Bytes für die Indexzeile header hinzu, um die durchschnittliche Zeilengröße zu erhalten. Nun fügen nur ein wenig auf den pctfree Wert für der Index mit einem Overhead- Faktor zu kommen, vielleicht 1.125 für pctfree von 10.

Anzahl der indizierten Tabellenzeilen X avg Reihe len X 1,125

Hinweis - Wenn der Index NULL-fähige Spalten enthält, darf nicht jede Tabellenzeile im Index erscheinen . Auf einem einzelnen Spaltenindex, wo 90% der Spalten null sind, würden nur 10% in den Index eingehen.

Vergleichen Sie die Schätzung zu Tablespace Extent Zuweisungsmethode und anpassen endgültige beantworten, falls erforderlich.

auch ein größerer Overhead-Faktor besser sein kann als der Index desto mehr Daten größer, da bekommt die Index Struktur und die Berechnung wirklich nur Zahlen für Blatt blockiert den weiteren Zweig Blöcke notwendig zur Unterstützung indiziert.

2

Sie können die Größe eines Index Schätzung durch einen explain plan auf der Anweisung create index läuft:

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  

Blick auf die "Note" Abschnitt unten: geschätzte Indexgröße: 4194K Bytes

0

ab Version 10gR2 können Sie verwenden 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); 

Aus der Dokumentation: "Diese Prozedur bestimmt die Kosten für das Erstellen eines Index für eine vorhandene Tabelle. Die Eingabe ist die DDL-Anweisung, die zum Erstellen des Index verwendet wird. Die Prozedur gibt den zum Erstellen des Index erforderlichen Speicher aus."

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

Beispiel (auch bei 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; 
/

Ausgang:

Used MBytes: 1 
Alloc MBytes: 2 
+0

Nur 8 Jahre, nachdem ich es brauchte - aber, handlich, trotzdem :) – Jared

Verwandte Themen