मुझे इसके साथ खेलने का मौका मिला है, और NOT IN के बारे में मेरी पिछली टिप्पणियां इस मामले में एक लाल हेरिंग हैं। मुख्य बात यह है कि एनयूएलएल की उपस्थिति है, या इसके बजाय कि क्या अनुक्रमित कॉलम में न्यूल बाधाएं लागू नहीं हैं।
यह आपके द्वारा उपयोग किए जा रहे डेटाबेस के संस्करण पर निर्भर करेगा, क्योंकि ऑप्टिमाइज़र प्रत्येक रिलीज़ के साथ स्मार्ट हो जाता है। मैं 11gR1 का उपयोग कर रहा हूं और अनुकूलक ने एक को छोड़कर सभी मामलों में सूचकांक का उपयोग किया:जब दोनों कॉलम शून्य थे और मैंने NOT IN
शामिल नहीं किया था खंड:
SQL> desc big_table
Name Null? Type
----------------------------------- ------ -------------------
ID NUMBER
COL1 NUMBER
COL2 VARCHAR2(30 CHAR)
COL3 DATE
COL4 NUMBER
NOT IN क्लॉज के बिना...
SQL> explain plan for
2 select col4, count(col1) from big_table
3 group by col4
4 /
Explained.
SQL> select * from table(dbms_xplan.display)
2 /
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 1753714399
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 31964 | 280K| | 7574 (2)| 00:01:31 |
| 1 | HASH GROUP BY | | 31964 | 280K| 45M| 7574 (2)| 00:01:31 |
| 2 | TABLE ACCESS FULL| BIG_TABLE | 2340K| 20M| | 4284 (1)| 00:00:52 |
----------------------------------------------------------------------------------------
9 rows selected.
SQL>
जब मैंने NOT IN
क्लॉज बैक इन, ऑप्टिमाइज़र ने इंडेक्स का उपयोग करने का विकल्प चुना। अजीब।
SQL> explain plan for
2 select col4, count(col1) from big_table
3 where col1 not in (12, 19)
4 group by col4
5 /
Explained.
SQL> select * from table(dbms_xplan.display)
2 /
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 343952376
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 31964 | 280K| | 5057 (3)| 00:01:01 |
| 1 | HASH GROUP BY | | 31964 | 280K| 45M| 5057 (3)| 00:01:01 |
|* 2 | INDEX FAST FULL SCAN| BIG_I2 | 2340K| 20M| | 1767 (2)| 00:00:22 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
2 - filter("COL1"<>12 AND "COL1"<>19)
14 rows selected.
SQL>
बस दोहराने के लिए, अन्य सभी मामलों में, जब तक अनुक्रमित कॉलम में से एक को शून्य घोषित नहीं किया गया था, तब तक इंडेक्स का उपयोग क्वेरी को संतुष्ट करने के लिए किया गया था। यह Oracle के पुराने संस्करणों पर सच नहीं हो सकता है, लेकिन यह शायद आगे का रास्ता बताता है।