Tôi có bảng sau:Postgres - Đây có phải là cách thích hợp để tạo chỉ mục một phần trên cột boolean không?
CREATE TABLE recipemetadata
(
--Lots of columns
diet_glutenfree boolean NOT NULL,
);
Hầu hết mỗi hàng sẽ được thiết lập để FALSE
trừ khi ai đó đi lên với một số điên gluten mới chế độ ăn uống miễn phí mà càn quét nước.
Tôi cần có khả năng truy vấn rất nhanh các hàng có giá trị này là đúng. Tôi đã tạo chỉ mục:
CREATE INDEX IDX_RecipeMetadata_GlutenFree ON RecipeMetadata(diet_glutenfree) WHERE diet_glutenfree;
Dường như hoạt động, tuy nhiên tôi không thể biết cách thực sự chỉ lập chỉ mục các hàng có giá trị đúng. Tôi muốn chắc chắn rằng nó không làm điều gì ngớ ngẩn như lập chỉ mục bất kỳ hàng nào có giá trị nào cả.
Tôi có nên thêm toán tử vào mệnh đề WHERE
hay cú pháp này hoàn toàn hợp lệ không? Hy vọng rằng đây không phải là một trong những câu hỏi RTFM siêu dễ dàng mà sẽ được giảm xuống 30 lần.
UPDATE:
Tôi đã đi trước và thêm 10.000 hàng để RecipeMetadata với các giá trị ngẫu nhiên. Sau đó tôi đã làm một ANALYZE trên bàn và REINDEX chỉ để chắc chắn. Khi tôi chạy truy vấn:
select recipeid from RecipeMetadata where diet_glutenfree;
tôi nhận được:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5010 width=16)'
' Filter: diet_glutenfree'
Vì vậy, nó dường như được làm một quét tuần tự trên bàn mặc dù chỉ khoảng một nửa các hàng có cờ này. Chỉ mục đang bị bỏ qua.
Nếu tôi làm:
select recipeid from RecipeMetadata where not diet_glutenfree;
tôi nhận được:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5016 width=16)'
' Filter: (NOT diet_glutenfree)'
Vì vậy, không có vấn đề gì, chỉ số này không được sử dụng.
Vui lòng thêm liên kết vào danh sách gửi thư PostgreSQL của bạn từ lưu trữ để mọi người có thể kết nối cuộc thảo luận này với tài liệu đó. Nó sẽ được tốt đẹp nếu bạn muốn đăng một theo dõi để gửi bài danh sách gửi thư của bạn với một liên kết đến điều này, quá. Nếu bạn định đăng bài ở nhiều nơi, hãy nói như vậy để ngăn mọi người lặp lại công việc. –
Không vấn đề gì, tôi sẽ làm điều này trong tương lai (Tôi thường không đăng ở cả hai nơi) .. –
BTW, tôi nghĩ câu trả lời ngắn cho câu hỏi của bạn là "Có" ... nhưng nếu bạn lo ngại , điền vào một bảng với một số dữ liệu giả, 'ANALYZE' bảng, sau đó sử dụng' GIẢI THÍCH ANALYZE' để kiểm tra các kế hoạch của một số truy vấn sẽ nhấn chỉ mục một phần. –