ефективно изрязване на таблици postgresql

Имам около 10 таблици с над 2 милиона записа и една с 30 милиона. Бих искал ефективно да премахна по-стари данни от всяка от тези таблици.

Моят общ алгоритъм е:

  • създайте временна таблица за всяка голяма таблица и я попълнете с по-нови данни
  • съкратете оригиналните таблици
  • копирайте tmp данни обратно в оригинални таблици, като използвате: "вмъкване в оригинална таблица (изберете * от tmp_table)"

Последната стъпка от копирането на данните обаче отнема повече време, отколкото бих искал. Мислех да изтрия оригиналните таблици и да направя временните таблици "постоянни", но губя информация за ограничение/чужд ключ.

Ако изтрия директно от таблиците, отнема много повече време. Като се има предвид, че трябва да запазя всички външни ключове и ограничения, има ли по-бързи начини за премахване на по-старите данни?

Благодаря.


person agilefall    schedule 19.04.2010    source източник


Отговори (2)


Най-бързият процес вероятно ще бъде точно както сте очертали:

  1. Копирайте нови данни във временна таблица
  2. Премахване на индекси и външни ключове
  3. Пуснете старата маса
  4. Копирайте временната таблица обратно към старото име на таблица
  5. Възстановете индексите и външните ключове.

Ръководството на Postgres също има някои предложения относно производителността, които може или може да не се прилага. Честно казано обаче, значително по-бързо е да премахнете таблица, отколкото да премахнете милиони редове (тъй като всяко изтриване се извършва кортеж по кортеж) и е значително по-бързо да вмъкнете милиони редове в таблица без ограничения или индекси (като всяко ограничение трябва да се провери и всеки индекс трябва да се актуализира за всяко вмъкване на запис; като премахнете всички ограничения, вие ограничавате това до едно изграждане на индекса и една проверка за ограничението).

person ig0774    schedule 20.04.2010

„Стандартното“ решение за тези проблеми обикновено включва разделяне на вашите таблици на съответния ключ, така че когато трябва да изтриете стари данни, можете просто да изтриете цял дял – със сигурност най-бързото изтриване, което някога ще получите.

Въпреки това, разделянето в PostgreSQL не е толкова лесно, колкото някои други бази данни - трябва да преместите данните ръчно с помощта на тригери и има предупреждения (напр. без глобални първични ключове)

Вижте ръководството на PostgreSQL за разделяне

person intgr    schedule 21.04.2010