sql >> Database teknologi >  >> RDS >> Oracle

Sådan optimerer du en SQL-opdatering, der kører på en Oracle-tabel med 700 millioner rækker

Først og fremmest er det en engangsforespørgsel eller er det en tilbagevendende forespørgsel? Hvis du kun skal gøre det én gang, vil du måske overveje at køre forespørgslen i parallel tilstand. Du bliver alligevel nødt til at scanne alle rækker, du kan enten selv opdele arbejdsbyrden med rækker af ROWID (gør-det-selv parallelitet) eller bruge Oracles indbyggede funktioner.

Forudsat at du vil køre det ofte og ønsker at optimere denne forespørgsel, er antallet af rækker med field kolonne som NULL vil i sidste ende være lille sammenlignet med det samlede antal rækker. I så fald kunne et indeks fremskynde tingene. Oracle indekserer ikke rækker, der har alle indekserede kolonner som NULL, så et indeks på field vil ikke blive brugt af din forespørgsel (da du vil finde alle rækker, hvor field er NULL).

Enten:

  • opret et indeks på (FIELD, 0) , 0 vil fungere som en ikke-NULL pseudokolonne, og alle rækker vil blive indekseret i tabellen.
  • opret et funktionsbaseret indeks på (CASE WHEN field IS NULL THEN 1 END) , vil dette kun indeksere de rækker, der er NULL'er (indekset ville derfor være meget kompakt). I så fald skal du omskrive din forespørgsel:

    UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1

Rediger:

Da dette er et engangsscenarie, vil du måske bruge PARALLEL tip:

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:
--------------------------------------------------------------------------------


  1. Laravel-tidsstempel bliver opdateret uden eksplicit opfordring til at gøre det

  2. hvordan man kontrollerer, at wordpress brugerdefineret tabel er tom eller ej

  3. 3 måder at "løsne" en streng i MySQL

  4. Spørg efter skemadetaljerne for en tabel i PostgreSQL?