TOP: ¿dentro o fuera de la vista? (II)

En capítulos anteriores vimos la diferencia entre crear una vista ‘incondicional’ y hacer un ‘SELECT TOP’ sobre ella o crear la vista con el ‘TOP’ incluído en ella y hacer el ‘SELECT’ ‘incondicional’. La respuesta era que el ‘TOP’ debería ir fuera, ya que Teradata debe construir la vista y eso implica crear un ‘spool’ completo ANTES de aplicarle el ‘TOP’.

También vimos que cuando el ‘TOP’ aparece en el ‘SELECT’ se aplican unos procesos de optimización. Entonces ¿qué pasará si aplicamos un ‘SELECT TOP’ a una vista generada con un ‘TOP’ incluído en su definición?

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
REPLACE VIEW MY_DB.PRE_TOP
AS
SELECT TOP 10 MY_COLUMN
  FROM MY_DB.TABLA_GRANDE;

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

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT TOP 10 MY_COLUMN FROM MY_DB.PRE_TOP;

 *** Query completed. 10 rows found. One column returned.
 *** Total elapsed time was 13 minutes and 39 seconds.

MY_COLUMN
---------
21420314B
21320314B
11422314G
21120314B
21520314B
11420314G
11522314G
21422314B
11322314G
21122314B

En efecto: el problema persiste. El proceso de optimización sólo puede aplicarse una vez la vista se ha ‘materializado’ (ojo a las comillas aquí), con lo que no se obtierne ninguna mejora de rendimiento.

El ‘EXPLAIN’ lo deja claro:

 
BTEQ -- Enter your DBC/SQL request or BTEQ command:
EXPLAIN
SELECT TOP 10 MY_COLUMN FROM MY_DB.PRE_TOP;

 *** Help information returned. 38 rows.
 *** Total elapsed time was 1 second.

Explanation
--------------------------------------------------------------------------------
  1) First, we lock a distinct MY_DB."pseudo table" for read on a
     RowHash to prevent global deadlock for
     MY_DB.TABLA_GRANDE.
  2) Next, we lock MY_DB.TABLA_GRANDE in view
     PRE_TOP for read.
  3) We do an all-AMPs STAT FUNCTION step from
     MY_DB.TABLA_GRANDE in view PRE_TOP by way of
     an all-rows scan with no residual conditions into Spool 5 (Last
     Use), which is assumed to be redistributed by value to all AMPs.
     The result rows are put into Spool 3 (all_amps), which is built
     locally on the AMPs.  The size is estimated with low confidence to
     be 60,310,600 rows (2,050,560,400 bytes).
  4) We do an all-AMPs RETRIEVE step from Spool 3 (Last Use) by way of
     an all-rows scan with a condition of ("Field_3 <= 10") into Spool 1 
     (used to materialize view, derived table or table function PRE_TOP) 
     (all_amps), which is built locally on the AMPs.  The result spool 
     file will not be cached in memory.  The size of Spool 1 is estimated 
     with low confidence to be 60,310,600 rows ( 1,809,318,000 bytes).  
     The estimated time for this step is 12.42 seconds.   
  5) We do an all-AMPs STAT FUNCTION step from Spool 1 by way of an
     all-rows scan into Spool 12, which is built locally on the AMPs.
     The result rows are put into Spool 8 (group_amps), which is built
     locally on the AMPs.  This step is used to retrieve the TOP 10
     rows.  Load distribution optimization is used. If this step
     retrieves less than 10 rows, then execute step 6.  The size is
     estimated with low confidence to be 60,310,600 rows (1,809,318,000 bytes).   
  6) We do an all-AMPs STAT FUNCTION step from Spool 1 (Last Use) by
     way of an all-rows scan into Spool 12 (Last Use), which is built
     locally on the AMPs.  The result rows are put into Spool 8
     (group_amps), which is built locally on the AMPs.  This step is
     used to retrieve the TOP 10 rows.  The size is estimated with low
     confidence to be 60,310,600 rows (1,809,318,000 bytes).   
  7) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
     The contents of Spool 8 are sent back to the user as the result of
     statement 1.

Una mirada a los puntos 3) y 4) no deja lugar a dudas: la pesada construcción de la vista con ‘TOP’ ocurre antes que las posibles optimizaciones ( pasos 5) y 6) ).

Saludos.

Carlos.

Anuncios

Una respuesta a TOP: ¿dentro o fuera de la vista? (II)

  1. […] terminar con la saga que hemos venido desarrollando aquí y aquí vamos a ver que muchas veces el uso de ‘TOP’ es incorrecto o […]

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: