2 chỉ số cây B HOẶC 1 chỉ số GiST trên tsrange - sẽ hoạt động tốt hơn?


8

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_atBấ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_atends_atcộ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 .


dba.stackexchange.com/questions/39589/ Ấn Để tóm tắt cả hai nên hoạt động tương đối tốt. Thật khó để đưa ra một câu trả lời dứt khoát mà không thử nghiệm với dữ liệu thế giới thực.
Zack

Câu trả lời:


13

Dấu thời gian với chỉ số cây B

Tôi đề xuất một tùy chọn thứ ba : miễn là bảng của bạn chứa hai timestampcột (dường như được xác định NOT NULL) Tôi sẽ sử dụng một chỉ mục nhiều màu với thứ tự sắp xếp trái ngược (nếu không áp dụng các cân nhắc khác):

CREATE INDEX reservations_range_idx ON reservations using gist(starts_at, ends_at DESC);

Thêm trong những câu trả lời liên quan:

Đối với truy vấn, hãy xem toán tử chuẩn SQLOVERLAPS :

SELECT * FROM reservations
WHERE (starts_at, ends_at) OVERLAPS ('2014-01-01 00:00:00', '2014-01-03 00:00:00');

Thêm trong câu hỏi liên quan này trên SO:

Nên nhanh hơn hai chỉ số cây B. Ít không gian đĩa và rẻ hơn để duy trì. Gánh nặng cho hoạt động viết là nhỏ

Loại phạm vi với chỉ số GiST

Với các bảng lớn, chỉ số GiST trên loại phạm vi có thể nhanh hơn, vì nó có tỷ lệ tốt hơn. Lưu trữ trên đĩa lớn hơn đáng kể và chỉ số bảo trì đắt hơn một chút.

Nếu bạn đi theo tuyến đường đó, sẽ hiệu quả hơn khi lưu trữ dấu thời gian của bạn dưới dạng phạm vi ( tsrangehoặctstzrange ) để bắt đầu. Một chỉ số GiST đơn giản không có khía cạnh chức năng sẽ nhanh hơn một chút.

CREATE TABLE reservation (
  reservation_id serial PRIMARY KEY
 ,span tsrange
 , ...
);

CREATE INDEX reservation_span_gist_idx on reservations USING GiST (span);

Với &&toán tử "chồng lấp" bạn đã hiển thị trong câu hỏi:

SELECT *
FROM   reservation 
WHERE  span && ('2014-01-01 00:00:00', '2014-01-03 00:00:00');

Ngoài ra, bạn có thể quan tâm đến một ràng buộc loại trừ để loại trừ sự chồng chéo theo thiết kế, tự động thực hiện một chỉ số GiST giống như chỉ số GiST ở trên. Có một ví dụ mã trong hướng dẫn . Câu trả lời liên quan này trên SO có nhiều chi tiết hơn:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.