2010-01-25 10 views
35

He estado probando algunas vistas de índice y estoy impresionado pero casi siempre necesito un máximo o un mínimo y no puedo entender por qué no funciona con esto, ¿alguien puede explicar por qué?¿Por qué las vistas indizadas no pueden tener un agregado MAX()?

¡SÉ que no están permitidos, simplemente no puedo entender por qué! Contar, etc., está permitido por qué no MIN/MAX, estoy buscando una explicación ...

Respuesta

69

Estos agregados no están permitidos porque no se pueden volver a calcular únicamente en función de los valores modificados.

Algunos agregados, como COUNT_BIG() o SUM(), se pueden recalcular con solo mirar los datos que han cambiado. Estos están permitidos dentro de una vista indexada porque, si un valor subyacente cambia, el impacto de ese cambio puede calcularse directamente.

Otros agregados, como MIN() y MAX(), no se pueden volver a calcular con solo mirar los datos que se están modificando. Si elimina el valor que es actualmente el máximo o mínimo, entonces el nuevo máximo o mínimo debe buscarse y encontrarse en la tabla completa .

El mismo principio se aplica a otros agregados, como AVG() o los agregados de variación estándar. SQL no puede recalcularlos solo a partir de los valores modificados, sino que necesita volver a analizar toda la tabla para obtener el nuevo valor.

+0

¡Hah, lo has clavado! –

+0

Se podrían admitir si restringía la tabla para permitir solo operaciones de 'inserción', no 'actualizar' o' eliminar'. (Si quisiera hacer uno de esos, tendría que soltar la vista indexada y volver a crearla después). Muchas tablas son solo para uso práctico, y se beneficiarían de una forma de acelerar 'max' y 'min' consultas. –

2

Las funciones de agregado como MIN/MAX no son compatibles con las vistas indizadas. Tienes que hacer el MIN/MAX en la consulta que rodea la vista.

Hay una definición completa de lo que está permitido y lo que no está permitido en una vista indizada here (SQL 2005).
Cita:

El AVG, MAX, MIN, STDEV, STDEVP, VAR, o VARP funciones de agregado. Si no se especifica AVG (expresión) en consultas referencia a la vista indizada, el optimizador de frecuencia puede calcular el resultado necesaria si la vista seleccionar lista contiene SUM (expresión) y COUNT_BIG (expresión). Por ejemplo, una lista SELECTA de vista indizada no puede contener la expresión AVG (columna1). Si la lista SELECT vista contiene la suma expresiones (columna 1) y COUNT_BIG (columna 1), SQL Server puede calcular el promedio para una consulta que referencia a la vista y especifica AVG (columna 1).

4

Además de los motivos especificados por Remus, hay menos necesidad práctica de admitir MIN y MAX. A diferencia de COUNT() o SUM(), MAX y MIN son rápidos de calcular: todo está configurado después de una sola búsqueda; no es necesario que lea muchos datos.

+0

La persona que votó negativamente, ¿te gustaría elaborar? –

+7

probablemente alguien que tenía una razón sólida para necesitar MIN o MAX. Encontré esta pregunta mientras buscaba una manera de crear exactamente ese índice, ya que tomaría una consulta de minutos a segundos. – jmoreno

Cuestiones relacionadas