Có bất kỳ lợi ích trong việc sắp xếp các cột nhất định khi xác định chỉ mục


13

Ví dụ: nếu tôi có hai chỉ mục:

CREATE INDEX IDX_1 ON MY_TABLE_1
 (ITEM, DATE, LOCATION)
 COMPUTE STATISTICS;

CREATE INDEX IDX_2 ON MY_TABLE_1
 (DATE, LOCATION, ITEM)
 COMPUTE STATISTICS;

Điều này sẽ làm cho IDX_2dư thừa? Nếu không, làm thế nào để tôi xác định thứ tự khai báo các cột?

Tôi có nên điều chỉnh chỉ mục cho các truy vấn thông thường?

Câu trả lời:


12

Có, lợi ích mang lại khi bạn muốn truy vấn một phần của chỉ mục. Nếu bạn đặt các biến vị ngữ được sử dụng trước, chỉ mục có thể được sử dụng cho các truy vấn có liên quan đến các vị từ đó nhưng không phải tất cả các cột trong chỉ mục.

Ngoài ra, trừ khi bạn có các yêu cầu khác, nó có thể giúp đặt các vị từ chọn lọc nhất lên trước, vì điều này có thể cắt giảm chỉ mục tìm kiếm các hoạt động nhanh hơn.

Trong trường hợp của bạn IDX_2không nhất thiết là dư thừa tùy thuộc vào bản chất của các truy vấn trên bảng. Tuy nhiên, có thể không cần thiết phải bao gồm tất cả các cột. Ví dụ, nếu bạn thực hiện rất nhiều truy vấn locationdatesau đó IDX_2có thể hữu ích để giúp giải quyết các truy vấn đó vì IDX_1không đúng thứ tự sẽ hữu ích cho việc đó. Tuy nhiên, bạn có thể thấy rằng nó itemlà dư thừa IDX_2.

Từ 9i, Oracle đã giới thiệu một toán tử 'bỏ qua quét' trong đó các cột chỉ mục theo dõi có thể được truy vấn hiệu quả hơn, điều này có thể làm giảm nhu cầu về các chỉ mục bổ sung của loại này.

Trong một trường hợp cụ thể hơn, nếu bạn đang truy vấn itembằng locationdatevà không cần bất kỳ cột khác thì truy vấn có thể được hoàn toàn giải quyết mặc dù chỉ số mà không cần phải đọc bất cứ điều gì từ bảng. Bạn cũng có thể xây dựng các chỉ mục bao gồm các cột không được lập chỉ mục được đính kèm. Nếu tất cả các cột cần thiết có thể được giải quyết từ chỉ mục che phủ, truy vấn hoàn toàn không cần phải chạm vào bảng chính.

Cuối cùng, để trả lời cho câu hỏi cuối cùng của bạn: Nếu bạn có một tập hợp các truy vấn được sử dụng thường xuyên đang sử dụng nhiều tài nguyên và có thể được điều chỉnh bằng cách sử dụng một chỉ mục thì chắc chắn đáng để xem xét. Tuy nhiên, việc duy trì các chỉ mục đi kèm với một chi phí chung khi chèn, do đó bạn sẽ phải đánh đổi hiệu năng truy vấn so với chi phí mà các chỉ mục đặt vào các hoạt động chèn hoặc cập nhật.


3
@ConcernedOfTunbridgeWells: Một cách tiếp cận khác là sử dụng nén khóa chỉ mục và có các cột ít chọn lọc hơn (ít giá trị khác biệt hơn) dẫn đầu. Nó giúp dẫn đến một chỉ số nhỏ hơn, trong khi vẫn cho phép quét bỏ qua hoạt động tốt.
Adam Musch

2

Một điều khác cần xem xét là các cột có rất nhiều giá trị null.

Nếu các cột này có bất kỳ cột nào được chỉ định sau chúng trong chỉ mục, các giá trị null phải được lập chỉ mục. Mặt khác, như thường lệ, các giá trị null không được lập chỉ mục (tất nhiên, điều này giả sử bạn đang sử dụng chỉ mục b-cây).

Vì vậy, nếu bạn có các cột có số lượng giá trị null lớn, đặt chúng ở cuối chỉ mục có thể giúp bạn tiết kiệm một lượng không gian đĩa đáng kể.

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.