martes, 27 de diciembre de 2011

PCTFREE y PCTUSED


PCTFREE y PCTUSED son parámetros que nos permite especificar comportamientos de almacenamiento de los bloques de datos. Se los configura a nivel de tabla durante la creación o posterior a la creación.
PCFREE: Especifica cuál es la cantidad de espacio que se deberá dejar libre en el bloque para las futuras actualizaciones que se vayan a realizar en los registros previamente almacenados en el bloque. Esto quiere decir que Oracle insertará registros en el bloque hasta que se llegue al % especificado en el PCFREE para las futuras actualizaciones de los registros que se encuentran en el bloque y tamaño puede aumentar, con esto se evita la migración de datos.
PCTUSED: Especifica cuanto espacio disponible debe de haber para realizar nuevas inserciones después de que el bloque llego a su máxima capacidad definida por el PCTFREE. Supongamos que tenemos un PCTFREE de 10% para una tabla y un PCTUSED de 60%, cuando realizamos inserciones se realizaran hasta llegar a 10% libre del bloque, pero que pasa después de que realizamos borrados de filas, este bloque queda disponible para inserciones de nuevos registros? Pues el bloque se pondrá disponible para inserciones hasta que se llegue un valor usado definido por el PCTUSED, es decir cuando llegue a un 60%

En una base de datos es muy importante poder establecer este parámetro al momento de crear una tabla o tener en cuenta poder modificarlo según la evaluación que le demos a la tabla. Que deberíamos considerar para definir el PCTFREE? Según el tipo de transacciones SQL(Insert, delete o update) que se le aplique a la tabla.
  • Si es una tabla log, histórica que solo se aplican transacciones Insert debería tener un PCTFREE de 0%.
  • Si es una tabla que sirve como data warehouse el PCTFREE deberá configurarse con 0%.
  • Si es una tabla transaccional que sufre de inserts, update y delete deberá configurarse un PCTFREE superior a 0%.
En el caso de tablas transaccionales que sufren de inserts, updates y deletes el PCTFREE deberá configurarse con un valor de acuerdo a un previo análisis que dependerá de la cantidad de columnas que se actualizaran posteriores a la inserción y del tipo de dato. Supongamos que tenemos una estructura de "Analisis_Credito" el cual es llenada por un analista de ventas para poder dar crédito a un cliente, en principio esta se llena con información básica que luego es actualizada por un flujo de trabajo que va desde el análisis, verificación y aprobación durante este flujo se actualizaron datos de comentarios, referencias, teléfono y otros como vemos un %0% de esta información es llenada posterior a la creación del registro, por lo que se debería considerar un PCTFREE de 60%.
Cuando se crea la tabla por default el PCTFREE es de 10%, entonces si ya sabemos que tipo de información se va almacenar, podemos establecer al momento o después de la crear la tabla.
EJEMPLO
Supongamos que tenemos que realizar una estructura que almacene todos los días el listado de los objetos de base de datos, esta tabla sólo se ingresaran datos, no se realizarán actualizaciones ni borrados, por lo que el PCTFREE debe de ser 0%. Crearemos una tabla HIS_OBJETOS_PCTFREE_0 (Definiremos 0%) y HIS_OBJETOS (no definimos nada).
SQL> --PCTFREE 0
SQL> create table HIS_OBJETOS_PCTFREE_0 PCTFREE 0
2 as
3 select * from all_objects;
Tabla creada.
SQL>
SQL> --PCTFREE SIN DEFINIR (Defecto 10%)
SQL> create table HIS_OBJETOS
2 as
3 select * from all_objects;
Tabla creada.
SQL>
SQL> select segment_name, bytes/1024/1024 mb, blocks
2 from dba_segments where segment_name like 'HIS_OBJETOS%'
3 and segment_type='TABLE';
-------------------------------------
SEGMENT_NAME MB BLOCKS
-------------------------------------
HIS_OBJETOS_PCTFREE_0 6 768


HIS_OBJETOS 7 896


Observemos que los MB de la tabla HIS_OBJETOS_PCTFREE_0 es de 6 y los bloques usados de 768, mientras que HIS_OBJETOS los MB usados es de 6 y los bloques 896.
Imaginen estos valores con tablas que tienen millones de registros, la cantidad de espacio que optimizaríamos además de mejorar el número de aciertos en consultas ya que entraran mas registros en un bloque con PCTFREE de 0 que uno superior a cero.