Pregunta

Estoy tratando de crear una vista a partir de una consulta de selección bastante compleja y no me deja poner un índice agrupado porque tengo que usar subconsultas y algunas funciones agregadas.

Tengo que obtener un índice agrupado en él, de lo contrario las consultas que usan la vista tardarán para siempre. Aparentemente, el servidor SQL solo almacenará el conjunto de resultados si cumple con una cantidad estúpida de criterios.

Las tablas base para la vista son de solo lectura y solo se actualizan mediante una importación masiva una vez al día. No puedo ver por qué los resultados no se pueden almacenar en caché.

¿Alguien sabe de alguna manera de hacer que el servidor sql almacene en caché los resultados de una vista para que a su vez puedan ser consultados más tarde? Realmente no quiero crear otra tabla porque podría convertirse en un montón de cambios en todo el lugar.

Gracias de antemano.

¿Fue útil?

Solución

Creo que la respuesta que estás buscando es: No use una vista para hacer esto. Use una tabla con los campos correspondientes a los campos devueltos de la consulta sql. Automatizar la consulta para completar esta tabla

Otros consejos

La respuesta breve es que no se puede crear un índice agrupado debido a las razones que mencionas.

Cuando solicita una forma de almacenar en caché los resultados de la consulta complicada, el único otro objeto que proporciona SQL Server (y resolverá su problema) es una tabla.

Si la automatización es un problema, debería considerar crear la vista, pero solo usarla como una forma de insertar en una tabla, de modo que pueda hacer un truncamiento / inserción en la tabla (selección desde la vista) inmediatamente después de inserto a granel.

Si usa SSIS (SQL Server Integration Services), esto es algo relativamente trivial para agregar.

Hasta donde sé, cuando compila planes de ejecución, SQL Server esencialmente copia y pega la definición de la vista en la consulta de su compilación, siempre que pueda agregar índices a las tablas subyacentes, debería ser posible obtener un buen rendimiento de la consulta.

Lo que está construyendo suena como un almacén de datos, por lo tanto, su mejor opción es manipular los datos una vez que estén en el sistema. Puede crear nuevas tablas de denormalizadas (o de lo contrario lo está modificando) e indexarlas para permitir consultas rápidas.

Si lo necesita, puede crear vistas sobre estas tablas.

al usar agregados dentro de una vista indizada, debe usar COUNT_BIG () en lugar de COUNT () de lo contrario, la vista no se creará

Además, si no está en Enterprise Edition, debe proporcionar la sugerencia NOEXPAND; de lo contrario, el optimizador no utilizará la vista

SELECT *
FROM YourView WITH(NOEXPAND)
WHERE ....

Tal vez no necesite una vista, pero simplemente no tiene los índices correctos en las tablas, ¿puede publicar el DDL de las tablas (incluidos los índices y las restricciones)

Tuve el mismo problema y terminé colocando las subconsultas en las vistas de índice agrupadas.

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