वे निश्चित रूप से दो अलग-अलग प्रश्न हैं। चयन अलग होने के साथ योजना बदल सकती है। यानी 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 जॉइन (हमारी आवश्यकताओं के लिए बेहतर) दिखाती है। मेरी टेस्ट टेबल शायद आपके असली टेबल से छोटी हैं, इसलिए समय करीब है