डिफ़ॉल्ट रूप से ओरेकल बनाए गए इंडेक्स का उपयोग करता है।ओरेकल - मैं इंडेक्स कैसे बना सकता हूं जिसका उपयोग तब किया जाएगा जब NLS_COMP = भाषाई और NLS_Sort = Binary_CI
जब मैं NLS_COMP = भाषाई और NLS_Sort = Binary_CI में बदलता हूं, तो मुझे पूर्ण तालिका स्कैन मिलता है।
मैं कहीं पढ़ता हूं जो एक इंडेक्स बना रहा है (nlssort (name, 'NLS_SORT = BINARY_CI')); काम करेगा।
जैसा कि मेरा प्रयास नीचे दिखाता है, इतना नहीं। यहां तक कि अगर मैं इसे मजबूर करता हूं, तो प्रदर्शन ऐसा प्रतीत नहीं होता है जो मैं अपेक्षा करता हूं। यह एक मामूली उदाहरण है जिसे मैं कई लाख पंक्तियों के साथ एक टेबल के लिए हल करना चाहता हूं, इसलिए पूर्ण टेबल स्कैन खराब होंगे।
तो सवाल यह है कि मैं इंडेक्स कैसे बना सकता हूं ताकि उनका उपयोग किया जा सके।
धन्यवाद
- सेटअप एक्स
create table x (name varchar2(30)) ;
insert into x select table_name from all_tables;
create index x_ix on x (name);
create index x_ic on x (nlssort(name, 'NLS_SORT=BINARY_CI'));
/
- सामान्य सेटिंग
ALTER SESSION SET NLS_COMP=BINARY;
ALTER SESSION SET NLS_SORT=BINARY;
/
set autotrace on
/
select * from X where NAME like 'x%';
--0 rows selected
--
---------------------------------------------------------------------------
--| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
--| 0 | SELECT STATEMENT | | 1 | 17 | 1 (0)| 00:00:01 |
--|* 1 | INDEX RANGE SCAN| X_IX | 1 | 17 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------
/
set autotrace off
/
- भाषाई
ALTER SESSION SET NLS_COMP=LINGUISTIC;
ALTER SESSION SET NLS_SORT=BINARY_CI;
/
set autotrace on
/
select * from X where NAME like 'x%';
--13 rows selected
--
----------------------------------------------------------------------------
--| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
--| 0 | SELECT STATEMENT | | 1 | 17 | 3 (0)| 00:00:01 |
--|* 1 | TABLE ACCESS FULL| X | 1 | 17 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
select /*+ INDEX(X X_IX ) */ * from X where NAME like 'x%';
--13 rows selected
--
---------------------------------------------------------------------------
--| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
--| 0 | SELECT STATEMENT | | 1 | 17 | 9 (0)| 00:00:01 |
--|* 1 | INDEX FULL SCAN | X_IX | 1 | 17 | 9 (0)| 00:00:01 |
---------------------------------------------------------------------------
select /*+ INDEX(X X_IC ) */ * from X where NAME like 'x%';
--13 rows selected
--
--------------------------------------------------------------------------------------
--| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
--| 0 | SELECT STATEMENT | | 1 | 17 | 448 (1)| 00:00:06 |
--|* 1 | TABLE ACCESS BY INDEX ROWID| X | 1 | 17 | 448 (1)| 00:00:06 |
--| 2 | INDEX FULL SCAN | X_IC | 1629 | | 8 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
/
set autotrace off
/
मैं एक पुनरुत्पादित उदाहरण के लिए प्रशंसा देना चाहता था। कुडोस! –