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:
  • el nombre del tablespace donde queremos crear la tabla, así como
  • el número de filas que tendrá la tabla en cuestión.
  • Para completar el proceso tenemos 2 opciones: 
    • indicar longitud media de la fila (por ejemplo en el caso de que se trate de una tabla que ya existe,
      podemos sacarlo, si las estadísticas están actualizadas,
      de la columna USER_TABLES.AVG_ROW_LEN para la tabla en cuestión); o bien,
    • indicar el tipo y longitud de cada columna, usando una variable
      del tipo SYS.CREATE_TABLE_COST_COLMNS.
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:
  • used_bytes: el espacio en bytes estrictamente necesario para los datos de la tabla/índice, y
  • alloc_bytes: el espacio real en bytes necesario para el objeto en el tablespace en cuestión.
OJO, pues en el caso de querer estimar el tamaño de un índice, la tabla debe existir previamente, de modo que si
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 fila
es 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

Entradas populares de este blog

iscsiadm - Linux man page

T-SQL: Listar todas las tablas de una base de datos con sus respectivos tamaños