miércoles, 15 de junio de 2011

Filas Encadenadas

Qué son????

Cuando el tamaño de una fila supere el tamaño de un bloque de la base de datos, puede generarse una migración o un encadenamiento de la fila.

Cuando hablamos de filas migradas nos referimos a una fila que se mueve completa de un bloque a otro dejando en el bloque original un puntero.

Cuando hablamos de filas encadenadas nos referimos a filas que requieren más de un bloque para su almacenamiento.

Si nos encontramos en presencia de una tabla con gran cantidad de filas encadenadas o migradas quiere decir que la base de datos va a tener que realizar varias lecturas físicas para poder procesar los datos de una misma fila lógica.

Como evitamos entonces el encadenamientos? Seteando un valor adecuado de pctfree en nuestra tabla.
Otra solución es un expdp/impdp de las tablas en cuestion

Si quisiéramos solucionar el problema de filas encadenadas debemos seguir los siguientes pasos:

Paso 1:

Correr el script utlchain.sql el cual crea la tabla CHAINED_ROWS.

Paso 2:

Revisamos la/s tabla para ver si poseen filas encadenadas. De poseerlas se insertaran en la tabla CHAINED_ROWS.

SQL> ANALYZE TABLE LIST CHAINED ROWS INTO chained_rows;

Paso 3:

Creamos una tabla auxiliar la cual llenaremos con las “filas duplicadas” de nuestra tabla

SQL> CREATE TABLE aux AS
2 SELECT * from
3 WHERE rowid IN
4 (SELECT head_rowid
5 FROM chained_rows
6 WHERE table_name = ‘nuestra tabla’);

Paso 4:

Borramos las filas encadenadas de nuestra tabla

SQL> DELETE FROM
2 WHERE rowid IN
3 (SELECT head_rowid
4 FROM chained_rows
5 WHERE table_name = ‘nuestra tabla’);

Paso 5:

Volvemos a insertar las tablas antes encadenadas en nuestra tabla

SQL> INSERT INTO SELECT * FROM aux;

Paso 6:

Realizar nuevamente la verificación para cerciorarse de que no queden filas encadenadas

SQL> DELETE CHAINED_ROWS WHERE table_name = 'nuestra tabla';

SQL> ANALYZE TABLE nombre_de_la_tabla
2 LIST CHAINED ROWS INTO chained_rows;

SQL> SELECT * FROM chained_rows WHERE table_name = 'nuestra tabla';

Espero les haya servido

Saludos!
Gondalf

2 comentarios:

  1. Rápido, sencillo y para toda la familia.

    Muy buena explicación, también sería conveniente explicar que podemos hacer para evitarlo, por ejemplo modificando el parámetro PCTFREE o PCTVERSION de la tabla.

    En el metalink (cuenta gratuita) con tan sólo buscar CHAINED MIGRATED ROWS encontraréis varios documentos relacionados con estos problemas.

    Metalink (How to Find and Eliminate Migrated and Chained Rows [ID 102989.1])

    Muy buen aporte Gondalf.
    Saludos.

    ResponderEliminar
  2. Gracias por tu comentario!!

    ResponderEliminar