2011-08-05 27 views
7

Tôi có một bảng S với dữ liệu chuỗi thời gian như thế này:Tối ưu hóa một truy vấn SQL Vertica làm chạy tổng số

key day delta 

Đối với một phím nào đó, nó có thể nhưng không chắc rằng ngày sẽ bị mất.

Tôi muốn xây dựng một cột tích lũy từ các giá trị delta (tích cực INT), với mục đích chèn dữ liệu tích lũy này vào một bảng khác. Đây là những gì tôi đã có cho đến nay:

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

Trong hương vị SQL của tôi, khoản cửa sổ mặc định là khoảng từ vô biên TRƯỚC VÀ ROW HIỆN, nhưng tôi lại thấy ở đó là rõ ràng.

Truy vấn này thực sự chậm, như thứ tự độ trễ chậm hơn truy vấn bị hỏng cũ, được điền bằng 0 cho tổng tích lũy. Bất kỳ đề xuất cho các phương pháp khác để tạo ra các số tích lũy?

tôi đã nhìn vào các giải pháp ở đây: Running total by grouped records in table

RDBMS Tôi đang sử dụng là Vertica. Vertica SQL loại bỏ giải pháp subselect đầu tiên ở đó, và kế hoạch truy vấn của nó dự đoán rằng giải pháp nối ngoài bên trái thứ 2 tốn khoảng 100 lần so với dạng phân tích mà tôi đã trình bày ở trên.

+0

Phép chiếu bạn đã xác định cho bảng này? Có bao nhiêu hàng và khóa riêng biệt? Làm thế nào chậm là "rất chậm"? –

+0

Bạn có bao nhiêu hàng trong bảng? Bạn phân vùng/phân đoạn chiếu chính cho bảng đó như thế nào? – mtrbean

+0

Rất khó để tôi hiểu! Bạn có thể vui lòng cung cấp dữ liệu mẫu với đầu ra được yêu cầu không? – AK47

Trả lời

-1

Đôi khi nó là nhanh hơn để chỉ cần sử dụng một subquery tương quan:

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

Vertica không hỗ trợ các truy vấn phụ có liên quan về bản chất này. – duber

Các vấn đề liên quan