Optimización de INSERTS en particiones vacías en Teradata.

El caso es que el otro día se nos planteó un dilema sobre tablas particionadas y rendimientos varios a la hora de insertar filas. Había una propuesta de utilizar tablas en vez de particiones, ya que de esa manera se puede utilizar el “FAST PATH INSERT”: Los INSERT/SELECTs en los que la tabla origen y la tabla destino tienen el mismo PI y además la tabla destino está vacía están optimizados y se saltan el “TRANSIENT JOURNAL” (en realidad sólo se inserta una única entrada en él).

Estaba claro que la analogía con cómo Oracle implementa el particionaiento estaba en el fondo de la cuestión. Oracle lo hace utilizando SEGMENTOS -que es lo que está inmediatamente por debajo de las tablas-. Teradata, en cambio, lo implementa utilizando el ‘rowkey’ y la ordenación basada en él. Esto es: no hay particiones “vacías” como “objetos” vacíos, sino que en una tabla con PPI una partición “vacía” indica que no existen filas con ése identificador de partición. Pero claro: si la tabla tiene filas, aunque sean de otras particiones, ya no está vacía, y en teoría no se podría utilizar el “FAST PATH INSERT” sobre ella.

No obstante, a mí se me encendió una lucecita dentro de la cabeza, una especie de ‘deja-vu‘. Sabía que había leído algo de eso en alguna parte, pero no recordaba dónde.

Así que me puse a buscar y buscar por entre la documentación, hasta que por fin di con ello: efectivamente Teradata utiliza un método de optimización de inserciones sobre particiones vacías. ¿En qué consiste? Vamos a verlo.

La optimización consiste en que si insertamos filas sobre particiones vacías se evita el uso del “TRANSIENT JOURNAL” para cada fila. Esto ocurrirá siempre que:

1· No exista integridad referencial sobre la tabla particionada.

2· El rango comprendido entre la primera partición y la última partición correspondiente a las filas a insertar no cubra ninguna partición de la tabla destino que no esté vacía. Esto debe ser así aunque no existan filas a insertar que correspondan a una partición no vacía.

Esto último se ve más claro con un ejemplo:
Supongamos que la tabla destino tiene tres particiones: 1, 2 y 3. Supongamos que la tabla origen tiene filas que corresponden únicamente a las particiones vacías 1 y 3. Si ejecutamos un INSERT/SELECT incondicional ocurrirá que Teradata verá que la primera partición correspondiente a las filas a insertar es la 1 y que la última es la 3. Como ve que la tabla destino tiene una partición intermedia que no está vacía (la 2) NO SE APLICARÁ LA OPTIMIZACIÓN DESCRITA. Para que se aplique bastará con efectuar un INSERT/SELECT en el que se filtren (con un WHERE, por ejemplo) las filas corespondientes a la partición 1 sólamente, y luego un segundo INSERT/SELECT que haga lo mismo pero con las filas de la partición 3. En estas condiciones la optimización será llevada a cabo, pues se estarían insertando filas de una única partición vacía cada vez.
La optimización también surtiría efecto si la partición 2 de la tabla destino estuviese también vacía para el caso del INSERT/SELECT incondicional.
Lo importante es que en el rango de particiones correspondientes a las filas a insertar no existan particiones no vacías en la tabla de destino, sin importar si hay filas para ellas o no.

Saludos.

Carlos.

Una respuesta a Optimización de INSERTS en particiones vacías en Teradata.

  1. […] poco veíamos la optimización de INSERTS en particiones vacías en Teradata. También se ha hablado aquí de los “FAST PATH DELETES” en los borrados […]

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: