PostgreSQL медленно работает на большой таблице с массивами и множеством обновлений - PullRequest
9 голосов
/ 23 июня 2010

У меня есть довольно большая таблица (20M записей), которая имеет 3 столбца индекса и столбца массива.Столбец массива обновляется ежедневно (путем добавления новых значений) для всех строк.Также есть вставки, но не столько, сколько обновлений.

Данные в массиве представляют ежедневные измерения, соответствующие трем ключам, что-то вроде этого: [[date_id_1, my_value_for_date_1], [date_id_2, my_value_for_date_2]].Он используется для построения графика этих дневных значений.Скажем, я хочу визуализировать значение ключа (a, b, c) с течением времени, я делаю SELECT values FROM t WHERE a = my_a AND b = my_b AND c = my_c.Затем я использую массив values для построения графика.

Производительность обновлений (которые происходят массово раз в день) со временем значительно ухудшилась.

Использование PostgreSQL 8.3.8.

Можете ли вы дать мне какие-нибудь подсказки, где искать решение?Это может быть что угодно, от настройки некоторых параметров в postgres до даже перемещения в другую базу данных (я думаю, что нереляционная база данных лучше подойдет для этой конкретной таблицы, но у меня нет особого опыта работы с ними). ​​

Ответы [ 4 ]

22 голосов
/ 23 июня 2010

Я бы посмотрел на FILLFACTOR для стола. По умолчанию он установлен на 100, вы можете снизить его до 70 (для начала). После этого вам нужно сделать VACUUM FULL, чтобы восстановить таблицу.

ALTER TABLE tablename SET (FILLFACTOR = 70);
VACUUM FULL tablename;
REINDEX TABLE tablename;

Это дает UPDATE возможность разместить обновленную копию строки на той же странице, что и оригинал, что более эффективно, чем размещение ее на другой странице. Или, если ваша база данных уже несколько фрагментирована из-за большого количества предыдущих обновлений, она может быть достаточно свободной. Теперь ваша база данных также имеет возможность делать ГОРЯЧИЕ обновления , при условии, что обновляемый столбец не участвует ни в одном индексе.

2 голосов
/ 23 июня 2010

Проблема в обновлениях. Измените схему с массива на несколько строк в день, и проблема производительности исчезнет.

Вы можете добавить свертки в массивы, позже, с каким-нибудь cronjob, но избегайте обновлений.

2 голосов
/ 23 июня 2010

Не уверен, подходят ли сюда массивы.

Почему бы не сохранить их в отдельной таблице (одно значение плюс ключи на строку) тогда ваше массовое обновление будет чистой вставкой.

1 голос
/ 23 июня 2010

Ну, с индексом из трех столбцов не о чем беспокоиться. Это не обязательно делает это намного медленнее. Но этот массив-столбец действительно может быть проблемой. Вы говорите, что добавляете значения к этому столбцу массива ежедневно. Добавляя, вы имеете в виду добавление значений ко всем 20 млн. записи в таблице? Или просто какие-то записи?

Ситуация мне не совсем понятна, но я бы предложил поискать способы избавления от этого столбца массива. Например, сделать его отдельной таблицей. Но это зависит от вашей ситуации и не может быть вариантом. Это может быть только я, но я всегда чувствую себя «грязным», когда в одной из моих таблиц есть такой столбец. И в большинстве случаев есть лучшее решение проблемы, которую вы пытаетесь решить с помощью этого массива-столбца. При этом, безусловно, существуют ситуации, в которых такой столбец является действительным, но на данный момент я не могу придумать ни одного. Конечно, не в таблице с 20 млн. количество записей.

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