Каковы подводные камни настройки enable_nestloop в OFF - PullRequest
10 голосов
/ 27 февраля 2009

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

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

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

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

Другая информация: PostgreSQL 8.2.6, работает в Windows.

Ответы [ 3 ]

8 голосов
/ 27 февраля 2009

Каковы потенциальные ловушки установки 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 для эффективной работы.

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

4 голосов
/ 27 февраля 2009

Несколько вещей, которые следует учитывать, прежде чем принимать такие решительные меры:

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

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

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

2 голосов
/ 31 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...