2009-05-05 57 views
7

Estoy considerando agregar un índice a una tabla de Oracle, pero me gustaría primero estimar el tamaño del índice una vez que se ha construido (no necesito un tamaño preciso, solo una estimación)¿Cómo puedo calcular el tamaño de un índice de Oracle?

Supongamos que tengo acceso a todos los metadatos sobre la tabla (número de filas, columnas, tipos de datos de columna, etc.) que puedo ejecutar cualquier consulta SQL de Oracle arbitraria para obtener datos adicionales sobre el estado actual de la tabla, y Sé lo que me gustaría que sea la definición del índice, ¿cómo puedo estimar este tamaño?

Respuesta

10

Puede usar estos Oracle Capacity planning and Sizing Spreadsheets.

Para algo no tan en toda regla, si lo que desea volver del tipo de sobre rough estimates for the index:

calcular el tamaño promedio de cada uno de las columnas que componen el índice de clave y la suma del las columnas más un rowid y agregan 2 bytes para el encabezado de fila de índice para obtener el tamaño de fila promedio. Ahora agregue sólo un poco al valor pctfree para el índice de llegar a un factor de sobrecarga, tal vez 1.125 para pctfree de 10.

número de filas de la tabla indexado fila X promedio len X 1.125

Nota: si el índice contiene nulos de columnas, entonces cada fila de tabla puede no aparecer en el índice . En un solo índice de columna donde el 90% de las columnas son nulas, solo el 10% entraría en el índice .

Comparar la estimación con el espacio de tabla extensión método de asignación y ajuste la respuesta final si es necesario.

También un factor de sobrecarga y mayores pueden ser mejor que el índice se hace más grande desde los más datos indexados la rama más bloques necesarios para apoyar la estructura del índice y el cálculo realmente solo cifras de bloques de hojas.

2

Se puede estimar el tamaño de un índice mediante la ejecución de un explain plan en la sentencia de creación de índice:

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  

vistazo a la sección "Nota" en la parte inferior: tamaño del índice estimado: 4194K bytes

0

partir de la versión 10gR2 puede utilizar 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 los documentos: "Este procedimiento determina el costo de crear un índice en una tabla existente. La entrada es la declaración DDL que se usará para crear el índice. El procedimiento generará el almacenamiento requerido para crear el índice."

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

Ejemplo (también en 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; 
/

Salida:

Used MBytes: 1 
Alloc MBytes: 2 
+0

Sólo 8 años después de que lo necesitaba - pero, práctico, sin embargo :) – Jared

Cuestiones relacionadas