Tôi nghĩ rằng tôi thấy điều gì đang xảy ra ở đây.
Khi bạn có chỉ số tại chỗ, và bạn làm:
SELECT Occupation FROM EMPLOYEE WHERE Occupation = 'DOCTOR';
Các kế hoạch thực hiện sẽ sử dụng các chỉ số. Điều này là không có trí tuệ, gây ra tất cả các dữ liệu cần thiết để đáp ứng các truy vấn là phải có trong chỉ mục, và Oracle thậm chí không bao giờ phải tham khảo bảng ở tất cả.
Tuy nhiên, khi bạn làm:
SELECT Fname FROM EMPLOYEE WHERE Occupation = 'DOCTOR';
sau đó, nếu Oracle sử dụng các chỉ số, nó sẽ làm một SCAN INDEX PHẠM VI tiếp theo là một TABLE TIẾP CẬN THEO ROWID để tìm kiếm các fname tương ứng với đó Nghề nghiệp. Bây giờ, tùy thuộc vào bao nhiêu hàng có DOCTOR cho nghề nghiệp, Oracle sẽ phải thực hiện một hoặc nhiều chuyến đi đến bảng, để tìm kiếm các Fname. Ví dụ, nếu bạn có một bảng, và tất cả các nhân viên có Nghề nghiệp được đặt thành 'DOCTOR', thì chỉ mục đó không được sử dụng nhiều, và Oracle sẽ chỉ làm một TABLE ĐẦY ĐỦ của bảng. Nếu có 10.000 nhân viên, và chỉ có một người là DOCTOR, thì một lần nữa, nó không có trí tuệ, và Oracle sẽ sử dụng chỉ mục.
Nhưng có một số sự tinh tế, khi bạn ở đâu đó giữa hai thái cực đó. Mọi người thích nói về 'chọn lọc', nghĩa là, có bao nhiêu hàng được chỉ định bởi chỉ mục, so với kích thước của bảng, khi thảo luận liệu chỉ mục đó có được sử dụng hay không. Tuy nhiên, đó không phải là thực sự là đúng. Những gì Oracle thực sự quan tâm là khối chọn lọc. Đó là, có bao nhiêu khối phải truy cập, để đáp ứng truy vấn? Vì vậy, đầu tiên, làm thế nào "rộng" là RANGE SCAN? Giới hạn phạm vi giá trị được chỉ định bởi các giá trị vị ngữ càng hạn chế thì càng tốt. Thứ hai, khi truy vấn của bạn cần thực hiện tra cứu bảng, có bao nhiêu khối khác nhau sẽ phải truy cập để tìm tất cả dữ liệu cần thiết. Tức là, dữ liệu "ngẫu nhiên" như thế nào trong bảng liên quan đến thứ tự chỉ mục? Điều này được gọi là CLUSTERING_FACTOR. Nếu bạn phân tích chỉ mục để thu thập số liệu thống kê và sau đó xem USER_INDEXES, bạn sẽ thấy rằng CLUSTERING_FACTOR hiện đã được điền.
Vậy, CLUSTERING_FACTOR là gì? CLUSTERING_FACTOR là "trật tự" của bảng, liên quan đến (các) cột chính của chỉ mục. Giá trị của CLUSTERING_FACTOR sẽ luôn nằm giữa số khối trong bảng và số hàng trong bảng. Một thấp CLUSTERING_FACTOR, tức là một số rất gần với số lượng khối trong bảng, biểu thị một bảng được sắp xếp theo thứ tự, liên quan đến chỉ mục. Một cao CLUSTERING_FACTOR, tức là, một con số rất gần với số lượng hàng trong bảng, rất không có thứ tự, liên quan đến chỉ mục.
Đó là một khái niệm quan trọng để hiểu rằng CLUSTERING_FACTOR mô tả thứ tự dữ liệu trong bảng liên quan đến chỉ mục.Vì vậy, việc xây dựng lại một chỉ mục, chẳng hạn, sẽ không thay đổi CLUSTERING_FACTOR. Điều quan trọng là phải hiểu rằng cùng một bảng có thể có hai chỉ mục và một bảng có thể có CLUSTERING_FACTOR tuyệt vời và bảng kia có thể có CLUSTERING_FACTOR cực kỳ kém. Bản thân bảng chỉ có thể được sắp xếp theo một cách.
Vì vậy, tại sao tôi đã dành quá nhiều thời gian mô tả CLUSTERING_FACTOR? Bởi vì khi bạn có một kế hoạch thực hiện thực hiện một INDEX RANGE SCAN theo sau là TABLE ACCESS BY ROWID, bạn có thể chắc chắn rằng CLUSTERING_FACTOR đã được xem xét bởi trình tối ưu hóa của Oracle, để đưa ra kế hoạch thực hiện. Ví dụ: giả sử bạn có một bảng hàng 10.000 và giả sử 100 hàng có Occupation = 'DOCTOR'. Bạn viết truy vấn ở trên, yêu cầu Fname của nhân viên có nghề nghiệp là DOCTOR. Vâng, Oracle có thể dễ dàng và hiệu quả xác định các hàng của các hàng mà nghề nghiệp là DOCTOR. Tuy nhiên, có bao nhiêu khối bảng mà Oracle cần truy cập, để thực hiện tra cứu Fname? Nó có thể chỉ là 1 hoặc 2 khối bảng, nếu dữ liệu được nhóm lại (theo thứ tự) bởi nghề nghiệp trong bảng. Nhưng, nó có thể lên đến 100, nếu dữ liệu không được sắp xếp trong bảng! Vì vậy, một lần nữa, 10.000 bảng hàng, và, giả sử, (với mục đích minh họa và toán học đơn giản) rằng bảng có 100 hàng/khối, và như vậy, 100 khối. Tùy thuộc vào thứ tự bảng (tức là CLUSTERING_FACTOR), số lần truy cập khối bảng có thể chỉ bằng 1 hoặc nhiều nhất là 100.
Vì vậy, tôi hy vọng điều này sẽ giúp bạn hiểu tại sao trình tối ưu hóa có thể miễn cưỡng sử dụng chỉ mục trong vài trường hợp.
Câu hỏi thú vị, tôi sẽ tò mò muốn biết tại sao điều này xảy ra. – ChandlerPelhams
Khóa chính có được định nghĩa cho bảng 'EMPLOYEE' không? –
Có thể chỉ số chưa hoàn thành xây dựng? nếu bạn chạy lại truy vấn SELECT Fname FROM EMPLOYEE WHERE Occupation = 'DOCTOR'; chi phí của nó giảm? – xQbert