Каковы подводные камни установки enable_nestloop в положение OFF
В моем приложении есть запрос, который выполняется очень быстро при большом количестве строк в моих таблицах. Но когда количество строк среднего размера (ни большого, ни маленького), тот же запрос выполняется в 15 раз медленнее.
План объяснения показывает, что запрос к набору данных среднего размера использует вложенные циклы для своего алгоритма соединения. Большой набор данных использует хешированные соединения .
Я могу отговорить планировщик запросов от использования вложенных циклов либо на уровне базы данных (postgresql.conf), либо на уровне сеанса ( SET enable_nestloop TO off
).
Какие есть потенциальные подводные камни set enable_nestloop to off
?
Дополнительная информация: PostgreSQL 8.2.6, работающий в Windows.
Ответов (3)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 часов. Очевидно, это изменение игнорировало.