Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tại sao Oracle SQL Optimizer bỏ qua vị từ chỉ mục cho chế độ xem này?

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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thay đổi Cổng Web trong EBS 12.2

  2. Cách tạo hàng cho phạm vi ngày theo khóa

  3. Kiểm tra xem tệp có tồn tại không?

  4. Nhóm Oracle chỉ theo MỘT cột

  5. Cách khai báo một biến số nơi tôi có thể lưu số lượng bảng trong vòng lặp của mình