sql >> Databasteknik >  >> RDS >> Oracle

Hur man optimerar en SQL-uppdatering som körs på en Oracle-tabell med 700 miljoner rader

För det första är det en engångsfråga eller är det en återkommande fråga? Om du bara behöver göra det en gång kanske du vill titta på att köra frågan i parallellt läge. Du måste skanna alla rader ändå, du kan antingen dela upp arbetsbelastningen själv med ROWID-intervall (gör-det-själv-parallellism) eller använda Oracles inbyggda funktioner.

Förutsatt att du vill köra den ofta och vill optimera den här frågan, antalet rader med field kolumnen som NULL kommer så småningom att bli liten jämfört med det totala antalet rader. I så fall kan ett index påskynda saker och ting. Oracle indexerar inte rader som har alla indexerade kolumner som NULL så ett index på field kommer inte att användas av din fråga (eftersom du vill hitta alla rader där field är NULL).

Antingen:

  • skapa ett index på (FIELD, 0) , 0 kommer att fungera som en icke-NULL-pseudokolumn och alla rader kommer att indexeras i tabellen.
  • skapa ett funktionsbaserat index på (CASE WHEN field IS NULL THEN 1 END) , kommer detta bara att indexera de rader som är NULL (indexet skulle därför vara mycket kompakt). I så fall måste du skriva om din fråga:

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

Redigera:

Eftersom detta är ett engångsscenario kanske du vill använda PARALLEL tips:

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. Hur ställer jag in applikationsnamn i en Postgresql JDBC-url?

  2. Hur man subtraherar 30 dagar från ett datum i T-SQL

  3. Infoga datumformat i dd/mm/åååå till laravel Eloquent Model

  4. Kö i OneWay WCF-meddelanden med Windows Service och SQL Server