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: