tôi đã có một bảng Blah (vĩ độ float, float kinh độ, ngày create_time, owner_id int, .....)Oracle chỉ số tổng hợp cho điều kiện truy vấn nhiều
và mã của tôi không chỉ là một truy vấn đơn
select *
from Blah
where latitude < l1 and latitude > l2
and longitude < ll1 and longitude > ll2
and create_time < t1 and create_time > t2
and owner_id < o1 and owner_id > o2 ;
(tất nhiên giá trị l1, l2, .... o1, o2 là thông số động đến từ chương trình)
câu hỏi của tôi là loại chỉ mục mà tôi nên tạo; chỉ số tổng hợp? trong trường hợp chỉ mục tổng hợp, cột nào tôi nên đặt trước? chỉ số hiệu quả như thế nào?
Tôi đã nghĩ về điều này trong một thời gian dài và không thể tìm thấy tài liệu chi tiết về cách thức hoạt động của chỉ mục oracle.
Tôi có thể tìm tài liệu được triển khai bằng B-tree, trong trường hợp của chúng tôi: mỗi khóa trong cây B là 4 bộ: (cột1, cột2, cột3, cột 4) trong đó quan hệ đặt hàng của các bộ dữ liệu đó là được định nghĩa là thứ tự từ vựng.
rồi cho truy vấn trên, giả sử thứ tự của chúng tôi là (owner_id, create_time, vĩ độ, kinh độ), tôi đoán oracle trước tiên sẽ cần tìm kiếm nhị phân đến điểm (o1, t1, l1, ll1), cho thao tác này , chỉ số thực sự hữu ích. nhưng tiếp theo, chúng ta cần phải tìm điểm kết thúc của interium đầu tiên này: chúng ta cần phải tìm (o1, t1, l1, ll2), điều này có thể được thực hiện bằng cách tìm kiếm nhị phân.
tiếp theo, chúng ta cần tìm phần tiếp theo thỏa mãn điều kiện, vì vậy chúng ta cần tìm (o1, t1, lx, ll1) trong đó lx là giá trị lớn hơn l1, chúng ta có thể tìm thấy điều này bằng tìm kiếm nhị phân quá. nhưng trong trường hợp của chúng tôi, rất có khả năng đối với cùng một vĩ độ, không thể có nhiều hơn 1 kinh độ, vì vậy ở đây tìm kiếm nhị phân không hiệu quả hơn quét tuyến tính.
theo tinh thần này, có vẻ như chúng ta nên đặt cột có số thẻ giá trị nhỏ trước tiên, trong trường hợp này, create_time, nếu điểm của chúng tôi được tạo chỉ trong vài ngày. cũng nếu chúng ta không bao giờ làm điều kiện phạm vi, nhưng chỉ bằng (=) điều kiện, sau đó nó không quan trọng cột nào là đầu tiên, phải không?
để làm cho nó rõ ràng hơn, đây là một ví dụ đơn giản:
giả sử tôi có 2 cột, X, Y và
trong db, giá trị cho cả hai đều là [1,2, ... 0,100], vì vậy chúng tôi có 100x100 hàng
truy vấn của tôi là
select * from mytable where X > 34 and X < 78 and Y > 12 and Y < 15;
nói chỉ mục của mình đã bật (X, Y), vì vậy nguyên tắc so sánh giữa 2 giá trị là
v1 < v2 <=====> v1.x < v2.x || v1.x == v2.x && v1.y < v2.y
cho sự cai trị đặt hàng trên, chúng ta có thể thấy rằng các giá trị trong các chỉ số là sắp xếp theo thứ tự tương tự (giá trị cho x, y):
1,1, 1,2 1,3 .... 1,100
2,1 2,2 2,3 ......2,100
.....
100,1 100,2 ....... 100,100
bây giờ, để tìm kiếm các giá trị trong truy vấn, việc di chuyển B-Tree cần phải định vị (78-34-1) khoảng thời gian, do đó (78-34-1) * 2 tra cứu (1 cho đầu một cho các vị trí kết thúc), không chỉ 2 lần tra cứu.
vì vậy nếu chúng có kích thước cao hơn, khoảng thời gian đếm tăng theo cấp số nhân với số lượng kích thước, vì vậy chỉ mục có thể không hữu ích nữa ------ này là mối quan tâm của tôi
thanks a lot Yang
cảm ơn, nhưng hiện tại tôi chỉ quan tâm đến vấn đề chỉ số B-tree; Mặc dù trong thực tế Oracle cũng có thể sử dụng chỉ mục bitmap, như bạn đã chỉ ra –