Първо еднократна заявка ли е или повтаряща се? Ако трябва да го направите само веднъж, може да искате да разгледате изпълнението на заявката в паралелен режим. Така или иначе ще трябва да сканирате всички редове, можете или сами да разделите работното натоварване с диапазони на ROWID (паралелизъм „направи си сам“) или да използвате вградените функции на Oracle.
Ако приемем, че искате да го изпълнявате често и искате да оптимизирате тази заявка, броят на редовете с field
като NULL в крайна сметка ще бъде малък в сравнение с общия брой редове. В такъв случай един индекс може да ускори нещата. Oracle не индексира редове, които имат всички индексирани колони като NULL, така че индекс на field
няма да се използва от вашата заявка (тъй като искате да намерите всички редове, където field
е NULL).
Или:
- създайте индекс на
(FIELD, 0)
,0
ще действа като не-NULL псевдоколона и всички редове ще бъдат индексирани в таблицата. -
създайте базиран на функция индекс на
(CASE WHEN field IS NULL THEN 1 END)
, това ще индексира само редовете, които са NULL (следователно индексът ще бъде много компактен). В такъв случай ще трябва да пренапишете заявката си: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:
--------------------------------------------------------------------------------