2011-08-05 14 views
7

Tengo una tabla con S series temporales de datos como este:optimización de una consulta SQL Vertica hacer totales acumulados

key day delta 

Para una clave dada, es posible, pero poco probable que los días van a estar ausentes.

Me gustaría construir una columna acumulativa a partir de los valores delta (INT positivos), a los efectos de insertar estos datos acumulativos en otra tabla. Esto es lo que tengo hasta ahora:

SELECT key, day, 
    SUM(delta) OVER (PARTITION BY key ORDER BY day asc RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
    delta 
FROM S 

En mi sabor de SQL, la cláusula de ventanas por defecto es oscilar entre ANTERIOR sin límites y la fila actual, pero me dejó que no sea explícita.

Esta consulta es muy lenta, como el orden de magnitud más lenta que la consulta quebrada anterior, que llenó los 0 del recuento acumulado. ¿Alguna sugerencia para otros métodos para generar los números acumulados?

me hicieron ver las soluciones aquí: Running total by grouped records in table

el RDBMS que estoy usando es Vertica. Vertica SQL excluye la primera solución de subselección allí, y su planificador de consultas predice que la segunda solución de combinación externa izquierda es aproximadamente 100 veces más costosa que la forma analítica que muestro arriba.

+0

¿Qué proyecciones que ha definido para esta tabla? ¿Cuántas filas y claves distintas? ¿Qué tan lento es "muy lento"? –

+0

¿Qué filas tienes en la tabla? ¿Cómo está dividiendo/segmentando la proyección maestra para esa tabla? – mtrbean

+0

¡Muy difícil de entender! ¿Podría proporcionar datos de muestra con la salida requerida? – AK47

Respuesta

-1

A veces es más rápido que sólo tiene que utilizar una subconsulta correlacionada:

SELECT 
    [key] 
    , [day] 
    , delta 
    , (SELECT SUM(delta) FROM S WHERE [key] < t1.[key]) AS DeltaSum 
FROM S t1 
+0

Vertica no admite subconsultas correlacionadas de esta naturaleza. – duber

Cuestiones relacionadas