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

Другие вопросы по тегам