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: -)

¿Fue útil?

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top