Zunächst einmal handelt es sich um eine einmalige Abfrage oder um eine wiederkehrende Abfrage? Wenn Sie dies nur einmal tun müssen, sollten Sie die Abfrage im parallelen Modus ausführen. Sie müssen sowieso alle Zeilen scannen, Sie können die Arbeitslast entweder selbst mit ROWID-Bereichen (Do-it-yourself-Parallelität) aufteilen oder die integrierten Funktionen von Oracle verwenden.
Angenommen, Sie möchten es häufig ausführen und diese Abfrage optimieren, die Anzahl der Zeilen mit dem field
Spalte als NULL wird im Vergleich zur Gesamtzahl der Zeilen schließlich klein sein. In diesem Fall könnte ein Index die Dinge beschleunigen. Oracle indiziert keine Zeilen, die alle indizierten Spalten als NULL haben, also einen Index für field
wird von Ihrer Abfrage nicht verwendet (da Sie alle Zeilen finden möchten, in denen field
ist NULL).
Entweder:
- erstelle einen Index für
(FIELD, 0)
, die0
fungiert als Nicht-NULL-Pseudospalte und alle Zeilen werden in der Tabelle indiziert. -
Erstellen Sie einen funktionsbasierten Index für
(CASE WHEN field IS NULL THEN 1 END)
, wird dies nur die Zeilen indizieren, die NULL sind (der Index wäre daher sehr kompakt). In diesem Fall müssten Sie Ihre Abfrage umschreiben:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Bearbeiten:
Da dies ein einmaliges Szenario ist, möchten Sie vielleicht den PARALLEL
verwenden Hinweis:
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:
--------------------------------------------------------------------------------