При оптимизации запросов к базе данных PostgreSQL в среде 1С разработчики часто сталкиваются с вопросом интерпретации планов выполнения запросов. Одной из распространенных «загадок» является ситуация, когда при наличии подходящего индекса (например, по полям Родитель и ЭтоГруппа) планировщик выбирает метод Index Scan вместо ожидаемого Index Seek. Давайте разберемся, почему это происходит и всегда ли это является признаком неэффективности.
Для начала важно прояснить терминологию. Хотя в профессиональной среде часто используются термины Index Seek и Index Scan, в PostgreSQL документации мы чаще встречаем понятия Index Scan и Index Only Scan.
Таким образом, использование Index Scan — это не ошибка, а штатный процесс извлечения данных, когда индекс используется как «указатель» на нужные записи в таблице.
Разберем основные причины, по которым PostgreSQL может предпочесть Index Scan:
Sequential Scan).WHERE указано первое поле индекса. Если вы фильтруете только по последующим полям (например, по ПометкеНаУдаление без указания Родителя), индекс теряет свою эффективность, так как B-дерево не может однозначно определить область поиска. В таких случаях Index Scan по всей структуре индекса неизбежен.Часто возникает вопрос: «Почему индекс срабатывает, даже если я добавил дополнительные условия, которых нет в структуре индекса?». Важно помнить, что наличие условия в WHERE не отменяет индекс, а служит фильтром.
Рассмотрим, как это происходит на практике:
Допустим, у нас есть индекс по полям: Родитель + ЭтоГруппа. Если мы добавляем в запрос ПометкаНаУдаление, планировщик выполняет следующие шаги:
Родителю и ЭтоГруппе.ПометкаНаУдаление.В этом случае индекс «работает» в качестве инструмента первичного отсечения данных. Это значительно эффективнее, чем просмотр всей таблицы, даже если в плане выполнения отображается Index Scan.
Если вы хотите перевести выполнение запроса в более быстрый режим, обратите внимание на следующие методы оптимизации:
INCLUDE) дополнительные поля. Это позволит планировщику выполнить Index Only Scan.ANALYZE). Планировщик принимает решения на основе оценки количества строк, и устаревшие данные могут приводить к выбору неоптимальных планов.В работе с 1С и PostgreSQL не стоит пугаться Index Scan. Это естественная работа оптимизатора. Важно анализировать, насколько сужается выборка при использовании индекса. Если индекс отсекает 99% данных, он работает отлично, даже если база данных совершает дополнительные обращения к таблице. Оптимизируйте запросы, исходя из реальной стоимости операций, а не только из названий методов сканирования в плане выполнения.