Především je to jednorázový dotaz nebo je to opakující se dotaz? Pokud to musíte udělat pouze jednou, možná se budete chtít podívat na spuštění dotazu v paralelním režimu. Stejně budete muset skenovat všechny řádky, můžete si pracovní zátěž rozdělit sami pomocí rozsahů ROWID (udělej si sám paralelismus) nebo použít vestavěné funkce Oracle.
Za předpokladu, že jej chcete spouštět často a chcete tento dotaz optimalizovat, počet řádků s field
sloupec jako NULL bude nakonec malý ve srovnání s celkovým počtem řádků. V takovém případě by index mohl věci urychlit. Oracle neindexuje řádky, které mají všechny indexované sloupce jako NULL, takže index na field
nezneužije váš dotaz (protože chcete najít všechny řádky, kde field
je NULL).
Buď:
- vytvořte index na
(FIELD, 0)
,0
bude fungovat jako pseudosloupec bez NULL a všechny řádky budou indexovány v tabulce. -
vytvořit index založený na funkcích na
(CASE WHEN field IS NULL THEN 1 END)
, bude to indexovat pouze řádky, které jsou NULL (index by proto byl velmi kompaktní). V takovém případě byste museli svůj dotaz přepsat:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Upravit:
Protože se jedná o jednorázový scénář, možná budete chtít použít PARALLEL
nápověda:
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:
--------------------------------------------------------------------------------