ESTIMAR ESPACIO TABLA O INDICE
Desde Oracle 10g el paquete DBMS_SPACE incluye los procedimientos
CREATE_TABLE_COST y CREATE_INDEX_COST, que permiten estimar el tamaño necesario para una tabla y un índice, respectivamente.Los datos básicos necesarios para estimar el tamaño de una tabla con CREATE_TABLE_COST son:
Sin embargo, para estimar el tamaño de un índice, tan sólo es necesaria la sentencia DDL básaica de
creación del índice: "CREATE INDEX nombre_indice ON nombre de tabla (col1, ...)", pero la tabla sobre la que queremos crear dicho índice, debe de existir (de hecho va en el DDL del índice).
Ambos procedimientos, CREATE_TABLE_COST y CREATE_INDEX_COST, tienen 2 parámetros de salida:
queremos hacer la estimación basándonos en un número de filas mayor al real, tendremos que usar previamente DBMS_STATS.SET_TABLE_STATS para indicar el número de filas que tendrá la tabla (ver último ejemplo). Ejemplos:Supongamos que queremos estimar el tamaño de una tabla que ya hemos creado de prueba, cuya longitud media de filaes 27, siendo su PCTFREE 10, y que albergará 1 millón de filas en el tablespace SEGAUTO:
SET SERVEROUTPUT ON
DECLARE ub NUMBER; ab NUMBER; BEGIN DBMS_SPACE.CREATE_TABLE_COST('SEGAUTO',27,1000000,10,ub,ab); DBMS_OUTPUT.PUT_LINE('Alloc Bytes: ' || TO_CHAR(ab)); END; / Alloc Bytes: 35932160 Procedimiento PL/SQL terminado correctamente.
Ahora supongamos que queremos estimar el tamaño de la tabla anterior sin crearla previamente, sabiendo qué
columnas la componen, y que el tendrá 3 millones de filas en el tablespace SEGAUTO con un PCTFREE de 10:
SET SERVEROUTPUT ON
DECLARE ub NUMBER; ab NUMBER; cl sys.create_table_cost_columns; BEGIN cl := sys.create_table_cost_columns(sys.create_table_cost_colinfo('VARCHAR2',10), sys.create_table_cost_colinfo('VARCHAR2',30), sys.create_table_cost_colinfo('VARCHAR2',50), sys.create_table_cost_colinfo('NUMBER',6), sys.create_table_cost_colinfo('DATE',NULL)); DBMS_SPACE.CREATE_TABLE_COST('SEGAUTO',cl,3000000,10,ub,ab); DBMS_OUTPUT.PUT_LINE('Alloc Bytes: ' || TO_CHAR(ab)); END; / Alloc Bytes: 236308480 Procedimiento PL/SQL terminado correctamente.
Finalmente, supongamos que ya hemos creado la tabla, y que queremos estimar el tamaño de un posible índice
sobre la columna C1, pero la tabla tiene sólo 100 filas de prueba, y queremos estimar el tamaño del índice como si tuviese 2 millones de filas:
SET SERVEROUTPUT ON
DECLARE
ub NUMBER;ab NUMBER; ics VARCHAR2(240); BEGIN dbms_stats.set_table_stats(ownname => user, tabname => 'TABLA04', numrows => 2000000); ics := 'create unique index uk_tabla04 on tabla04 (c1)'; DBMS_SPACE.create_index_cost(ics, ub, ab); DBMS_OUTPUT.PUT_LINE('Alloc Bytes: ' || TO_CHAR(ab)); END; / Alloc Bytes: 52428800 Procedimiento PL/SQL terminado correctamente. Referencias:
|
Comentarios
Publicar un comentario