2012-08-15 12 views
5

हमारे ओरेकल इंस्टॉलेशन में एक टेबल में हमारे पास दो कॉलम (एक्स और वाई) पर एक इंडेक्स वाला एक टेबल है। यदि मैं टेबल पर एक क्वेरी करता हूं जहां क्लॉज केवल कॉलम एक्स को छूता है, तो ओरेकल इंडेक्स का उपयोग करने में सक्षम होगा?एकल कॉलम पर पूछे जाने वाले एकाधिक कॉलम के साथ ओरेकल इंडेक्स

उदाहरण के लिए:

टेबल Y: Col_A, Col_B, Col_C,

सूचकांक (Col_A, Col_B) पर मौजूद है

SELECT * FROM Table_Y WHERE Col_A = 'STACKOVERFLOW'; 

सूचकांक उपयोग किया जाएगा, या होगा एक टेबल स्कैन किया जाना चाहिए?

उत्तर

9

यह निर्भर करता है।

create table table_y (
    col_a varchar2(30), 
    col_b varchar2(30), 
    col_c varchar2(30) 
); 

create unique index table_y_ix on table_y (col_a, col_b); 

और फिर एक

साथ

EXPLAIN PLAN FOR 
    SELECT * FROM Table_Y WHERE Col_A = 'STACKOVERFLOW'; 

और फिर

select * from table(dbms_xplan.display); 

तो, उदाहरण के लिए:

आप दे ओरेकल कार्य योजना लागू की व्याख्या से यह जांच कर सकता है

explain plan for 
    select * from table_y 
    where col_a = 'STACKOVERFLOW'; 

select * from table(dbms_xplan.display); 

योजना (मेरी स्थापना पर) लगता है कि:

------------------------------------------------------------------------------------------ 
| Id | Operation     | Name  | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT   |   |  1 | 51 |  1 (0)| 00:00:01 | 
| 1 | TABLE ACCESS BY INDEX ROWID| TABLE_Y |  1 | 51 |  1 (0)| 00:00:01 | 
|* 2 | INDEX RANGE SCAN   | TABLE_Y_IX |  1 |  |  1 (0)| 00:00:01 | 
------------------------------------------------------------------------------------------ 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    2 - access("COL_A"='STACKOVERFLOW') 

आईडी 2, आप पता चलता है कि सूचकांक TABLE_Y_IX वास्तव में एक index range scan के लिए प्रयोग किया जाता है।

यदि किसी अन्य स्थापना पर ओरेकल इंडेक्स का उपयोग करने का विकल्प चुनता है तो कई चीजों पर निर्भर करता है। यह ओरेकल का क्वेरी ऑप्टिमाइज़र है जो यह निर्णय करता है।

अद्यतन आपको लगता है आप से बेहतर (प्रदर्शन बुद्धिमान, कि है) अगर ओरेकल सूचकांक का इस्तेमाल किया है, तो आप का प्रयास करने के + index_asc(...) (index hint देखें)

अपने मामले में

तो चाहते हो सकता है हो सकता है कर रहे हैं कि होगा कुछ

SELECT /*+ index_asc(TABLE_Y TABLE_Y_IX) */ * 
    FROM Table_Y 
WHERE Col_A = 'STACKOVERFLOW'; 

इसके अतिरिक्त, मैं यह सुनिश्चित करता हूं कि आपने तालिका और उसके कॉलम पर आंकड़े एकत्र किए हैं। आप के साथ आंकड़ों के अंतिम सभा की तारीख की जाँच कर सकते एक

select last_analyzed from dba_tables where table_name = 'TABLE_Y'; 

और

select column_name, last_analyzed from dba_tab_columns where table_name = 'TABLE_Y'; 

कोई आंकड़े या अगर वे बासी हों, तो स्वयं dbms_stats पैकेज से परिचित कराने के इस तरह के इकट्ठा करने के लिए नहीं हैं, तो आंकड़े।

ये आंकड़े डेटा हैं जो क्वेरी ऑप्टिमाइज़र अपने निर्णय लेने के लिए भारी निर्भर करता है।

+0

बिल्कुल सही, जो बहुत मदद करता है।एक तरफ, मेरी स्थापना एक टेबल स्कैन की रिपोर्ट करती है, लेकिन कम से कम अब मेरे पास जांच करने की क्षमता है। –

+0

बस सोच रहा है। निष्पादन योजना चयन इस बात पर निर्भर करता है कि आप इंडेक्स में पहला या दूसरा कॉलम चुन रहे हैं या नहीं। यही है कि यदि आप पहला कॉलम चुन रहे हैं तो आपको इंडेक्स रेंज स्कैन मिलता है लेकिन यदि आप दूसरे कॉलम का चयन कर रहे हैं तो आपको एक पूर्ण टेबल स्कैन मिलता है? – Gisli

+1

@ गिस्ली: ओरेकल आपके परिदृश्य में एक [इंडेक्स स्किप स्कैन] (http://docs.oracle.com/cd/E11882_01/server.112/e16638/optimops.htm#PFGRF10105) के लिए इंडेक्स का उपयोग करना चुन सकता है। –

संबंधित मुद्दे