Trình tối ưu hóa sẽ đưa ra quyết định dựa trên chi phí tương đối của quá trình quét toàn bộ bảng và sử dụng chỉ mục. Điều này chủ yếu đi xuống đến bao nhiêu khối sẽ phải được đọc để đáp ứng các truy vấn. Quy tắc ngón tay cái 25%/75% được đề cập trong câu trả lời khác là đơn giản: trong một số trường hợp, quét toàn bộ bảng sẽ có ý nghĩa ngay cả khi nhận được 1% số hàng - tức là nếu những hàng đó xảy ra xung quanh nhiều khối.
Ví dụ, hãy xem xét bảng này:
SQL> create table t1 as select object_id, object_name from all_objects;
Table created.
SQL> alter table t1 modify object_id null;
Table altered.
SQL> update t1 set object_id = null
2 where mod(object_id,100) != 0
3/
84558 rows updated.
SQL> analyze table t1 compute statistics;
Table analyzed.
SQL> select count(*) from t1 where object_id is not null;
COUNT(*)
----------
861
Như bạn có thể thấy, chỉ có khoảng 1% của các hàng trong T1 có một object_id phi null.Nhưng do cách tôi xây dựng bảng, 861 hàng này sẽ được lan truyền nhiều hơn hoặc ít hơn xung quanh bảng. Do đó, truy vấn:
select * from t1 where object_id is not null;
có khả năng truy cập hầu hết mọi khối trong T1 để nhận dữ liệu, ngay cả khi trình tối ưu hóa đã sử dụng chỉ mục. Nó có ý nghĩa sau đó để phân chia với các chỉ số và đi cho một bảng đầy đủ quét!
Một thống kê quan trọng để giúp xác định tình trạng này là yếu tố chỉ số phân nhóm:
SQL> select clustering_factor from user_indexes where index_name='T1_IDX';
CLUSTERING_FACTOR
-----------------
460
này giá trị 460 là khá cao (so với 861 hàng trong index), và gợi ý rằng một bảng quét toàn bộ sẽ được dùng. Xem this DBAZine article on clustering factors.
Nguồn
2009-04-06 16:46:53
Quassnoi, bạn nhận được 75% ở đâu? Nếu có hàng triệu hàng và chỉ có một hàng là null, tại sao việc sử dụng chỉ mục trên các cột đó chậm hơn so với quét bảng? – tpdi
Bởi vì chỉ mục ngụ ý một kết nối bị ẩn trên ROWID, chi phí cao gấp 4 lần so với quét bảng. Độ chọn lọc chỉ số có thấp hơn 25% hay không, việc quét bảng thường nhanh hơn. – Quassnoi
Khi quét toàn bộ bảng, bạn chỉ cần lặp qua tất cả các hàng trong bảng; nếu bạn thực hiện quét chỉ mục, trước tiên bạn phải đọc chỉ mục và sau đó đọc bảng. Từ một thời điểm nhất định, chi phí đọc chỉ mục cao hơn chỉ đọc toàn bộ bảng. – andri