Каковы подводные камни установки enable_nestloop в положение OFF

В моем приложении есть запрос, который выполняется очень быстро при большом количестве строк в моих таблицах. Но когда количество строк среднего размера (ни большого, ни маленького), тот же запрос выполняется в 15 раз медленнее.

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

Я могу отговорить планировщик запросов от использования вложенных циклов либо на уровне базы данных (postgresql.conf), либо на уровне сеанса ( SET enable_nestloop TO off ).

Какие есть потенциальные подводные камни set enable_nestloop to off?

Дополнительная информация: PostgreSQL 8.2.6, работающий в Windows.

Ответов (3)

Решение

Каковы потенциальные ловушки установки enable_nestloopв off?

Это означает, что вы никогда не сможете эффективно использовать индексы.

И похоже, что вы ими сейчас не пользуетесь.

Такой запрос:

SELECT u.name, p.name
FROM users u
JOIN profiles p ON p.id = u.profile_id
WHERE u.id = :id

скорее всего , использовать NESTED LOOPS с INDEX SCAN на user.id и INDEX SCAN на profile.id, при условии , что вы построили индексы на этих полях.

Запросы с фильтрами с низкой избирательностью (то есть запросы, которым требуется больше 10% данных, чем данные из таблиц, которые они используют), выиграют от MERGE JOINS и HASH JOINS .

Но запросы, подобные приведенному выше, должны NESTED LOOPS выполняться эффективно.

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

Перед принятием таких решительных мер следует учесть несколько моментов:

  • обновите вашу установку до последней версии 8.2.x (которая сейчас - 8.2.12). Еще лучше - рассмотрите возможность обновления до следующей стабильной версии - 8.3 (8.3.6).

  • подумайте о смене производственной платформы на другую, отличную от Windows. Порт PostgreSQL для Windows, хотя и очень полезен для целей разработки, все же не соответствует требованиям Un * x.

  • прочтите первый абзац « Конфигурация метода планировщика ». Эта вики-страница, вероятно, тоже поможет.

У меня точно такой же опыт. Некоторые запросы к большой базе данных выполнялись с использованием вложенных циклов и занимали 12 часов !!! когда он выполняется за 30 секунд при отключении вложенных циклов или удалении индексов.

Было бы неплохо иметь подсказки, но я попробовал

...
SET ENABLE_NESTLOOP TO FALSE;
... critical query
SET ENABLE_NESTLOOP TO TRUE;
...

разобраться с этим вопросом. Так что однозначно можно отключить и снова включить использование вложенного цикла, и с 9000-кратным увеличением скорости не поспоришь :)

Одна из моих проблем - изменить ENABLE_NESTLOOP в процедуре PgSQL / PL. Я могу запустить SQL-скрипт в Aqua Data Studio, делая все правильно, но когда я помещаю его в процедуру PgSQL / PL, это все равно занимает 12 часов. Очевидно, это изменение игнорировало.