Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zoptymalizować aktualizację SQL, która działa na tabeli Oracle z 700 mln wierszy?

Przede wszystkim jest to zapytanie jednorazowe, czy jest to zapytanie cykliczne? Jeśli musisz to zrobić tylko raz, możesz rozważyć uruchomienie zapytania w trybie równoległym. I tak będziesz musiał przeskanować wszystkie wiersze, możesz albo samodzielnie podzielić obciążenie za pomocą zakresów ROWID (równoległości typu „zrób to sam”), albo użyć wbudowanych funkcji Oracle.

Zakładając, że chcesz go często uruchamiać i chcesz zoptymalizować to zapytanie, liczba wierszy z field kolumna jako NULL będzie ostatecznie mała w porównaniu z całkowitą liczbą wierszy. W takim przypadku indeks może przyspieszyć działanie. Oracle nie indeksuje wierszy, w których wszystkie indeksowane kolumny mają wartość NULL, więc indeks field nie zostanie wykorzystany przez Twoje zapytanie (ponieważ chcesz znaleźć wszystkie wiersze, w których field jest NULL).

Albo:

  • utwórz indeks na (FIELD, 0) , 0 będzie działać jako pseudokolumna różna od NULL, a wszystkie wiersze w tabeli zostaną zindeksowane.
  • utwórz indeks oparty na funkcji na (CASE WHEN field IS NULL THEN 1 END) , spowoduje to indeksowanie tylko wierszy, które są wartościami NULL (indeks byłby zatem bardzo zwarty). W takim przypadku konieczne byłoby przepisanie zapytania:

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

Edytuj:

Ponieważ jest to jednorazowy scenariusz, możesz użyć PARALLEL wskazówka:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Instant Client dla urządzenia Debiana opartego na architekturze ARM

  2. SQL Developer nie wyświetla XML

  3. Wiele baz danych z nieznacznie zmieniającymi się modelami. Jak zezwolić Entity Framework na usuwanie kolumn w czasie wykonywania?

  4. Oracle pobierz wiersz, w którym zmieniła się wartość kolumny

  5. ORA-01264:Nie można utworzyć nazwy pliku dziennika