Digamos que usted tiene una visión:¿Por qué poner una cláusula WHERE vista exterior tiene desempeño terrible
CREATE VIEW dbo.v_SomeJoinedTables AS
SELECT
a.date,
a.Col1,
b.Col2,
DENSE_RANK()
OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b on a.date = b.date
He encontrado que el rendimiento de:
SELECT *
FROM v_SomeJoinedTables
WHERE date > '2011-01-01'
es mucho peor que
SELECT *,
DENSE_RANK()
OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b ON a.date = b.date
WHERE a.date > '2011-01-01'
Estoy muy sorprendido de que el plan de consulta para estas dos declaraciones no sea el mismo.
También he intentado utilizar una función de tabla en línea, pero la consulta todavía tarda 100-1000 veces más que el código donde copio y pego la lógica de vista.
¿Alguna idea?
Bueno, ¿cómo se ven los planes de consulta? ¿Te estás perdiendo un índice? ¿La vista está devolviendo demasiadas filas? Si la cláusula where se aplica en el lugar equivocado? –
¿Su vista está llamando a una vista? – HLGEM
¿Qué sucede si su vista no contiene una función de ventana? ¿Cuál es el resultado semántico esperado de una VISTA que calcula el rango en todo el conjunto, pero una consulta a la vista agrega una nueva condición - ¿debe aplicarse el insde RANK antes o después de la condición afuera? – ErikE