sql >> Databáze >  >> RDS >> Oracle

Proč se pro tento dotaz nepoužívá index NLSSORT?

Výrazy jsou převedeny na nastavení relace NLS v DML, ale ne v DDL.

Toto je pravděpodobně chyba s chováním NLSSORT(char, 'NLS_SORT=BINARY') .
Z příručky :"Pokud zadáte BINARY, pak tato funkce vrátí znak." Ale to není platí pro index. Normálně je velmi výhodné, že výraz indexu neprochází žádnou transformací; pokud by to záviselo na nastavení relace, pak by nástroje jako DBMS_METADATA.GET_DDL musely vrátit mnoho alter session prohlášení. Ale v tomto případě to znamená, že můžete vytvořit index, který nebude nikdy použit.

Plán vysvětlení ukazuje skutečné výraz. Zde je návod, jak Oracle používá nlssort v relaci, aniž by byla explicitně použita:

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'))

Tento příklad ukazuje, že nlssort(char, 'nls_sort=binary') je zrušeno 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')

Stručně řečeno – index DDL se musí přesně shodovat s transformovaným výrazů, které mohou záviset na nastavení relace a neobvyklém chování binary .



  1. MySQL-Cluster se nespustí

  2. Formulář PHP zkontrolován, když je hodnota zaškrtávacího políčka v dotazu pole mysql?

  3. Jak vybrat posledních N záznamů z tabulky v mysql

  4. Jak může nastavení jazyka ovlivnit výsledky FORMAT() na serveru SQL (příklady T-SQL)