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

मैं इंडेक्स का उपयोग करने के लिए COUNT(col) ... GROUP BY कैसे प्राप्त कर सकता हूं?

मुझे इसके साथ खेलने का मौका मिला है, और 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 के पुराने संस्करणों पर सच नहीं हो सकता है, लेकिन यह शायद आगे का रास्ता बताता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle DECODE के लिए मानक SQL विकल्प

  2. Oracle ट्रिगर इंसर्ट/अपडेट

  3. ORACLE - ORA-01843:मान्य माह नहीं है

  4. क्या Oracle sqlldr के लिए Oracle 10 और 11 में एक उदाहरण क्वालीफायर के रूप में TNS प्रविष्टि को स्वीकार करना संभव है?

  5. जावा से ओरेकल एसक्यूएल स्क्रिप्ट चलाएं