Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So optimieren Sie eine Aktualisierungs-SQL, die auf einer Oracle-Tabelle mit 700 Millionen Zeilen ausgeführt wird

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) , die 0 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:
--------------------------------------------------------------------------------