Tôi có một bảng có nhiều phần chèn, đặt một trong các trường ( uploaded_at
) thành NULL
. Sau đó, một tác vụ định kỳ chọn tất cả các bộ dữ liệu WHERE uploaded_at IS NULL
, xử lý chúng và cập nhật, thiết lập uploaded_at
cho đến ngày hiện tại.
Làm thế nào tôi nên lập chỉ mục bảng?
Tôi hiểu rằng tôi nên sử dụng một chỉ mục một phần như:
CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL
Hoặc smth như thế. Tôi hơi bối rối mặc dù nó là chính xác để lập chỉ mục trên một lĩnh vực luôn luôn NULL
. Hoặc nếu nó là chính xác để sử dụng một chỉ số b-cây. Hash có vẻ như là một ý tưởng tốt hơn, nhưng nó đã lỗi thời và không được sao chép thông qua việc sao chép dự phòng nóng. Bất kỳ lời khuyên sẽ được đánh giá rất cao.
Tôi đã thử nghiệm một chút với các chỉ số sau:
"foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL
"foo_part_id" btree (id) WHERE uploaded_at IS NULL
và trình hoạch định truy vấn dường như luôn chọn foo_part
chỉ mục. explain analyse
cũng mang lại kết quả tốt hơn một chút cho foo_part
chỉ số:
Index Scan using foo_part on t1 (cost=0.28..297.25 rows=4433 width=16) (actual time=0.025..3.649 rows=4351 loops=1)
Index Cond: (uploaded_at IS NULL)
Total runtime: 4.060 ms
đấu với
Bitmap Heap Scan on t1 (cost=79.15..6722.83 rows=4433 width=16) (actual time=1.032..4.717 rows=4351 loops=1)
Recheck Cond: (uploaded_at IS NULL)
-> Bitmap Index Scan on foo_part_id (cost=0.00..78.04 rows=4433 width=0) (actual time=0.649..0.649 rows=4351 loops=1)
Total runtime: 5.131 ms
id
lĩnh vực nối tiếp chẳng hạn?