Оптимизация SQL-запроса Vertica для выполнения промежуточных сумм - PullRequest
7 голосов
/ 05 августа 2011

У меня есть таблица S с данными временных рядов, например:

key   day   delta

Для данного ключа возможно, но маловероятно, что будут отсутствовать дни.

Я бы хотелпостроить накопительный столбец из значений дельты (положительные значения INT), чтобы вставить эти накопительные данные в другую таблицу.Это то, что я получил до сих пор:

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

В моем варианте SQL предложение по умолчанию для окна имеет вид RANGE МЕЖДУ UNBOUNDED PRECEDING и CURRENT ROW, но я оставил это там, чтобы быть явным.

Этот запрос действительно медленный, примерно на порядок медленнее, чем старый неработающий запрос, который заполнял 0 для совокупного числа.Любые предложения для других методов для генерации кумулятивных чисел?

Я посмотрел на решения здесь: Промежуточный итог по сгруппированным записям в таблице

RDBM, которые я используюэто Vertica.Vertica SQL исключает первое решение для подбора, и планировщик запросов прогнозирует, что второе решение для левого внешнего соединения примерно в 100 раз дороже, чем аналитическая форма, которую я показываю выше.

1 Ответ

0 голосов
/ 27 мая 2014

Иногда быстрее использовать коррелированный подзапрос:

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