2011-01-19 9 views
36

Microsoft SQL Server le permite agregar un índice a una vista, pero ¿por qué le gustaría hacer esto?¿Por qué le gustaría poner un índice en una vista?

Mi entendimiento es que el fin es en realidad una sub consulta, es decir, si digo SELECT * FROM myView, estoy realmente diciendo SELECT * FROM (Consulta de myView)

Parece que los índices en el subyacente las tablas serían las que más importaran. Entonces, ¿por qué quieres un índice separado en la vista?

Respuesta

32

Si la vista está indexada, cualquier consulta que pueda responderse utilizando únicamente el índice nunca tendrá que referirse a las tablas subyacentes. Esto puede conducir a una enorme mejora en el rendimiento.

Básicamente, el motor de base de datos mantiene una versión "resuelta" de la consulta (o más bien, el índice de la consulta) mientras actualiza las tablas subyacentes, luego utiliza esa versión resuelta en lugar de las tablas originales cuando es posible.

Aquí hay una buena article en el Diario de la base de datos.

+0

Acabo de terminar de tratar de explicar esto a alguien. – msarchet

+0

Hay un buen documento en las vistas de índice aquí: http://msdn.microsoft.com/en-us/library/ms187864.aspx –

+3

+1: La gente supone que las vistas no materializadas almacenan la información, pero en realidad solo se materializa vistas (donde compatibles - IE: No MySQL o PostgreSQL) vistas que sí. –

0

Se crea un índice en una vista para la misma razón que en una tabla de base: a mejorar el rendimiento de las consultas en ese punto de vista. Otra razón para hacerlo es implementar alguna restricción de exclusividad que no pueda implementar contra las tablas base. Desafortunadamente, SQL Server no permite que se creen restricciones en las vistas.

4

Microsoft SQL Server le permite agregar un índice a una vista, pero ¿por qué le gustaría hacer esto?

Para agilizar las consultas.

Mi entendimiento es que el fin es en realidad una sub consulta, es decir, si digo SELECT * FROM myView, estoy realmente diciendo SELECT * FROM (Consulta de myView)

No

siempre.

Al crear un índice agrupado en una vista, materializa la vista y las actualizaciones de las tablas subyacentes actualizan físicamente la vista. Las consultas en contra de esta vista pueden o no tener acceso a las tablas subyacentes.

No se pueden indexar todas las vistas.

Por ejemplo, si está utilizando GROUP BY en una vista, para que sea indexable que debe contener una COUNT_BIG y todas las funciones de agregado en ella debe distribuir más UNION ALL (sólo SUM y COUNT_BIG son en realidad). Esto es necesario para que el índice sea mantenible y la actualización de las tablas subyacentes podría actualizar la vista de manera oportuna.

+0

Tampoco puede indexar una vista que llame a una vista. – HLGEM

+4

@HLGEM: sí y '2465' más restricciones que no mencioné aquí. – Quassnoi

+2

Pensé que había más que eso. – HLGEM

Cuestiones relacionadas