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

प्रदर्शन समस्या:चुनिंदा एस के बीच अंतर। * बनाम चयन *

वे निश्चित रूप से दो अलग-अलग प्रश्न हैं। चयन अलग होने के साथ योजना बदल सकती है। यानी sth.* में यह बाईं सम्मिलित तालिका पर एक पूर्ण/तेज़ पूर्ण अनुक्रमणिका स्कैन चुन सकता है। जबकि पहली बार में यह फुल टेबल स्कैन होगा।

आपकी और मदद करने के लिए, क्या हम कृपया योजनाएँ देख सकते हैं? अधिमानतः इसे SQL*PLUS

. में करें
set timing on
set autotrace on traceonly

select s.* from sales_unit s left join sales_unit_relation r on (s.sales_unit_id = r.sales_unit_child_id) where r.sales_unit_child_id is null;

select * from sales_unit s left join sales_unit_relation r on (s.sales_unit_id = r.sales_unit_child_id) where r.sales_unit_child_id is null;

संपादित करें

अपनी व्याख्या योजना को देखते हुए, आप हर कदम पर कार्डिनैलिटी =1 देखते हैं? टेबल खाली होने पर आपने आंकड़े एकत्र कर लिए हैं! इसे देखें:

SQL> select s.* from sales_unit s left join sales_unit_relation r on (s.sales_unit_id = r.child_sales_unit_id) where r.child_sales_unit_id is null;

no rows selected

Elapsed: 00:00:03.19

Execution Plan
----------------------------------------------------------
Plan hash value: 1064670292

------------------------------------------------------------------------------------
| Id  | Operation          | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |               |     1 |    48 |    27  (86)| 00:00:01 |
|   1 |  NESTED LOOPS ANTI |               |     1 |    48 |    27  (86)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| SALES_UNIT    |     1 |    35 |     2   (0)| 00:00:01 |
|*  3 |   INDEX RANGE SCAN | SALES_REL_IX1 |     1 |    13 |    25  (92)| 00:00:01 |
------------------------------------------------------------------------------------

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

   3 - access("S"."SALES_UNIT_ID"="R"."CHILD_SALES_UNIT_ID")


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
     200314  consistent gets
       2220  physical reads
          0  redo size
        297  bytes sent via SQL*Net to client
        339  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

तो देखिए इसने 200314 IO का इस्तेमाल किया और कुछ सेकंड लगे। प्रत्येक चरण पर ROWS =1 भी देखें (अर्थात पूर्ण स्कैन)..आँकड़ों को एकत्रित करने देता है:

SQL> begin dbms_stats.gather_table_stats(user, 'SALES_UNIT', degree=>8, cascade=>true); end;
  2  /

PL/SQL procedure successfully completed.

SQL> begin dbms_stats.gather_table_stats(user, 'SALES_UNIT_RELATION', degree=>8, cascade=>true); end;
  2  /

PL/SQL procedure successfully completed.

और अब फिर से चलाएँ:SQL> s चुनें।* sales_unit के बाएँ से शामिल हों sales_unit_relation r पर (s.sales_unit_id =r.child_sales_unit_id) जहाँ r.child_sales_unit_id रिक्त है;

no rows selected

Elapsed: 00:00:00.84

Execution Plan
----------------------------------------------------------
Plan hash value: 2005864719

-----------------------------------------------------------------------------------------------
| Id  | Operation             | Name          | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |               |   912 | 18240 |       |  1659   (3)| 00:00:20 |
|*  1 |  HASH JOIN ANTI       |               |   912 | 18240 |  2656K|  1659   (3)| 00:00:20 |
|   2 |   TABLE ACCESS FULL   | SALES_UNIT    |   100K|  1472K|       |    88   (3)| 00:00:02 |
|   3 |   INDEX FAST FULL SCAN| SALES_REL_IX1 |   991K|  4841K|       |   618   (3)| 00:00:08 |
-----------------------------------------------------------------------------------------------

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

   1 - access("S"."SALES_UNIT_ID"="R"."CHILD_SALES_UNIT_ID")


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       2537  consistent gets
          0  physical reads
          0  redo size
        297  bytes sent via SQL*Net to client
        339  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL>

अब हमने केवल 2537 गेट्स का उपयोग किया है और योजना सही ROWS और एक HASH जॉइन (हमारी आवश्यकताओं के लिए बेहतर) दिखाती है। मेरी टेस्ट टेबल शायद आपके असली टेबल से छोटी हैं, इसलिए समय करीब है




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जावा सुरक्षा अपवाद:डेटाबेस से कनेक्ट करने का प्रयास करते समय सीलिंग उल्लंघन

  2. java.sql.SQLException:श्रोता ने निम्न त्रुटि के साथ कनेक्शन से इनकार कर दिया:ORA-12519, TNS:कोई उपयुक्त सेवा हैंडलर नहीं मिला

  3. ओरेकल में एमओडी () फ़ंक्शन

  4. ओरेकल एसक्यूएल संयोजन

  5. Oracle MySQL INSERT IGNORE के बराबर है?