Tôi có một bảng lưu trữ dữ liệu đặt phòng bằng các cột starts_at
& ends_at
Bất cứ khi nào tôi truy vấn bảng để tìm các đặt chỗ chồng chéo, tôi có một tùy chọn sử dụng một trong các truy vấn sau:
SELECT * FROM reservations
WHERE starts_at < '2014-01-03 00:00:00'
AND ends_at >='2014-01-01 00:00:00';
Hoặc là
SELECT * FROM reservations
WHERE tsrange(starts_at, ends_at) && ('2014-01-01 00:00:00', '2014-01-03 00:00:00')
Tôi có các chỉ mục B-Tree thường xuyên trên các cột starts_at
và ends_at
cột, do đó, truy vấn đầu tiên luôn sử dụng chúng. Tuy nhiên, trừ khi tôi xác định chỉ mục GiST chức năng trên tsrange, truy vấn thứ hai thực hiện quét hoàn chỉnh.
create index tsrange_idx on reservations using gist(tsrange(starts_at, ends_at));
Câu hỏi của tôi là, khi bảng phát triển, chỉ số nào sẽ nhanh hơn? Có lẽ câu trả lời là rõ ràng khi nhìn vào kế hoạch thực hiện truy vấn, nhưng tôi không rành về EXPLAIN ANALYZE
đầu ra đọc .