सबसे पहले यह एक बार की क्वेरी है या यह बार-बार की जाने वाली क्वेरी है? यदि आपको इसे केवल एक बार करना है तो आप क्वेरी को समानांतर मोड में चलाने पर विचार कर सकते हैं। आपको वैसे भी सभी पंक्तियों को स्कैन करना होगा, आप या तो कार्यभार को स्वयं 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:
--------------------------------------------------------------------------------