Numeric overflow en SELECT COUNT(*) en Teradata

Si tienes una tabla muy grande en Teradata y quieres saber cuántas filas tiene, te puede ocurrir que:

LOCKING TABLE MY_DB.BIG_TABLE FOR ACCESS
 SELECT COUNT(*)
   FROM MY_DB.BIG_TABLE;

 *** Failure 2616 Numeric overflow occurred during computation.
                Statement# 1, Info =0
 *** Total elapsed time was 8 minutes and 25 seconds.

Aunque al principio te pueda sorprender un poco, se soluciona fácilmente con:

 BTEQ -- Enter your SQL request or BTEQ command:
LOCKING TABLE MY_DB.BIG_TABLE FOR ACCESS
 SELECT COUNT(*)(DECIMAL(18,0))
   FROM MY_DB.BIG_TABLE;

 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 8 minutes and 45 seconds.

            Count(*)
--------------------
         2542446720.

En realidad, no es más que una consecuencia lógica de los tipos en Teradata, mucho más estrictos en cuanto a los tipos numéricos se refiere que -por ejemplo- Oracle:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT COUNT(*) TOTAL
  FROM MY_DB.SMALL_TABLE;

 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

      total
-----------
          1

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT TYPE(TOTAL)
  FROM ( SELECT COUNT(*) TOTAL
           FROM MY_DB.SMALL_TABLE) a;

 *** Query completed. 1 row found. One column returned.
 *** Total elapsed time was 1 second.

Type(TOTAL)
---------------------------------------
INTEGER

En efecto, en Oracle un NUMBER es mucho más genérico que en Teradata, y el usuario no tiene que preocuparse de nada más. En Teradata, en cambio, cada tipo tiene sus estrictos rangos y hay que tenerlos siempre en cuenta, con lo que el uso del CAST () es obligado en ocasiones como las del ejemplo, en el que el número de filas devuelto excede el rango del tipo INTEGER implícito (-2,147,483,648 , +2,147,483,647).

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: