Прежде всего, это разовый запрос или повторяющийся? Если вам нужно сделать это только один раз, возможно, вы захотите запустить запрос в параллельном режиме. В любом случае вам придется сканировать все строки, вы можете либо разделить рабочую нагрузку на диапазоны ROWID (параллелизм самостоятельно), либо использовать встроенные функции Oracle.
Предполагая, что вы хотите часто его запускать и хотите оптимизировать этот запрос, количество строк со столбцом field
, равным NULL, в конечном итоге будет небольшим по сравнению с общим числом строк. В этом случае индекс может ускорить процесс. Oracle не индексирует строки, в которых все индексированные столбцы имеют значение NULL, поэтому индекс по field
не будет использоваться вашим запросом (поскольку вы хотите найти все строки, где field
равно NULL).
Или:
- создайте индекс для
(FIELD, 0)
, 0
будет действовать как ненулевой псевдостолбец, и все строки будут проиндексированы в таблице.
создайте индекс на основе функции для (CASE WHEN field IS NULL THEN 1 END)
, он будет индексировать только те строки, которые имеют значение NULL (поэтому индекс будет очень компактным). В этом случае вам придется переписать ваш запрос:
UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Edit:
Поскольку это разовый сценарий, вы можете использовать подсказку 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:
--------------------------------------------------------------------------------