Оптимизировать SQL-запрос на postgresDB - PullRequest
0 голосов
/ 18 мая 2018

У меня около 700 таблиц в моей БД. Когда я запускаю приведенный ниже скрипт, это занимает почти 1 час.Как я могу оптимизировать этот запрос?

База данных: Postgres

DO $$
DECLARE
    tables_list CURSOR FOR
        select distinct t_name, t_schema from information_schema.columns 
 where column_name = 'deleted_flag' 
    and t_schema='customer' and t_name not like 'v_%';
BEGIN
    FOR t_record IN tables_list LOOP
        EXECUTE 'update ' || t_record.table_schema || '.' ||      t_record.table_name || ' set deleted_flag=false';
    END LOOP;
end;
$$;

В конце концов, все таблицы в этой схеме должны иметь это поле delete_flag как ложное.Мне приходится часто запускать этот скрипт в производственной среде.Благодарен, если кто-то может помочь, как оптимизировать этот скрипт.

Как вы думаете, если добавить проверку в предложении where,

EXECUTE 'update ' || t_record.table_schema || '.' ||      t_record.table_name || ' set deleted_flag=false where deleted_flag=true';

время выполнения будет меньше?

1 Ответ

0 голосов
/ 18 мая 2018

Невозможно сделать это действительно эффективным.

Вот несколько советов, которые вы можете сделать, чтобы сделать это быстрее:

  • Вы должны обязательно добавить WHERE deleted_flag к запросу, чтобы избежать ненужных обновлений.

  • Если есть только несколько строк, где deleted_flag = true, вы можете создать частичный индекс, подобный этому:

    CREATE INDEX ON atable ((1)) WHERE deleted_flag;
    
  • Если строк слишком много, чтобы сделать частичный индекс полезным, создайте таблицы с fillfactor = 50 и убедитесь, что на deleted_flag.

    нет индекса. Тогда вы сможете наслаждатьсяГОРЯЧЕЕ обновление, которое намного дешевле.

  • Установите max_wal_size достаточно высоко, чтобы у вас не было слишком много контрольных точек.

  • Получитьдостаточно оперативной памяти, чтобы вся база данных помещалась в памяти.

  • Получите быстрое хранилище.

Но я думаю, что ваш дизайн странный, иЛучшее решение - найти способ избежать этих регулярных обновлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...