Вопрос по indexing, postgresql, partitioning – Как я могу использовать индекс для секционированной таблицы в postgresql 8.3.7

4

У меня есть ситуация, когда выполнение запроса, который фильтрует по индексируемому столбцу в многораздельной таблице, выполняет полное сканирование таблицы.

По-видимому, это известная проблема в postgresql, и она подробно объяснена.Вот.

Есть ли более элегантный способ обойти это, кроме выполнения запроса для каждого раздела и последующего выполнения UNION для всех результатов?

Пожалуйста, также спросите в списке рассылки производительности Postgres здесьarchives.postgresql.org/pgsql-performance. Milen A. Radev
Эта статья, на которую вы ссылаетесь, является неточной, потому что автор не слишком знаком с разделением. Он не включал constraint_exclusion или индексы для каждого раздела. Jin Kim
Я не понимаю, почему индексы должны быть исключены только потому, что запрос пересекает границы раздела. В моем случае я обнаружил эту проблему, когда пытался найти очень маленький набор различных значений для столбца, который имеет индекс в каждом разделе. Выберите отдельный столбец на разделе использует сканирование индекса. То же самое в родительской таблице выполняет полное сканирование таблицы каждого раздела, затем объединяет, затем сортирует. & quot; выбрать отдельный столбец из (выберите объединение выберите объединение выберите ...) & quot; ПУТЬ быстрее, чем «выбрать отдельный столбец из родительского» Кто-нибудь может понять, почему планировщик не делает очевидного? ideasculptor

Ваш Ответ

1   ответ
10

делов в PostgreSQL. Но вы должны все настроить правильно, чтобы он работал, и легко пропустить шаг в длинном списке вещей, документированных наhttp://www.postgresql.org/docs/current/static/ddl-partitioning.html

Главное, чтобы понять, что для того, чтобы избежать последовательного сканирования, вы должны предоставить достаточно информации для PostgreSQL, чтобы он мог доказать, что некоторые разделы не могут иметь данные, которые вы ищете; затем они пропускаются как потенциальные источники результатов запроса. В статье, на которую вы ссылаетесь, указано, что это решение проблемы сканирования seq: & quot; Если вы добавляете ограничения диапазона в поле даты каждого раздела, этот запрос может быть оптимизирован в цикл, в котором вы запрашиваете & # x201C; latest & # x201D; сначала делайте разделы и работайте в обратном направлении, пока не найдете единственное значение, которое превышает диапазон всех остальных разделов. & quot; - но не показывает улучшенный план, который вы увидите после этого изменения.

Некоторые распространенные ошибки, которые вы могли совершить:

- Параметр constraint_exclusion в файле postgresql.conf по умолчанию отключен. При этом значении по умолчанию вы не получите того, что ожидаете.

-Не создавайте неперекрывающиеся разделы, используя CHECK, который не дает планировщику узнать, что находится внутри каждого из них. Можно пропустить этот шаг, но все же правильно передать ваши данные в нужные разделы, планировщик просто не будет этого знать.

-Не ставил индекс на каждый раздел, только создал на главной таблице. Это даст вам последовательное сканирование только на соответствующем разделе, поэтому не так плохо, как выше, но и не хорошо.

Есть некоторая работа, чтобы упростить это в будущих выпусках PostgreSQL (установка constraint_partition довольно автоматична в 8.4, и в настоящее время проводится некоторая автоматизация настройки разделов). Прямо сейчас, если вы будете тщательно следовать инструкциям и избегать всех этих проблем, это должно сработать.

Похожие вопросы