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

Tại sao chỉ mục NLSSORT không được sử dụng cho truy vấn này?

Biểu thức được chuyển đổi thành cài đặt phiên NLS trong DML, nhưng không được chuyển đổi trong DDL.

Đây được cho là một lỗi với hoạt động của NLSSORT(char, 'NLS_SORT=BINARY') .
Từ hướng dẫn sử dụng :"Nếu bạn chỉ định BINARY, thì hàm này trả về char." Nhưng đó không phải đúng với chỉ mục. Thông thường, rất thuận tiện là biểu thức chỉ mục không trải qua bất kỳ biến đổi nào; nếu nó phụ thuộc vào các công cụ thiết lập phiên như DBMS_METADATA.GET_DDL sẽ phải trả về nhiều alter session các câu lệnh. Nhưng trong trường hợp này, điều đó có nghĩa là bạn có thể tạo một chỉ mục sẽ không bao giờ được sử dụng.

Kế hoạch giải thích cho thấy thực tế biểu hiện. Đây là cách Oracle sử dụng nlssort trong một phiên mà nó không được sử dụng rõ ràng:

alter session set nls_comp=linguistic;
alter session set nls_sort=binary_ai;
drop table raw_screen;
create table raw_screen (
   id   number(10)     constraint rscr_pk primary key,
   name nvarchar2(256) not null
);
create unique index idx_binary_ai
      on raw_screen (nlssort(name, 'nls_sort=binary_ai'));
explain plan for select * from raw_screen where name = n'raw_screen1000';
select * from table(dbms_xplan.display(format=>'basic predicate'));

Plan hash value: 2639454581

-----------------------------------------------------
| Id  | Operation                   | Name          |
-----------------------------------------------------
|   0 | SELECT STATEMENT            |               |
|   1 |  TABLE ACCESS BY INDEX ROWID| RAW_SCREEN    |
|*  2 |   INDEX UNIQUE SCAN         | IDX_BINARY_AI |
-----------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(NLSSORT("NAME",'nls_sort=''BINARY_AI''')=HEXTORAW('0072006
              10077005F00730063007200650065006E003100300030003000'))

Ví dụ này cho thấy rằng nlssort(char, 'nls_sort=binary') bị loại bỏ bởi DML:

alter session set nls_comp=linguistic;
alter session set nls_sort=binary_ai;
drop table raw_screen;
create table raw_screen (
   id   number(10)     constraint rscr_pk primary key,
   name nvarchar2(256) not null
);
create unique index idx_binary_ai on
      raw_screen (nlssort(name, 'nls_sort=binary_ai'));
explain plan for select * from raw_screen where
  nlssort(name,'nls_sort=binary') = nlssort(N'raw_screen1000','nls_sort=binary');
select * from table(dbms_xplan.display(format=>'basic predicate'));

Plan hash value: 237065300

----------------------------------------
| Id  | Operation         | Name       |
----------------------------------------
|   0 | SELECT STATEMENT  |            |
|*  1 |  TABLE ACCESS FULL| RAW_SCREEN |
----------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("NAME"=U'raw_screen1000')

Tóm lại - chỉ mục DDL cần phải khớp chính xác với đã chuyển đổi biểu thức, có thể phụ thuộc vào cài đặt phiên và hành vi bất thường của binary .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:Trả về nhiều giá trị trong một hàm

  2. Không thể tìm thấy mô-đun Python cx_Oracle mô-đun

  3. Chuyển đổi chuỗi phân cách thành hàng trong oracle

  4. Cách tách một chuỗi theo thứ tự với một chuỗi được phân tách bằng dấu phẩy và (có thể) các trường trống giữa dấu phẩy

  5. ORACLE SQL ORA-22814 thuộc tính hoặc giá trị phần tử lớn hơn giá trị được chỉ định trong loại