Tablas SET y MULTISET en Teradata (II).

Como vimos en Tablas SET y MULTISET en Teradata, la verificación de duplicados en tablas SET y MULTISET es un poco rara para los INSERT…SELECT’s (eliminación silenciosa de duplicados). Ha habido gente que me ha pedido que explique un poco más el comportamiento de Teradata respecto a los duplicados, y lo cierto es que es un tema un tanto confuso, ya que el comportamiento que se presenta a la hora de la verificación de duplicados en sentencias INSERT INTO…VALUES es completamente distinto al de las sentencias INSERT…SELECT.

Lo vemos con un ejemplo que utiliza las mismas tablas PRUEBA03_S_UPI y PRUEBA05_S_NUPI(COL01) usadas en el artículo anterior:

 Teradata BTEQ 08.02.03.03 for WIN32.
 Copyright 1984-2006, NCR Corporation. ALL RIGHTS RESERVED.
 Enter your logon or BTEQ command:
.LOGON MY_TD/MY_DB

.LOGON MY_TD/MY_DB
Password:

 *** Logon successfully completed.
 *** Teradata Database Release is V2R.06.02.01.18
 *** Teradata Database Version is 06.02.01.17
 *** Transaction Semantics are BTET.
 *** Character Set Name is 'ASCII'.

 *** Total elapsed time was 3 seconds.
 BTEQ -- Enter your DBC/SQL request or BTEQ command:

CREATE SET TABLE MY_DB.PRUEBA03_S_UPI (COL01 INTEGER NOT NULL)
UNIQUE PRIMARY INDEX (COL01);

CREATE SET TABLE MY_DB.PRUEBA03_S_UPI (COL01 INTEGER NOT NULL)
UNIQUE PRIMARY INDEX (COL01);

 *** Table has been created.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
INSERT INTO MY_DB.PRUEBA03_S_UPI(COL01) VALUES(1);

INSERT INTO MY_DB.PRUEBA03_S_UPI(COL01) VALUES(1);

 *** Insert completed. One row added.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
INSERT INTO MY_DB.PRUEBA03_S_UPI(COL01) VALUES(1);

INSERT INTO MY_DB.PRUEBA03_S_UPI(COL01) VALUES(1);
 *** Failure 2801 Duplicate unique prime key error in MY_DB.PRUEBA03_S_UPI.
                Statement# 1, Info =0
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
INSERT INTO MY_DB.PRUEBA05_S_NUPI(COL01) VALUES(1);

INSERT INTO MY_DB.PRUEBA05_S_NUPI(COL01) VALUES(1);

 *** Insert completed. One row added.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
INSERT INTO MY_DB.PRUEBA05_S_NUPI(COL01) VALUES(1);

INSERT INTO MY_DB.PRUEBA05_S_NUPI(COL01) VALUES(1);
 *** Failure 2802 Duplicate row error in MY_DB.PRUEBA05_S_NUPI.
                Statement# 1, Info =0
 *** Total elapsed time was 1 second.

Como podemos ver en el ejemplo, la verificación de duplicados es muy diferente al caso de las sentencias INSERT…SELECT. Aquí no hay eliminación silenciosa de duplicados, sino que la verificación de duplicados ocurre mediante un mecanismo de errores.

En el primer ejemplo (tabla MY_DB.PRUEBA03_S_UPI) la verificación se lleva a cabo lanzando el error 2801 Duplicate unique prime key error in MY_DB.PRUEBA03_S_UPI, es decir, la validación de unicidad del índice PRUEBA03_S_UPI.

En cambio, en el segundo ejemplo (tabla MY_DB.PRUEBA05_S_NUPI) la verificación se lleva a cabo lanzando el error 2802 Duplicate row error in MY_DB.PRUEBA05_S_NUPI. Aquí la validación de duplicados es la propia de la tabla definida ‘SET’.

Por último indicar que Teradata realiza la verificación de duplicados para tablas ‘SET’ siempre y cuando no haya otra restricción de unicidad (UPI, USI…) en cuyo caso verifica la unicidad de la restricción y se ahorra la de la definición ‘SET’ (como hemos visto en el ejemplo con MY_DB.PRUEBA03_S_UPI):

It is also true that if you create a SET NUPI table, the system performs duplicate row checks by default unless you place a uniqueness constraint on the table. Unique constraint enforcement is often less a less costly method of enforcing row uniqueness than system duplicate row checks.

Además, la verificación de restricciones de unicidad es menos costosa que la de unicidad de filas en tablas ‘SET’.

Saludos.

Carlos.

Responder

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: