sql >> Database >  >> RDS >> Oracle

Een update-SQL optimaliseren die draait op een Oracle-tabel met 700 miljoen rijen

Is het in de eerste plaats een eenmalige vraag of is het een terugkerende vraag? Als u het maar één keer hoeft te doen, kunt u overwegen de query in parallelle modus uit te voeren. U zult toch alle rijen moeten scannen, u kunt de werklast zelf verdelen met ROWID-reeksen (doe-het-zelf-parallellisme) of de ingebouwde functies van Oracle gebruiken.

Ervan uitgaande dat u het regelmatig wilt uitvoeren en deze zoekopdracht wilt optimaliseren, is het aantal rijen met het field kolom als NULL uiteindelijk klein zal zijn in vergelijking met het totale aantal rijen. In dat geval zou een index de zaken kunnen versnellen. Oracle indexeert geen rijen die alle geïndexeerde kolommen als NULL hebben, dus een index op field wordt niet gebruikt door uw zoekopdracht (omdat u alle rijen wilt vinden waar field is NULL).

Ofwel:

  • maak een index op (FIELD, 0) , de 0 zal fungeren als een niet-NULL-pseudokolom en alle rijen worden op de tabel geïndexeerd.
  • maak een functie-gebaseerde index op (CASE WHEN field IS NULL THEN 1 END) , dit zal alleen de rijen indexeren die NULL's zijn (de index zou daarom erg compact zijn). In dat geval zou u uw vraag moeten herschrijven:

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

Bewerken:

Aangezien dit een eenmalig scenario is, wilt u misschien de PARALLEL . gebruiken hint:

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. MYSQLi-fout:gebruiker heeft al meer dan 'max_user_connections' actieve verbindingen

  2. Hoe het type query-instructie in PDO te krijgen?

  3. uniek toevoegen aan bestaande externe sleutel

  4. Android externe database verbindingsproblemen