sql >> Databáze >  >> RDS >> Oracle

Jak optimalizovat aktualizaci SQL, která běží na tabulce Oracle se 700 miliony řádků

Především je to jednorázový dotaz nebo je to opakující se dotaz? Pokud to musíte udělat pouze jednou, možná se budete chtít podívat na spuštění dotazu v paralelním režimu. Stejně budete muset skenovat všechny řádky, můžete si pracovní zátěž rozdělit sami pomocí rozsahů ROWID (udělej si sám paralelismus) nebo použít vestavěné funkce Oracle.

Za předpokladu, že jej chcete spouštět často a chcete tento dotaz optimalizovat, počet řádků s field sloupec jako NULL bude nakonec malý ve srovnání s celkovým počtem řádků. V takovém případě by index mohl věci urychlit. Oracle neindexuje řádky, které mají všechny indexované sloupce jako NULL, takže index na field nezneužije váš dotaz (protože chcete najít všechny řádky, kde field je NULL).

Buď:

  • vytvořte index na (FIELD, 0) , 0 bude fungovat jako pseudosloupec bez NULL a všechny řádky budou indexovány v tabulce.
  • vytvořit index založený na funkcích na (CASE WHEN field IS NULL THEN 1 END) , bude to indexovat pouze řádky, které jsou NULL (index by proto byl velmi kompaktní). V takovém případě byste museli svůj dotaz přepsat:

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

Upravit:

Protože se jedná o jednorázový scénář, možná budete chtít použít PARALLEL nápověda:

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. Vložení podřetězce do řetězce při určitém indexovém počítání od konce. Jak na to v mysql?

  2. K nahrazení cizích klíčů použijte spouštěče na zděděných tabulkách

  3. Analýza MySQL do polí JavaScript pomocí PHP a jQuery

  4. jak odstranit každý záznam kromě jednoho za hodinu