Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да оптимизирате актуализиращ SQL, който работи на таблица на Oracle със 700 милиона реда

Първо еднократна заявка ли е или повтаряща се? Ако трябва да го направите само веднъж, може да искате да разгледате изпълнението на заявката в паралелен режим. Така или иначе ще трябва да сканирате всички редове, можете или сами да разделите работното натоварване с диапазони на ROWID (паралелизъм „направи си сам“) или да използвате вградените функции на Oracle.

Ако приемем, че искате да го изпълнявате често и искате да оптимизирате тази заявка, броят на редовете с field като NULL в крайна сметка ще бъде малък в сравнение с общия брой редове. В такъв случай един индекс може да ускори нещата. Oracle не индексира редове, които имат всички индексирани колони като NULL, така че индекс на field няма да се използва от вашата заявка (тъй като искате да намерите всички редове, където field е NULL).

Или:

  • създайте индекс на (FIELD, 0) , 0 ще действа като не-NULL псевдоколона и всички редове ще бъдат индексирани в таблицата.
  • създайте базиран на функция индекс на (CASE WHEN field IS NULL THEN 1 END) , това ще индексира само редовете, които са NULL (следователно индексът ще бъде много компактен). В такъв случай ще трябва да пренапишете заявката си:

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

Редактиране:

Тъй като това е еднократен сценарий, може да искате да използвате PARALLEL намек:

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 Express Edition за SQL практика

  2. Посоченото предаване не е валидно при попълване на DataTable от OracleDataAdapter.Fill()

  3. Въведената стойност на съобщението за грешка на Oracle не е достатъчно дълга

  4. JDBC драйвер за Oracle 10G XE

  5. Пренаписването на заявката е неуспешно, ако MV използва ASNI Join