2011-08-05 16 views
7

Mam tabeli S z szeregów czasowych, takich jak ten:Optymalizacja zapytania Vertica SQL do czynienia z systemem wynosi

key day delta 

dla danego klucza, to jest możliwe, ale mało prawdopodobne, że dzień będzie brakowało.

Chciałbym skonstruować kolumnę skumulowaną z wartości delta (dodatnie INT), w celu wstawienia tych danych skumulowanych do innej tabeli. To, co mam do tej pory:

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

W moim smaku SQL, klauzula domyślne okno jest zakres między bezgranicznym poprzedzające i bieżącego wiersza, ale zostawiłem to tam być jawne.

To zapytanie jest bardzo powolne, podobnie jak rząd wielkości wolniejszy niż stare zepsute zapytanie, które wypełniło 0 dla łącznej liczby. Wszelkie sugestie dotyczące innych metod generowania liczb skumulowanych?

zrobiłem patrzeć rozwiązaniami tutaj: Running total by grouped records in table

RDBMS Używam jest Vertica. Vertica SQL wyklucza tam pierwsze rozwiązanie podselekcji, a jego planer zapytań przewiduje, że drugie lewe połączenie zewnętrzne jest około 100 razy bardziej kosztowne niż analityczna forma, którą pokazałem powyżej.

+0

Co rzuty zostały zdefiniowane dla tej tabeli? Ile wierszy i różnych kluczy? Jak powolny jest "bardzo wolny"? –

+0

Ile wierszy masz w tabeli? W jaki sposób dzielisz/dzielisz projekcję główną dla tej tabeli? – mtrbean

+0

Bardzo trudno mi to zrozumieć! Czy mógłbyś podać przykładowe dane z wymaganymi danymi wyjściowymi? – AK47

Odpowiedz

-1

Czasem szybciej po prostu użyć skorelowane podzapytanie:

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

Vertica nie obsługuje skorelowanych podkwerend tego rodzaju. – duber

Powiązane problemy