¿Hay alguna diferencia si filtra una vista dentro o fuera de la vista?
Por ejemplo, ¿hay alguna diferencia entre estas dos consultas?
SELECT Id
FROM MyTable
WHERE SomeColumn = 1
O
SELECT Id
FROM MyView
WHERE SomeColumn = 1
Y MyView
se define como
SELECT Id, SomeColumn
FROM MyTable
¿Y la respuesta es diferente si la tabla de origen se encuentra en un servidor vinculado?
Lo pregunto porque tengo que consultar una tabla grande (44mil filas) dos veces desde un servidor vinculado y obtener un agregado de los resultados. Quiero saber si debo crear dos vistas para acceder a los datos, una para cada consulta, o si puedo salir con una sola vista y una WHERE
cláusula.
UNION ALL
. Es mucho más fácil usar una Vista que tener que reescribir la consulta UNION cada vez que necesito los datos.Respuestas:
No debería ver absolutamente ninguna diferencia en los planes o el rendimiento entre estas dos opciones. Cuando se consulta la vista, se expande a una consulta en la tabla base, lo que significa que se utilizará la misma búsqueda o exploración.
Ahora, dependiendo del tipo de datos y la selectividad de
MyColumn
, si desea crear un índice filtrado en la tabla base (cuando se muda a SQL Server 2008+), podría obtener un mejor rendimiento, pero esto nuevamente no será diferente a través de la vista o sin.fuente
where
cláusula fuera de la vista tarda mucho más que cuando se coloca en la vista?Aquí hay un ejemplo rápido que muestra que no debería haber diferencia. La base de datos es la
AdventureWorks
base de datos.Dos definiciones de vista:
Aquí sería la primera consulta, con la
WHERE
cláusula incluida en la definición de la vista:Aquí está el plan de ejecución:
Y la segunda consulta, con la
WHERE
cláusula no en la definición de la vista, sino en laSELECT
consulta:Aquí está ese plan de ejecución:
Como puede ver en estos planes de ejecución, son idénticos con resultados idénticos. No sé de una situación en la que este tipo de lógica / diseño arrojaría resultados diferentes. Por lo tanto, estaría dispuesto a decir que está a salvo de cualquier manera, e ir con preferencia personal (o procedimientos de compra).
fuente
where
cláusula fuera de la vista tarda mucho más que cuando se coloca en la vista?Where
cláusula se ajusta aPARTITION BY
. SQL Server 2008 parece tener una nueva reglaSelOnSeqPrj
para reconocer este caso particular.Basado en lo que estoy leyendo , SQL utilizará una vista estándar como una subconsulta al determinar el plan de ejecución.
Entonces, usando mi consulta de ejemplo,
donde
MyView
se define comodebería generar el mismo plan de ejecución que
pero este plan de ejecución puede ser diferente de lo que se generaría con
No estoy seguro de si esta respuesta sería la misma para las vistas indexadas
fuente
sp_refreshview
es necesario lo que no haría el concepto de sustitución de texto.