Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

इस क्वेरी के लिए NLSSORT अनुक्रमणिका का उपयोग क्यों नहीं किया जाता है?

डीएमएल में एक्सप्रेशन एनएलएस सत्र सेटिंग्स में परिवर्तित होते हैं, लेकिन डीडीएल में नहीं।

यह यकीनन NLSSORT(char, 'NLS_SORT=BINARY') के व्यवहार के साथ एक बग है। .
मैनुअल :"यदि आप बाइनरी निर्दिष्ट करते हैं, तो यह फ़ंक्शन चार लौटाता है।" लेकिन वह नहीं है सूचकांक के लिए सच है। आम तौर पर यह बहुत सुविधाजनक होता है कि सूचकांक अभिव्यक्ति में कोई परिवर्तन नहीं होता है; यदि यह DBMS_METADATA.GET_DDL जैसे टूल की तुलना में सत्र सेटिंग्स पर निर्भर करता है, तो कई alter session को वापस करना होगा बयान। लेकिन इस मामले में इसका मतलब है कि आप एक इंडेक्स बना सकते हैं जिसका कभी भी उपयोग नहीं किया जाएगा।

व्याख्या योजना असली . दिखाती है अभिव्यक्ति। यहां बताया गया है कि Oracle कैसे nlssort का उपयोग करता है एक सत्र में इसका स्पष्ट रूप से उपयोग किए बिना:

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

यह उदाहरण दिखाता है कि nlssort(char, 'nls_sort=binary') 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')

संक्षेप में - अनुक्रमणिका DDL को रूपांतरित . से सटीक रूप से मेल खाना चाहिए भाव, जो सत्र सेटिंग्स और 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. हजारों WHERE क्लॉज के साथ SQL क्वेरी को ऑप्टिमाइज़ कैसे करें

  2. हाइबरनेट 4.1 के साथ मूल क्वेरी निष्पादित करना

  3. डेटाबेस बाधा और व्युत्क्रम =सत्य के साथ एक-से-अनेक संबंध

  4. जहां अपेक्षित था, कीवर्ड से नहीं मिला, पाठ चयन Oracle SQL

  5. तालिका अनुदान बनाने के साथ भी तत्काल निष्पादित करें विफल रहता है