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

Postgresql - Как да се ускори за актуализиране на огромна таблица (100 милиона реда)?

Тъй като обединявате две големи таблици и няма условия, които биха могли да филтрират редове, единствената ефективна стратегия за присъединяване ще бъде хеш присъединяване и никакъв индекс не може да помогне с това.

Първо ще има последователно сканиране на една от таблиците, от която се изгражда хеш структура, след това ще има последователно сканиране на другата таблица и хешът ще бъде изследван за всеки намерен ред. Как някой индекс може да помогне с това?

Може да очаквате такава операция да отнеме много време, но има някои начини, по които можете да ускорите операцията:

  • Премахнете всички индекси и ограничения на tx_input1 преди да започнеш. Вашето запитване е един от примерите, при които индексът изобщо не помага, а всъщност вреди производителност, тъй като индексите трябва да се актуализират заедно с таблицата. Създайте отново индексите и ограниченията, след като приключите с UPDATE . В зависимост от броя на индексите в таблицата, можете да очаквате прилична до масивна печалба в производителността.

  • Увеличете work_mem параметър за тази една операция с SET команда толкова високо, колкото можете. Колкото повече памет може да използва хеш операцията, толкова по-бърза ще бъде. С толкова голяма таблица вероятно пак ще имате временни файлове, но все пак можете да очаквате прилично увеличение на производителността.

  • Увеличете checkpoint_segments (или max_wal_size от версия 9.6 нататък) до висока стойност, така че да има по-малко контролни точки по време на UPDATE операция.

  • Уверете се, че статистическите данни на таблицата и за двете таблици са точни, така че PostgreSQL да може да направи добра оценка за броя на хеш-кофите за създаване.

След UPDATE , ако засяга голям брой редове, можете да обмислите да изпълните VACUUM (FULL) на tx_input1 за да се отървете от полученото подуване на масата. Това ще заключи масата за по-дълго време, така че го направете по време на прозорец за поддръжка. Това ще намали размера на таблицата и като следствие ще ускори последователните сканирания.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да напиша DataFrame в таблицата на postgres?

  2. Получете различни последователни периоди от време от припокриващи се интервали от време

  3. ГРЕШКА:размерът на масива надвишава максимално допустимия (1073741823)

  4. Проблем с npgsql в приложението c# - съществуваща връзка беше принудително затворена от отдалечения хост

  5. ValueError uподдържан формат на знака 'd' с psycopg2