在我們的應用中有會話級配置不區分大小寫的語義:爲什麼NLSSORT索引不用於此查詢?
alter session set NLS_COMP=LINGUISTIC;
alter session set NLS_SORT=BINARY_AI;
但我希望能有與二元語義的名字列的表,所以我相應地定義一個基於函數的索引:
create table RAW_SCREEN (
ID number(10) constraint RSCR_PK primary key,
NAME nvarchar2(256) not null
);
create unique index RSCR_IDX on RAW_SCREEN (nlssort(NAME, 'NLS_SORT=BINARY'));
我本來期望下面的查詢採取基於函數的索引的優勢:
select * from RAW_SCREEN where
nlssort(NAME, 'NLS_SORT=BINARY') = nlssort(N'raw_screen1', 'NLS_SORT=BINARY');
但沒有。查詢計劃顯示錶掃描。雖然實驗,我發現,在名稱的簡單指標的伎倆:
create unique index RSCR_IDX2 on RAW_SCREEN (NAME);
當再次運行查詢,成功地使用了RSCR_IDX2指數。
現在,這並不令人感到意外,但我不明白爲什麼第一個基於函數的索引沒有被優化器使用。索引表達式與WHERE條件中使用的表達式完全匹配。你有什麼想法,爲什麼它不被使用?
注意:這是在Oracle運行10.2
這裏是一個完整的測試腳本,如果你想嘗試一下:
alter session set NLS_COMP=LINGUISTIC;
alter session set NLS_SORT=BINARY_AI;
create table RAW_SCREEN (
ID number(10) constraint RSCR_PK primary key,
NAME nvarchar2(256) not null
);
create unique index RSCR_IDX on RAW_SCREEN (nlssort(NAME, 'NLS_SORT=BINARY'));
--create unique index RSCR_IDX2 on RAW_SCREEN (NAME);
begin
for i in 1..10000
loop
insert into RAW_SCREEN values (i, 'raw_screen' || i);
end loop;
end;
/
commit;
select * from RAW_SCREEN where nlssort(NAME, 'NLS_SORT=BINARY') = nlssort(N'raw_screen1000', 'NLS_SORT=BINARY');