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

एक अद्यतन SQL का अनुकूलन कैसे करें जो 700M पंक्तियों के साथ Oracle तालिका पर चलता है

सबसे पहले यह एक बार की क्वेरी है या यह बार-बार की जाने वाली क्वेरी है? यदि आपको इसे केवल एक बार करना है तो आप क्वेरी को समानांतर मोड में चलाने पर विचार कर सकते हैं। आपको वैसे भी सभी पंक्तियों को स्कैन करना होगा, आप या तो कार्यभार को स्वयं ROWID की श्रेणियों के साथ विभाजित कर सकते हैं (इसे स्वयं करें समानांतरवाद) या Oracle अंतर्निहित सुविधाओं का उपयोग करें।

यह मानते हुए कि आप इसे बार-बार चलाना चाहते हैं और इस क्वेरी को अनुकूलित करना चाहते हैं, field . के साथ पंक्तियों की संख्या पंक्तियों की कुल संख्या की तुलना में NULL के रूप में कॉलम अंततः छोटा होगा। उस स्थिति में एक सूचकांक चीजों को गति दे सकता है। Oracle उन पंक्तियों को अनुक्रमित नहीं करता है जिनमें सभी अनुक्रमित स्तंभ NULL के रूप में होते हैं, इसलिए field . पर एक अनुक्रमणिका आपकी क्वेरी द्वारा उपयोग नहीं किया जाएगा (चूंकि आप उन सभी पंक्तियों को खोजना चाहते हैं जहां field न्यूल है)।

या तो:

  • (FIELD, 0) पर एक इंडेक्स बनाएं , 0 एक गैर-नल छद्म स्तंभ के रूप में कार्य करेगा और सभी पंक्तियों को तालिका में अनुक्रमित किया जाएगा।
  • (CASE WHEN field IS NULL THEN 1 END) , यह केवल उन पंक्तियों को अनुक्रमित करेगा जो NULLs हैं (इसलिए सूचकांक बहुत कॉम्पैक्ट होगा)। उस स्थिति में आपको अपनी क्वेरी फिर से लिखनी होगी:

    UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1

संपादित करें:

चूंकि यह एक बार का परिदृश्य है, इसलिए आप PARALLEL . का उपयोग करना चाह सकते हैं संकेत:

SQL> EXPLAIN PLAN FOR
  2  UPDATE /*+ PARALLEL(test_table 4)*/ test_table
  3     SET field=0
  4   WHERE field IS NULL;

Explained

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4026746538
--------------------------------------------------------------------------------
| Id  | Operation             | Name       | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT      |            | 22793 |   289K|    12   (9)| 00:00:
|   1 |  UPDATE               | TEST_TABLE |       |       |            |
|   2 |   PX COORDINATOR      |            |       |       |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000   | 22793 |   289K|    12   (9)| 00:00:
|   4 |     PX BLOCK ITERATOR |            | 22793 |   289K|    12   (9)| 00:00:
|*  5 |      TABLE ACCESS FULL| TEST_TABLE | 22793 |   289K|    12   (9)| 00:00:
--------------------------------------------------------------------------------


  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 में सिस्टमस्टैम्प फ़ंक्शन

  2. Oracle SQL - मैं JSP का उपयोग करके ODCI पाइपलाइन फ़ंक्शन को कैसे कॉल कर सकता हूँ?

  3. क्वेरी लागत:वैश्विक अस्थायी तालिकाएँ बनाम संग्रह (आभासी सरणी)

  4. सप्ताह के दिन सोमवार से रविवार तक छाँटें

  5. oracle varchar to number