Каковы подводные камни настройки 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. Windows-порт PostgreSQL, хотя и очень полезен для целей разработки, все еще не соответствует 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 часов. Видимо, это было игнорирование изменений.