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

Chỉ mục không được sử dụng do chuyển đổi loại?

một ẩn ý chuyển đổi có thể ngăn trình tối ưu hóa sử dụng chỉ mục. Cân nhắc:

SQL> CREATE TABLE a (ID VARCHAR2(10) PRIMARY KEY);
 
Table created
 
SQL> insert into a select rownum from dual connect by rownum <= 1e6;
 
1000000 rows inserted

Đây là một bảng đơn giản nhưng kiểu dữ liệu không phải là 'đúng', tôi-e nếu bạn truy vấn nó như thế này, nó sẽ quét toàn bộ:

SQL> select * from a where id = 100;
 
ID
----------
100

Trên thực tế, truy vấn này tương đương với:

select * from a where to_number(id) = 100;

Nó không thể sử dụng chỉ mục vì chúng tôi đã lập chỉ mục id chứ không phải to_number(id) . Nếu chúng tôi muốn sử dụng chỉ mục, chúng tôi sẽ phải rõ ràng :

select * from a where id = '100';

Để trả lời nhận xét của pakr: Có rất nhiều quy tắc liên quan đến chuyển đổi ngầm định. Một nơi tốt để bắt đầu là tài liệu . Trong số những điều khác, chúng tôi biết được rằng:

Có nghĩa là khi chuyển đổi ngầm định xảy ra trong "WHERE column=variable" , Oracle sẽ chuyển đổi kiểu dữ liệu của cột và KHÔNG của biến, do đó ngăn chỉ mục được sử dụng. Đây là lý do tại sao bạn nên luôn sử dụng đúng loại kiểu dữ liệu hoặc chuyển đổi biến một cách rõ ràng.

Từ tài liệu Oracle:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. số hàng tăng lên khi giá trị của trường thay đổi trong Oracle

  2. Sự cố thuật sĩ mô hình dữ liệu thực thể với kết nối Oracle

  3. Hàm LISTAGG:kết quả của việc nối chuỗi quá dài

  4. PLS-00103 Đã gặp biểu tượng> lỗi khi thực hiện quy trình được lưu trữ

  5. Oracle, cách mở con trỏ và chọn một cột trong số nhiều cột vào một biến