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
.