Oracle không sử dụng chỉ mục vì nó giả định select column_value from table(x)
trả về 8168 hàng.
Các chỉ mục nhanh hơn để truy xuất một lượng nhỏ dữ liệu. Tại một số thời điểm, việc quét toàn bộ bảng sẽ nhanh hơn so với việc lặp đi lặp lại cây chỉ mục.
Ước tính bản chất của một câu lệnh SQL thông thường là đủ khó. Tạo một ước tính chính xác cho mã thủ tục gần như là không thể. Nhưng tôi không biết họ nghĩ ra 8168. Các hàm bảng thường được sử dụng với các hàm pipelined trong kho dữ liệu, một số lượng lớn có ý nghĩa.
Lấy mẫu động có thể tạo ra một ước tính chính xác hơn và có khả năng tạo ra một kế hoạch sẽ sử dụng chỉ mục.
Dưới đây là một ví dụ về ước tính bản số sai:
create or replace type type_table_of_number as table of number;
explain plan for
select * from table(type_table_of_number(1,2,3,4,5,6,7));
select * from table(dbms_xplan.display(format => '-cost -bytes'));
Plan hash value: 1748000095
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8168 | 00:00:01 |
| 1 | COLLECTION ITERATOR CONSTRUCTOR FETCH| | 8168 | 00:00:01 |
-------------------------------------------------------------------------
Đây là cách khắc phục:
explain plan for select /*+ dynamic_sampling(2) */ *
from table(type_table_of_number(1,2,3,4,5,6,7));
select * from table(dbms_xplan.display(format => '-cost -bytes'));
Plan hash value: 1748000095
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 7 | 00:00:01 |
| 1 | COLLECTION ITERATOR CONSTRUCTOR FETCH| | 7 | 00:00:01 |
-------------------------------------------------------------------------
Note
-----
- dynamic statistics used: dynamic sampling (level=2)