"Indexación" (también conocido como el mantenimiento de una tabla de) la agregación de datos en SQL Server 2005

StackOverflow https://stackoverflow.com/questions/1454555

Pregunta

Tengo una tabla que mantiene los datos de rendimiento de un sistema, cada registro es una llamada a algún método importante y consiste en el nombre del método, de su duración y de un símbolo - cada solicitud para el sistema es un símbolo único y así todos los registros con el mismo símbolo son la misma petición, e.g:

CallName    Duration    Token
----------- ----------- -----------
GetData     121         12345
Process     800         12345
SaveData    87          12345

GetData     97          ABCDE
Process     652         ABCDE
SaveData    101         ABCDE

Estoy interesado en los datos agregados agrupados por el Token y el CallName, por ejemplo:

-- The total duration of each request, in descending order
SELECT Token, SUM(Duration) FROM Requests GROUP BY Token ORDER BY SUM(Duration) DESC

-- The average duration of each call, in descending order
SELECT CallName, AVG(Duration) FROM Requests GROUP BY CallName ORDER BY AVG(Duration) DESC

Ahora esta tabla es potencialmente muy grande y estoy nunca va a estar interesado en la parte superior de algunos registros de cada consulta y lo he implementado la paginación por tanto de estas consultas.El problema es que debido a estas consultas implican funciones de agregado de SQL server termina haciendo un examen de la tabla de todos modos.

Seguramente otras personas han tenido este problema antes?

Lo que realmente me necesita aquí es un "índice" en la SUMA(Duración) agrupados por Token, es decir,una tabla donde me pueden hacer cosas como:

SELECT Token, SumToken FROM RequestTokens ORDER BY SumToken DESC
  • Esta es una idea realmente mala?
  • Si es así, ¿hay una mejor manera?
  • ¿Cuál sería la mejor manera de hacer esto?Sería desencadena en INSERTAR / ACTUALIZAR / ELIMINAR de trabajo (donde puedo actualizar los valores agregados basados en los valores antiguos y los datos modificados), o sería mejor apagar manualmente la actualización de mi "índice" a la hora de actualizar esta tabla?

Los desencadenantes son la mejor solución que he encontrado hasta ahora, pero ya puedo ver a este ser un interbloqueo / consistencia pesadilla!:-S

¿Fue útil?

Solución

¿Qué hay potencialmente una vista basada en los agregados, posiblemente incluso una vista indizada. No he hecho mucho con vistas indizadas pero este artículo habla sobre su uso con agregados complejos como AVG (). Tal vez te llevará en la dirección correcta.

http://msdn.microsoft.com /en-us/library/aa933148%28SQL.80%29.aspx

Otros consejos

En primer lugar, no sería un índice en la columna de la emergencia será suficiente? De esta manera, dado el valor simbólico, el optimizador de consultas SQL sería escanear sólo la parte del índice que contiene la fila le interesa. Hacen de este un índice agrupado, y se obtendría un rendimiento óptimo.

El siguiente, ¿cómo saber qué valor simbólico que está interesado en la agregación? No hay una fecha y hora (o marca de tiempo) la columna en la lista, y los valores de los símbolos parece estar asignado al azar (en oposición a algún tipo de valor ascendente), por lo que supongo que ya sabe el valor simbólico a ser agregada antes de emitir la consulta --en el que la indexación debe hacer lo que quiera. Si los valores son desconocidos pero de alguna manera ascendente, hay una serie de tácticas que puede utilizar para determinar primero los más recientes valores de X manera, y una vez que tienes que esos / Tokens que está de vuelta a la mesa de exploración parcial.

Voy a tomar otra puñalada en éste, ahora que lo entiendo mejor. Este es un problema que informa no infrecuente que lleva a soluciones de almacenamiento de datos, así: puede que acaba de añadir en una segunda tabla que contiene datos previamente agregados? Esta es, en efecto desnormalizará / datos redundantes ... pero parece claro y bien definido, y satisface las necesidades de la empresa. Un par de arrugas en esta idea:

Si se introduce una sola vez los datos, se puede modificar la rutina de entrada de datos para agregar la fila agregada al mismo tiempo. Si se escurre en el transcurso del tiempo, se necesitaría el proceso se repite para "barrer las cosas". Evito desencadenantes de principio general; que podrían ayudar aquí, pero también podrían amarrar su sistema en función de los patrones de uso y las interrelaciones de datos.

Cómo hasta a la fecha deben ser los datos? Puede los datos agregados estar fuera de sincronía con los datos detallados, y si es así, por cuánto tiempo? Usted podría tener un trabajo del Agente SQL en el lugar que se ejecuta cada día / hora / 5 minutos para buscar las entradas recientes y actualizar la tabla agregada. (Añadir un indexada "última entró en" la columna, y estos cambios podrían ser rápido.) La compensación es el período de tiempo que sus datos serían fuera. (Pero esa columna de fecha y hora podría indicar "a través de cuando" los datos sean exactos. Tal vez usted no hace los datos agregados disponibles para después de ese punto en el tiempo?)

Si los datos no cambia una vez que se introduce (no hay cambios, no hay eliminaciones, no hay filas que llegan tarde), esto podría funcionar - pero si usted tiene que mantener las actualizaciones a través del tiempo, y los cambios en los datos agregados tenido a estar disponible al mismo tiempo que se introducen los datos, podría ser una pesadilla para mantener.

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