Przede wszystkim jest to zapytanie jednorazowe, czy jest to zapytanie cykliczne? Jeśli musisz to zrobić tylko raz, możesz rozważyć uruchomienie zapytania w trybie równoległym. I tak będziesz musiał przeskanować wszystkie wiersze, możesz albo samodzielnie podzielić obciążenie za pomocą zakresów ROWID (równoległości typu „zrób to sam”), albo użyć wbudowanych funkcji Oracle.
Zakładając, że chcesz go często uruchamiać i chcesz zoptymalizować to zapytanie, liczba wierszy z field
kolumna jako NULL będzie ostatecznie mała w porównaniu z całkowitą liczbą wierszy. W takim przypadku indeks może przyspieszyć działanie. Oracle nie indeksuje wierszy, w których wszystkie indeksowane kolumny mają wartość NULL, więc indeks field
nie zostanie wykorzystany przez Twoje zapytanie (ponieważ chcesz znaleźć wszystkie wiersze, w których field
jest NULL).
Albo:
- utwórz indeks na
(FIELD, 0)
,0
będzie działać jako pseudokolumna różna od NULL, a wszystkie wiersze w tabeli zostaną zindeksowane. -
utwórz indeks oparty na funkcji na
(CASE WHEN field IS NULL THEN 1 END)
, spowoduje to indeksowanie tylko wierszy, które są wartościami NULL (indeks byłby zatem bardzo zwarty). W takim przypadku konieczne byłoby przepisanie zapytania:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Edytuj:
Ponieważ jest to jednorazowy scenariusz, możesz użyć PARALLEL
wskazówka:
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:
--------------------------------------------------------------------------------