SQL Server 2008: unirse ver con otro punto de vista: precalcular sin recurrir a tablas temporales
-
29-09-2019 - |
Pregunta
Para llevar a cabo transformaciones en mi base de datos, con frecuencia utilizo un conjunto encadenado de puntos de vista. Dentro de los puntos de vista serán expresiones de tabla comunes. Por ejemplo, me gustaría tener lo siguiente:
CREATE VIEW TransformationStep1 AS
WITH Transformation1A AS (
SELECT Field1, Field2, Field3, Bla(Field1) AS Calc FROM Table1
),
Transformation1B AS (
SELECT Field1, Field2, Field3, Calc FROM Transformation1A
)
SELECT * FROM Transformation1B
CREATE VIEW TransformationStep2 AS
WITH Transformation2A AS (
SELECT Field1, Calc FROM TransformationStep1
), ....
En algún lugar cerca TransformationStep4 los puntos de vista será más lento que el plan de consulta se vuelve más complicado. Con ello se espera y OK.
Pero cuando me quiero unir una parte de TransformationStep4 a sí mismo, la consulta se ralentizará enormemente como el optimizador intenta encontrar su camino de regreso hasta el final a las tablas de origen y mirada para los índices de algún tipo. Normalmente esto está bien, pero a veces sólo quiero guardar mi resultado temporal y unirse con eso porque (el ser humano el diseño en la historia) Por mi parte, saben que la tabla de resultados será bastante pequeña, y será mucho más rápido para unirse en contra de una "captura previa" de la misma.
¿Hay alguna manera de escribir una sugerencia de consulta, que influirá en el plan de consulta de tal manera que la subconsulta se prefetched y luego se unió en contra? De lo contrario voy a tener que recurrir a tablas temporales en un procedimiento almacenado, pero quiero evitarlo si puedo.
Gracias por cualquier sugerencia, también cuando se piensa en mi diseño chupa: -)
Solución
Una vista es una macro que se expande:. No hay almacenamiento en caché o búsqueda previa pre-cálculo
A menos que tenga vistas indizadas donde se puede utilizar NOEXPAND .. pero eso no tiene wok en puntos de vista comunes.
Sin embargo, puede utilizar TOP interior / ORDER BY para materializar la vista también:
SELECT
*
FROM
(SELECT TOP 2000000000 * FROm TransformationStep2 ORDER BY soemthing) V1
JOIN
(SELECT TOP... ) bar on foo.x = bar.x
No hay nada mágico sobre un punto de vista: es sólo texto y no tiene memoria o la persistencia ...