2010-03-25 54 views
6

Tôi có một bảng với nhiều chỉ số, một số trong đó lặp lại trong các cột tương tự:cơ sở dữ liệu: tại sao cặp

Index 1 columns: X, B, C, D 
Index 2 columns: Y, B, C, D 
Index 3 columns: Z, B, C, D 

Tôi không rất am hiểu về lập chỉ mục trong thực tế, vì vậy tôi tự hỏi nếu ai đó có thể giải thích tại sao X, Y và Z được ghép nối với các cột này. B là một ngày có hiệu lực. C là ID khóa bán duy nhất cho bảng này cho một ngày có hiệu lực cụ thể B. D là một chuỗi xác định mức ưu tiên của hồ sơ này cho mã định danh C.

Tại sao không chỉ tạo 6 chỉ mục, mỗi chỉ mục cho mỗi X, Y, Z, B, C, D?

Tôi muốn thêm chỉ mục vào cột T khác, nhưng trong một số ngữ cảnh, tôi sẽ chỉ truy vấn T một mình trong khi ở những người khác, tôi cũng sẽ chỉ định cột B, C và D ... chỉ một chỉ mục như trên hoặc tôi nên tạo một chỉ mục cho T và một cho (T, B, C, D)?

Tôi đã không có nhiều may mắn như mong đợi khi googling cho phạm vi bao phủ toàn diện về lập chỉ mục. Bất kỳ tài nguyên nào tôi có thể nhận được thông qua giải thích và rất nhiều ví dụ về lập chỉ mục B-tree?

Trả lời

7

Các quy tắc với lập chỉ mục là một chỉ số có thể được sử dụng để lọc trên bất kỳ danh sách các cột tạo thành một tiền tố của các cột được sử dụng cho chỉ mục đó.

Nói cách khác, chúng tôi có thể sử dụng chỉ mục 1 khi chúng tôi lọc trên X và B hoặc X, B và C hoặc chỉ X hoặc cả bốn.

Tuy nhiên, chúng tôi không thể sử dụng chỉ mục để lọc "ở giữa". Điều này là do các chỉ mục hoạt động không hoàn toàn không giống như việc nối các giá trị của các cột đó cho mỗi hàng và sắp xếp kết quả. Nếu chúng ta biết điều chúng ta đang tìm kiếm bắt đầu bằng gì, chúng ta có thể tìm ra vị trí trong chỉ mục để xem - giống như khi thực hiện tìm kiếm nhị phân.

Đó là lý do tại sao một chỉ mục duy nhất không tốt: nếu chúng ta cần lọc trên B, C, D và một trong X, Y và Z, chúng tôi cần ba chỉ mục; X, Y không tốt như chỉ mục để lọc trên Y, bởi vì tiền tố của các giá trị mà chúng ta đang tìm kiếm - X - không được biết. Như Daniel đã đề cập, chỉ số bao gồm là một lời giải thích có thể cho việc lặp lại B, C và D: ngay cả khi D không bao giờ được lọc, có thể là trường hợp chúng ta cần chính xác các cột mà bạn thấy trong các chỉ mục của mình, và sau đó chúng tôi có thể đọc các cột từ chỉ mục thay vì chỉ sử dụng chỉ mục để định vị hàng.

+0

Trên thực tế, bạn có thể sử dụng chỉ mục để thúc đẩy quyền truy cập cho cột "ở giữa" - Oracle hỗ trợ bỏ qua quét, vì vậy chỉ mục trên 'X, B, C' có thể được sử dụng cho điều kiện bình đẳng trên B và C X không có mặt. Đó là lý do để xem xét nén khóa chỉ mục và dẫn đầu chỉ mục với các cột chọn lọc ít nhất. –

4

Một lý do để có B, C và D trong các chỉ mục đó có thể là có covering index cho các truy vấn thường dùng. Bạn sẽ có chỉ mục bao trùm khi chính chỉ mục chứa tất cả các trường dữ liệu bắt buộc cho một truy vấn cụ thể.

Chỉ mục bao gồm có thể tăng tốc đáng kể việc truy xuất dữ liệu, vì chỉ các trang chỉ mục, không phải các trang dữ liệu, sẽ được sử dụng để truy xuất dữ liệu.

Dưới đây là một câu hỏi ví dụ nơi index 1 sẽ là một chỉ số bao phủ:

SELECT B, C, D FROM table WHERE X = '10' 
1

Bạn nên tạo nó trong (T, B, C, D).

Giả sử bạn có hai trường có chỉ mục trong bảng: A và B.Khi bạn tạo một chỉ số riêng biệt trên mỗi một trong các cột, và có một truy vấn như:

SELECT * FROM table WHERE A = 10 AND B = 20 

gì xảy ra là một trong hai:

1) DB tạo ra hai trung gian kết quả-bộ, một với hàng Trong đó A = 10 và một số khác có các hàng có B = 20. Sau đó, nó phải hợp nhất hai tập hợp kết quả này thành một (và cũng kiểm tra các hàng trùng lặp).

2) DB tạo ra một kết quả thiết lập với hàng trong đó A = 10. Nó sau đó phải đi bằng tay thông qua tất cả các hàng trong trung gian này kết quả thiết lập và kiểm tra trong mỗi người trong đó B = 10

Tuy nhiên, khi bạn biết chỉ số B phụ thuộc vào chỉ mục A và truy vấn của bạn sử dụng A trước B, bạn có thể tạo một chỉ mục cho cả hai cột: (A, B)

Điều này có nghĩa là bây giờ DB sẽ tìm tất cả các hàng trong đó A = 10, nhưng vì B là một phần của cùng một chỉ mục, nó có thể sử dụng cùng một thông tin chỉ mục để lọc tập kết quả thành các hàng trong đó B cũng là 20. Nó không phải tạo ra hai kết quả trung gian- bộ + hợp nhất chúng hoặc chỉ sử dụng một trong các chỉ mục và thực hiện manu al scan cho người khác.

Có thể có các cách khác mà DB cũng xử lý các tình huống này, phần lớn phụ thuộc vào việc triển khai.

1

Các chỉ số theo hình thức (X, B, C, D) có thể được sử dụng để tối ưu hóa các truy vấn như:

... WHERE X rel sthg (possibly ORDER BY B, C, D) 
... WHERE X = sthg AND B rel sthg (possibly ORDER BY C, D) 
... WHERE X = sthf AND B = sthg AND C rel sthg (possibly ORDER BY D) 

, vv nơi rel là nhà khai thác mối quan hệ tùy ý (<,>, =, = < ,> =) và sthg là các giá trị hoặc biểu thức. Đặc biệt là hai thứ hai, và các biến thể sắp xếp sẽ không được tối ưu hóa bởi "biến thể chỉ mục cột đơn".

OTOH, nó không thể tối ưu hóa một truy vấn

... WHERE B = sthg 

vì nó bắt đầu ở giữa chỉ số; ở đây, chỉ mục cột đơn sẽ hoạt động.

0

Đối với tài nguyên nơi bạn có thể xem giải thích và nhiều ví dụ liên quan đến chỉ mục trên Oracle (và bất kỳ vấn đề nào khác liên quan đến Oracle), bạn nên truy cập và đánh dấu askTom.

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