2016-01-19 9 views
1

У меня есть одно значение таблицы, которое содержит 80 миллионов записей. Другая таблица values_history, которая имеет 250 миллионов записей.Удаление очень больших записей таблицы, где id не в другой таблице

Я хочу отфильтровать таблицу values_history и хочу сохранить единственные данные, для которых id задан в таблице значений.

delete from values_history where id not in (select id from values); 

Этот запрос занимает такое долгое время, что я должен прервать процесс.

Пожалуйста, попробуйте некоторое ускорение процесса.

Могу ли я удалить записи в связке, как 1000000 за раз?

+0

Возможно, вам придется прибегнуть к выбору первого crore из value_history и удалить те записи, которые не указаны в значениях, затем следующий crore и т. д. Является ли values_history онлайн или офлайн? Если в автономном режиме вы можете скопировать те, которые присутствуют в значениях, и удалить старые и переименовать. Но это огромные таблицы, поэтому это может не работать в реальной жизни. Удачи. – kometen

+2

Вопросы производительности требуют большого количества информации, и вы не предоставили ее. https://wiki.postgresql.org/wiki/Slow_Query_Questions –

+0

Используйте 'EXISTS', а не' NOT IN'. Делайте работу партиями. Убедитесь, что существуют соответствующие индексы. Трудно сказать гораздо больше без соответствующей информации (версия PostgreSQL, планы запросов и т. Д. И т. Д.) –

ответ

0

Я извлек нужную запись и вставил ее в таблицу temp. Это заняло 2 часа после того, как я уронил таблицу, а затем снова вставил извлеченные данные обратно в основную таблицу. Весь процесс занял 4 часа вокруг, что отлично подходит для меня. упустили внешний ключ и все другие ограничения до этого.