Почему PostgreSQL Performation Performance падает со временем, но восстановлена ​​при восстановлении индекса

StackOverflow https://stackoverflow.com/questions/2392982

Вопрос

Согласно этому страница В руководстве, indexes don't need to be maintained. Отказ Однако мы бегаем с таблицей PostgreSQL, которая имеет непрерывную скорость updates, deletes а также inserts что со временем (несколько дней) видит значительное деградацию запросов. Если мы удаляем и воссоздаем индекс, производительность запроса восстанавливается.

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

Мы searching based of an index, not the primary key (Я подтвердил, что индекс используется, по меньшей мере, в нормальных условиях)

Таблица используется в качестве постоянного магазина для одного процесса. Используя PostgreSQL в Windows с Java-клиентом.

Я готов сдаться insert and update performance Чтобы сохранить производительность запроса.

Мы рассматриваем rarchitectecting приложение, чтобы данные распространялись в различных динамических таблицах таким образом, что позволяет периодически выпадать и перестраивать индекс, не влияя на приложение. Однако, как всегда, есть временный хруст, чтобы получить это на работу, и я подозреваю, что мы упустим что-то базовое в нашей конфигурации или использовании.

Мы рассмотрели forcing vacuuming а также rebuild to run at certain times, но я подозреваю locking period for such an action would cause our query to block. Отказ Это может быть вариант, но есть некоторые в режиме реального времени (окна 3-5 секунд), которые требуют других изменений в нашем коде.

Дополнительная информация:Стол и индекс

CREATE TABLE icl_contacts
(
  id bigint NOT NULL,
  campaignfqname character varying(255) NOT NULL,
  currentstate character(16) NOT NULL,
  xmlscheduledtime character(23) NOT NULL,
...
25 or so other fields.  Most of them fixed or varying character fiel  
...
  CONSTRAINT icl_contacts_pkey PRIMARY KEY (id)
)
WITH (OIDS=FALSE);
ALTER TABLE icl_contacts OWNER TO postgres;

CREATE INDEX icl_contacts_idx
  ON icl_contacts
  USING btree
  (xmlscheduledtime, currentstate, campaignfqname);

Анализировать:

Limit  (cost=0.00..3792.10 rows=750 width=32) (actual time=48.922..59.601 rows=750 loops=1)
  ->  Index Scan using icl_contacts_idx on icl_contacts  (cost=0.00..934580.47 rows=184841 width=32) (actual time=48.909..55.961 rows=750 loops=1)
        Index Cond: ((xmlscheduledtime < '2010-05-20T13:00:00.000'::bpchar) AND (currentstate = 'SCHEDULED'::bpchar) AND ((campaignfqname)::text = '.main.ee45692a-6113-43cb-9257-7b6bf65f0c3e'::text))

И да, я знаю, что есть разнообразные вещи we could do to normalize and improve the design of this table. Отказ Некоторые из этих вариантов могут быть доступны для нас.

Мой фокус в этом вопросе о понимании how PostgresQL is managing the index and query over time (understand why, not just fix). Отказ Если бы это было сделано чрезмерно или существенно изменить, было бы много изменений.

Это было полезно?

Решение

Авто вакуум должен сделать трюк, при условии, что вы настроили его для желаемой производительности.

Примечания: вакуумные полноценные: это восстановит статистику таблиц и восстановление нагрузок дискового пространства. Он заблокирует весь стол.

Вакуум: Это восстановит статистику стола и вернет некоторое дисковое пространство. Он может быть запущен параллельно с производственной системой, но генерирует множество IO, которые могут повлиять на производительность.

Анализировать: Это восстановит статистику планировщика запросов. Это вызвано вакуумом, но может быть запущена самостоятельно.

Более Подробные заметки, найденные здесь

Другие советы

Что касается производительности, использование строк для хранения времени и информации о состоянии - довольно узкое место. Прежде всего, индексы на текстах чрезвычайно неэффективны, сравнение два раза в тот же день нуждается не менее 11 сравнений (в использованном вами формате), однако, использование типа времени может быть уменьшено до простого сравнения. Это также влияет на размер индекса, а большой индекс трудно искать, и БД не будет держать его в памяти. Такие же соображения относятся к государственному столбцу. Если он представляет собой небольшой набор состояний, вы должны использовать целочисленные числа, сопоставленные с состояниями, это уменьшит узлы индекса - и размер индекса соответственно. Кроме того, этот индекс будет бесполезным даже использовать встроенные типы Teeses, если вы не укажете фактическое время в вашем запросе.

Это пахнет как индекс, раздутый со мной. Я ссылку на эту страницу

http://www.postgresql.org/docs/8.3/static/routine-reindex.html.

который говорит внизу:

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

Кажется, что, кажется, конфликтуют со страницей, которую вы ссылаетесь, сказав, что индексы «не требуют обслуживания или настройки».

Вы пытались «Создать индекс одновременно»?

Это значение «2010-05-20T13: 00: 00 000 000 000 000», что XMLSCheduledTime сравнивается с частью SQL или поставляется в качестве параметра?

При планировании того, как запустить запрос, заявив, что поле должно быть меньше, чем прилагаемый параметр, пока неизвестное значение не дает PostgreSQL. Это не знает, будет ли это совпадать почти все строки или вряд ли никаких рядов.

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

Вы можете стать лучше выбирать производительность, изменив порядок полей в этом сложном индексе или создавая новый индекс, причем по полям полей (Campaignfqname, currentState, XMLSCHEDULEDTEMETTIME) с тех пор индекс займет вас прямо к названию Campaign FQ и текущее состояние Что вас интересует, и индексное сканирование в диапазоне XMLSCHEDULEDTE все будет строки, вы после.

Это дело учебника. Вы должны настроить автовакуум, чтобы быть намного более агрессивным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top