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

ओरेकल:क्या चयन सूची में उपश्रेणियों के साथ समानांतर निष्पादन का उपयोग न करने का कोई तार्किक कारण है?

उस सूची का प्रत्येक आइटम गलत है।

(कम से कम Oracle 11gR2, और शायद10g के लिए भी। सूची Oracle के कुछ अप्रचलित संस्करणों के लिए सटीक हो सकती है।)

जब भी संभव हो मैं आधिकारिक Oracle दस्तावेज़ीकरण का उपयोग करने की सलाह देता हूं, लेकिन समानांतर निष्पादन अध्याय बहुत सटीक नहीं है।

और यहां तक ​​​​कि जब मैनुअल गलत नहीं है, तो यह अक्सर भ्रामक होता है, क्योंकि समानांतर निष्पादन बहुत जटिल होता है। यदि आप सभी दस्तावेजों के माध्यम से जाते हैं, तो आप पाएंगे कि लगभग 30 विभिन्न चर हैं जो समानता की डिग्री निर्धारित करते हैं। यदि आप कभी भी वस्तुओं की एक छोटी चेकलिस्ट देखते हैं, तो आपको बहुत संदेह होना चाहिए। वे चेकलिस्ट आमतौर पर एक बहुत ही विशिष्ट संदर्भ में विचार करने के लिए सबसे अधिक प्रासंगिक आइटम होते हैं।

उदाहरण:

SQL> --Create a table without any parallel settings
SQL> create table parallel_test(a number primary key, b number);

Table created.

SQL> --Create some test data
SQL> insert into parallel_test
  2  select level, level from dual connect by level <= 100000;

100000 rows created.

SQL> commit;

Commit complete.

SQL> --Force the session to run the query in parallel
SQL> alter session force parallel query;

Session altered.
SQL> --Generate explain plan
SQL> explain plan for
  2  select a
  3     ,(
  4             select a
  5             from parallel_test parallel_test2
  6             where parallel_test2.a = parallel_test.a
  7     )
  8  from parallel_test;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3823224058

---------------------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name         | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |              |   116K|  1477K|     9   (0)| 00:00:01 |        |      |            |
|*  1 |  INDEX UNIQUE SCAN      | SYS_C0028894 |     1 |    13 |     1   (0)| 00:00:01 |        |      |            |
|   2 |  PX COORDINATOR         |              |       |       |            |          |        |      |            |
|   3 |   PX SEND QC (RANDOM)   | :TQ10000     |   116K|  1477K|     9   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   4 |    PX BLOCK ITERATOR    |              |   116K|  1477K|     9   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   5 |     INDEX FAST FULL SCAN| SYS_C0028894 |   116K|  1477K|     9   (0)| 00:00:01 |  Q1,00 | PCWP |            |
---------------------------------------------------------------------------------------------------------------------

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

   1 - access("PARALLEL_TEST2"."A"=:B1)

Note
-----
   - dynamic sampling used for this statement (level=2)

21 rows selected.

SQL>

कोई समानांतर संकेत नहीं, कोई समानांतर ऑब्जेक्ट नहीं, कोई पूर्ण तालिका स्कैन नहीं, कोई अनुक्रमणिका श्रेणी स्कैन नहीं जो कई विभाजनों में फैले हुए हैं, और एक स्केलर सबक्वेरी।

एक भी शर्त पूरी नहीं हुई , फिर भी क्वेरी अभी भी समानता का उपयोग करती है। (मैंने v$px_process . भी सत्यापित किया है यह सुनिश्चित करने के लिए कि क्वेरी वास्तव में समानता का उपयोग करती है, और यह केवल एक व्याख्या योजना विफलता नहीं है।)

इसका मतलब है कि आपके दूसरे प्रश्न का उत्तर गलत है।

मुझे यकीन नहीं है कि उस मामले में क्या हो रहा है, लेकिन मुझे लगता है कि इसका FAST DUAL से कोई लेना-देना नहीं है अनुकूलन। कुछ संदर्भों में, DUAL का उपयोग तालिका के रूप में नहीं किया जाता है, इसलिए समानांतर करने के लिए कुछ भी नहीं है। यह शायद एक "बग" है, लेकिन यदि आप डीयूएएल का उपयोग कर रहे हैं तो आप वास्तव में समांतरता नहीं चाहते हैं। (हालांकि मुझे लगता है कि आपने प्रदर्शन उद्देश्यों के लिए DUAL का उपयोग किया है, और आपकी वास्तविक क्वेरी अधिक जटिल है। यदि ऐसा है, तो आपको अधिक यथार्थवादी उदाहरण के साथ क्वेरी को अपडेट करने की आवश्यकता हो सकती है।)




  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 में REGEXP_REPLACE () फ़ंक्शन

  2. Oracle को PostgreSQL से कनेक्ट करना

  3. पीएल/एसक्यूएल में अपवाद कैसे बढ़ाएं?

  4. Oracle में लॉक की गई पंक्तियों को कैसे खोजें

  5. ऑरैकल में लोब सेगमेंट (SYS_LOB) को समझना?