Тимчасові таблиці PostgreSQL


77

Мені потрібно виконати запит 2,5 мільйона разів. Цей запит генерує кілька рядків, які мені потрібні, AVG(column)а потім використовує це AVGдля фільтрації таблиці з усіх значень нижче середнього. Потім мені потрібно INSERTці відфільтровані результати подати у таблицю.

Здається, єдиний спосіб зробити це з розумною ефективністю - це створити TEMPORARY TABLEдля кожного запиту-postmaster python-thread. Я просто сподіваюся, що ці TEMPORARY TABLEs не зберігатимуться на жорсткому диску (взагалі) і залишатимуться в пам'яті (RAM), якщо, звичайно, у них не залишиться робочої пам'яті.

Я хотів би знати, чи буде НА ТИМЧАСНІЙ ТАБЛИЦІ виникати запис на диск (що заважатиме ВСТАВКАМ, тобто сповільнюватиме весь процес)


5
І яке саме ваше питання тут?
Тім

Лол, вибач. Я хочу знати, чи тимчасова таблиця спричинить запис на диск (що заважатиме ВСТАВКАМ, тобто сповільнюватиме весь процес). Дякую!
Ніколас Леонард

Добре, я просто прочитав це. Здається, ТАБЛИЧНА ТАБЛИЦЯ справді спричиняє деякі накладні витрати на запис на диск ... І все ж мені все ще цікаво, чи зберігається на диску копія цілої таблиці, чи це не метадані, які зберігаються?
Ніколас Леонард

Відповіді:


118

Зверніть увагу, що в Postgres за замовчуванням поведінка тимчасових таблиць полягає в тому, що вони не скидаються автоматично, а дані зберігаються при фіксації. Див ON COMMIT.

Однак тимчасова таблиця випадає в кінці сеансу бази даних :

Тимчасові таблиці автоматично скидаються в кінці сеансу або, за бажанням, в кінці поточної транзакції.

Є декілька міркувань, які ви повинні взяти до уваги:

  • Якщо ви хочете явно DROPвказати тимчасову таблицю в кінці транзакції, створіть її із CREATE TEMPORARY TABLE ... ON COMMIT DROPсинтаксисом.
  • За наявності пулу з'єднань сеанс бази даних може охоплювати кілька сесій клієнта; щоб уникнути зіткнень CREATE, вам слід скинути тимчасові таблиці - або до повернення підключення до пулу (наприклад, виконуючи все всередині транзакції та використовуючи ON COMMIT DROPсинтаксис створення), або за необхідності (попередньо будь-якому CREATE TEMPORARY TABLEоператору з відповідний DROP TABLE IF EXISTS, який має перевагу також працювати поза транзакціями, наприклад, якщо з'єднання використовується в режимі автоматичної фіксації.)
  • Поки тимчасова таблиця використовується, скільки вона поміститься в пам’яті перед переповненням на диск? Див. temp_buffersОпцію вpostgresql.conf
  • Щось ще, про що мені слід турбуватися, часто працюючи з тимчасовими таблицями? Рекомендується пилосос після того, як ви викинули тимчасові столи, щоб очистити всі мертві кортежі з каталогу. Postgres автоматично буде пилососити кожні 3 хвилини для вас, використовуючи налаштування за замовчуванням ( auto_vacuum).

Крім того , не пов'язані з вашим питанням (але , можливо , пов'язані з вашим проектом): Майте на увазі , що, якщо у вас є для виконання запитів тимчасову таблицю , після того, як ви заселили її, то це хороша ідея , щоб створити відповідні показники і випустити ANALYZEна тимчасова таблиця, про яку йде мова після того, як ви закінчите вставляти в неї. За замовчуванням оптимізатор, що базується на витратах, вважатиме, що новостворена тимчасова таблиця має ~ 1000 рядків, і це може призвести до поганої продуктивності, якщо тимчасова таблиця насправді містить мільйони рядків.


Хороший матеріал. Дякую. Я насправді використовував лише тимчасову таблицю, оскільки мені потрібно було виконати на ній два різні SELECT (тому Analyze не варто, я думаю). Я забезпечив операції великою кількістю temp_buffers, але оскільки таблиці TEMP створювались і скидались багатьма потоками python, ...
Ніколас Леонард

postgres з'їдав все більше і більше оперативної пам'яті, оскільки сценарій робив свою роботу. Я виявив, що обмеження кількості потоків python (запущених на клієнтському комп'ютері) трохи більше, ніж кількість процесорних ядер, дало найкращі (найефективніші та ефективніші) терміни виконання. Знову для вас мудрість Влад.
Ніколас Леонард

1
Навіть якщо ви лише двічі ВИБЕРИТЕ в тимчасовій таблиці, вкладаючи кілька мілісекунд у створення індексу + АНАЛІЗ при кожному створенні тимчасової таблиці, ви зможете заощадити тонни, коли / при приєднанні інших таблиць до тимчасової таблиці - помістіть запити вручну в PgAdminIII та скористайтеся функцією "Запит / Поясни (F7)".
vladr

Справді? Гаразд, мабуть, мені потрібно було, щоб хтось сказав мені спробувати, оскільки це здається зустрічним інтуїтивним (витрати на налаштування, здається, не варті цього). У будь-якому випадку, я дякую вам, і я спробую проаналізувати АНАЛІЗ наступного разу. Я вже бачу цінність ТЕМПОВИХ ІНДЕКСІВ. Тим не менше, мені цікаво, чи насправді АНАЛІЗ ...
Ніколас Леонард

1
Накладні витрати на АНАЛІЗ складають у середньому 100 мс, і ви можете налаштувати їх на таблицю / стовпець. Вам абсолютно потрібен АНАЛІЗ, щоб оптимізатор не робив жодних дурних припущень, припускаючи, що таблиця з мільйонними рядками містить лише 100 рядків і сканує таблицю 10 разів ... :)
vladr

19

Тимчасові таблиці дають лише одну гарантію - вони видаляються в кінці сеансу. Для невеликої таблиці ви, ймовірно, будете мати більшість своїх даних у резервному сховищі. Для великої таблиці я гарантую, що дані будуть періодично видалятися на диск, оскільки механізм бази даних потребує більше робочого місця для інших запитів.

РЕДАГУВАТИ: Якщо вам конче потрібні тимчасові таблиці лише для оперативної пам'яті, ви можете створити табличний простір для вашої бази даних на диску оперативної пам'яті (/ dev / shm працює). Це зменшує кількість вводу-виводу на диск, але пам’ятайте, що наразі це неможливо зробити без фізичного запису на диск; при створенні тимчасової таблиці механізм БД переведе список таблиць до стабільного сховища.


1
тимчасові таблиці також не реєструються в WAL rhaas.blogspot.com/2010/05/…
shusson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.