2012-05-04 32 views
9

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

Trả lời

9

Nếu mục tiêu duy nhất của bạn là tạo chỉ mục để tối ưu hóa truy vấn này, bạn muốn các cột trong chỉ mục tổng hợp được đặt hàng với cột chọn lọc nhiều nhất trước tiên. Nếu các vị từ trên latitude loại bỏ nhiều hàng hơn nhiều so với các vị từ khác, thì trước tiên sẽ có hiệu quả hơn để có cột đó. Nếu các vị từ trên owner_id loại bỏ nhiều hàng hơn nhiều so với các vị từ khác, thì trước tiên sẽ có hiệu quả hơn để có cột đó.

Trong thực tế, mặc dù, chúng tôi hiếm khi tạo các chỉ mục có mục đích duy nhất là tối ưu hóa một truy vấn. Nói chung, để làm cho chi phí bảo trì chỉ số đáng giá, chúng tôi muốn các chỉ mục của mình hữu ích trên nhiều truy vấn. Trong trường hợp chỉ mục tổng hợp, điều đó có nghĩa là sắp xếp các cột theo xác suất mà truy vấn sẽ có các biến vị ngữ trên cột đó. Ví dụ: nếu bạn có chỉ mục tổng hợp trên owner_id, create_time, latitude, longitude, bạn có thể sử dụng chỉ mục đó cho các truy vấn chỉ định vị từ trên owner_id. Nhưng thực tế bạn sẽ không sử dụng chỉ mục đó cho các truy vấn chỉ định vị từ trên longitude.

3

Trước tiên, hãy nhớ rằng "B" trong "B-Tree" không phải là "nhị phân".

Thứ hai, khi nói đến việc lập chỉ mục trong Oracle bạn cũng có thể lựa chọn một chỉ số bitmap nếu:

  1. Bạn có một giấy phép phiên bản doanh nghiệp
  2. Bạn không có nhiều phiên đồng thời chỉnh sửa bảng
  3. giá trị được lập chỉ mục của bạn không gần là duy nhất (báo cáo rằng chỉ số bitmap là có thể sử dụng chỉ cho các cột cardinality thấp thường phóng đại)

Một loại truy vấn mà các chỉ mục bitmap nổi trội tại là kết hợp hiệu quả các biến vị ngữ trên nhiều cột, đặc biệt là nơi tập hợp các cột được xác định khác nhau (có thể không phải là trường hợp của bạn). Nếu bạn đáp ứng ba điều kiện ở trên thì nó sẽ có giá trị kiểm tra hiệu quả của việc có bốn chỉ mục bitmap riêng biệt trên bảng.

+0

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 –

0

là bảng này được sử dụng cho OLTP hay là DWH? nếu bạn không có nhiều hàng đơn/đa DML thống kê trên bảng này bạn có thể sử dụng chỉ mục bitmap. chỉ mục bitmap cho phép bạn ROWID AND toán tử giữa nhiều chỉ mục (chuyển đổi sao Aka). để làm điều đó tạo ra một chỉ mục bitmap trên mỗi cột. Giống như tôi đã sayied giải pháp này phù hợp nhất cho hệ thống DWH, nơi bạn có một đợt chèn đơn.

0

Truy vấn phạm vi đa chiều được xử lý tốt nhất, IMHO, bên ngoài chỉ mục B-tree chuẩn. Một vài bài báo về chủ đề chung có thể được tìm thấy bởi một tìm kiếm trên web về "các truy vấn phạm vi đa chiều".

Oracle cung cấp một sản phẩm có tên Oracle Spatial. Tài liệu cho sản phẩm này bao gồm, trong Chapter 4, ví dụ và giải thích về cách tạo chỉ mục không gian và thực hiện truy vấn. Không có cú pháp SQL mới; ví dụ của họ về tạo chỉ mục là:

CREATE INDEX territory_idx ON territories (territory_geom) 
    INDEXTYPE IS MDSYS.SPATIAL_INDEX; 

tạo chỉ mục R-tree.

Tôi nghĩ sự tồn tại của cây R, cây kdb và cấu trúc không gian tương tự là bằng chứng cho thực tế rằng các cây B chuẩn có thể không phù hợp với các loại ứng dụng này.

1

Một giải pháp brute-force dễ dàng là tạo nhiều kết hợp chỉ mục trên cùng một bảng, chạy truy vấn với EXPLAIN PLAN được bật rồi chọn chỉ mục mà DBMS của bạn muốn sử dụng.

Các vấn đề liên quan