Tôi đã có một bảng với khoảng 20 triệu hàng. Đối với lợi ích của đối số, cho phép nói có hai cột trong bảng - một id và dấu thời gian. Tôi đang cố gắng đếm số lượng mặt hàng mỗi ngày. Đây là những gì tôi có vào lúc này.Tăng tốc một nhóm theo truy vấn ngày trên một bảng lớn ở postgres
SELECT DATE(timestamp) AS day, COUNT(*)
FROM actions
WHERE DATE(timestamp) >= '20100101'
AND DATE(timestamp) < '20110101'
GROUP BY day;
Không có bất kỳ chỉ mục nào, điều này mất khoảng 30 giây để chạy trên máy của tôi. Dưới đây là giải thích phân tích đầu ra:
GroupAggregate (cost=675462.78..676813.42 rows=46532 width=8) (actual time=24467.404..32417.643 rows=346 loops=1)
-> Sort (cost=675462.78..675680.34 rows=87021 width=8) (actual time=24466.730..29071.438 rows=17321121 loops=1)
Sort Key: (date("timestamp"))
Sort Method: external merge Disk: 372496kB
-> Seq Scan on actions (cost=0.00..667133.11 rows=87021 width=8) (actual time=1.981..12368.186 rows=17321121 loops=1)
Filter: ((date("timestamp") >= '2010-01-01'::date) AND (date("timestamp") < '2011-01-01'::date))
Total runtime: 32447.762 ms
Kể từ khi tôi nhìn thấy một quét tuần tự, tôi đã cố gắng để chỉ số vào ngày tổng
CREATE INDEX ON actions (DATE(timestamp));
nào cắt giảm tốc độ khoảng 50%.
HashAggregate (cost=796710.64..796716.19 rows=370 width=8) (actual time=17038.503..17038.590 rows=346 loops=1)
-> Seq Scan on actions (cost=0.00..710202.27 rows=17301674 width=8) (actual time=1.745..12080.877 rows=17321121 loops=1)
Filter: ((date("timestamp") >= '2010-01-01'::date) AND (date("timestamp") < '2011-01-01'::date))
Total runtime: 17038.663 ms
Tôi mới làm quen với toàn bộ doanh nghiệp tối ưu hóa truy vấn này và tôi không biết phải làm gì tiếp theo. Bất kỳ đầu mối làm thế nào tôi có thể nhận được truy vấn này chạy nhanh hơn?
--edit--
Dường như tôi đang đánh các giới hạn của chỉ số. Đây là truy vấn duy nhất được chạy trên bảng này (mặc dù các giá trị của ngày thay đổi). Có cách nào để phân vùng lên bảng? Hoặc tạo một bảng bộ nhớ cache với tất cả các giá trị đếm? Hoặc bất kỳ tùy chọn nào khác?
Bạn đang kể cho chúng tôi toàn bộ câu chuyện ở đây? Có vẻ như bạn đã thay đổi cài đặt bộ nhớ giữa gói đầu tiên và gói thứ hai. Đó sẽ là lời khuyên của tôi. ;-) –
Không thay đổi cài đặt bộ nhớ, mặc dù tôi đã phân tích chân không giữa mọi thay đổi lược đồ. Không biết nếu tôi phải làm điều đó, nhưng nó ảnh hưởng nghiêm trọng đến kết quả. – zaius