2010-02-24 26 views

Respuesta

20

La tabla derivada es una construcción lógica.

Se puede almacenar en el tempdb, construido en tiempo de ejecución reevaluando la instrucción subyacente cada vez que se accede, o incluso optimizado.

La tabla temporal es una construcción física. Es una tabla en tempdb que se crea y completa con los valores.

Cuál es mejor depende de la consulta en la que se utilizan, la declaración que se utiliza para derivar una tabla y muchos otros factores.

Por ejemplo, CTE (expresiones de tabla comunes) en SQL Server puede (y muy probablemente) volver a evaluarse cada vez que se utilizan. Esta consulta:

WITH q (uuid) AS 
     (
     SELECT NEWID() 
     ) 
SELECT * 
FROM q 
UNION ALL 
SELECT * 
FROM q 

se muy probablemente rendimiento de dos diferentes NEWID() 's.

En este caso, se debe utilizar una tabla temporal, ya que garantiza que sus valores persisten.

Por otro lado, esta consulta:

SELECT * 
FROM (
     SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn 
     FROM master 
     ) q 
WHERE rn BETWEEN 80 AND 100 

es mejor con una tabla derivada, porque el uso de una tabla temporal será necesario ir a buscar todos los valores de master, mientras que esta solución sólo va a escanear los primeros 100 registros utilizando el índice en id.

+0

¿Cuándo es mejor usar tablas derivadas? en consultas simples? –

+0

gracias Quassnoi, su muestra es muy buena. –

+0

por qué usaste 'más probablemente' aquí - "probablemente dará dos NEWID() diferentes". ? – thewpfguy

8

Depende de las circunstancias.

Ventajas de tablas derivadas:

  1. una tabla derivada es parte de una, sola consulta más grande, y se optimizará en el contexto del resto de la consulta. Esto puede ser una ventaja, si la optimización de consultas ayuda al rendimiento (generalmente lo hace, con algunas excepciones). Ejemplo: si llena una tabla temporal y luego consume los resultados en una segunda consulta, está vinculando el motor de la base de datos a un método de ejecución (ejecute la primera consulta en su totalidad, guarde el resultado completo, ejecute la segunda consulta) donde con una tabla derivada, el optimizador podría encontrar un método de ejecución más rápido o una ruta de acceso.

  2. Una tabla derivada solo "existe" en términos del plan de ejecución de consultas, es puramente una construcción lógica. Realmente no hay mesa

Ventajas de tablas temporales

  1. "existe" la mesa - es decir, se materializan en forma de tabla, al menos en la memoria, que contiene el conjunto de resultados y puede ser reutilizado.

  2. En algunos casos, el rendimiento puede mejorarse o el bloqueo se reduce cuando tiene que realizar transformaciones elaboradas en los datos; por ejemplo, si desea recuperar un conjunto de filas de una tabla base que es ocupado, y luego hacer algunos cálculos complicados en ese conjunto, puede haber menos contención si saca las filas de la tabla base y las desbloquea lo más rápido posible, luego realiza el trabajo de forma independiente. En algunos casos, la sobrecarga de una tabla temporal real es pequeña en relación con la ventaja en concurrencia.

0

La gran diferencia es que puede poner restricciones, incluida una clave principal en una tabla temporal. Para grandes (me refiero a millones de registros) alguna vez puede obtener un mejor rendimiento con temporal. Tengo la consulta clave que necesita 5 uniones (cada unión es similar). El rendimiento estuvo bien con 2 uniones y luego en la tercera actuación salió mal y el plan de consulta se volvió loco. Incluso con sugerencias, no pude corregir el plan de consulta. Intenté reestructurar las uniones como tablas derivadas y aún los mismos problemas de rendimiento. Con tablas temporales, puedo crear una clave primaria (luego, cuando llego primero, ordenar en PK). Cuando SQL podría unirse a las 5 tablas y usar el rendimiento PK, pasaría de minutos a segundos. Desearía que SQL admitiera restricciones en tablas derivadas y CTE (incluso si solo es un PK).

4

Quiero agregar aquí una anécdota porque me lleva a aconsejar lo contrario de la respuesta aceptada. Estoy de acuerdo con el pensamiento presentado en la respuesta aceptada, pero es principalmente teórico. Mi experiencia me ha llevado a recomendar tablas temporales sobre tablas derivadas, expresiones de tablas comunes y funciones de valores de tablas. Utilizamos tablas derivadas y expresiones de tablas comunes extensamente con mucho éxito, basándonos en pensamientos consistentes con la respuesta aceptada hasta que comenzamos a tratar con conjuntos de resultados más grandes y/o consultas más complejas. Luego descubrimos que el optimizador no se optimizó bien con la tabla derivada o CTE.

Miré un ejemplo hoy que se ejecutó para las 10:15. Inserté los resultados de la tabla derivada en una tabla temporal y me uní a la tabla temporal en la consulta principal y el tiempo total cayó a 0:03. Por lo general, cuando vemos un gran problema de rendimiento, podemos abordarlo rápidamente de esta manera. Por esta razón, recomiendo tablas temporales a menos que su consulta sea relativamente simple y esté seguro de que no procesará grandes conjuntos de datos.

Cuestiones relacionadas