Как найти источник «Предиката без регистрации» - PullRequest
11 голосов
/ 12 октября 2011

Я получил смехотворно массивный запрос, сгенерированный веб-аналитикой бизнес-объектов к базе данных сервера SQL для бюджетной системы. Разработчик отчетов создал этот запрос в графическом интерфейсе и обнаружил, что он никогда не выполняется. Я позволил ему работать прошлой ночью, и он работал в течение 7 часов, прежде чем наши серверы перезагрузились для обновления Windows.

Я взглянул на план объяснения в sql и обнаружил несколько предупреждений на нескольких шагах «Вложенные циклы (внутреннее объединение)» - два из этих предупреждений переходят с третьего на последний шаг. Предупреждение «Нет предиката присоединения».

Другое замечание, которое я имею по этому поводу, заключается в том, что запрос содержит это в предложении where:

 BF_FUND.CD  IN  ('0105','0101')

Если вы поместите туда только один код фонда, он будет работать нормально - так что, добавив второй код, мы получим картезианское представление (возможно, это то, что произошло бы без предиката соединения).

Любые рекомендации о том, как отследить это? 790 строк замечательного SQL, чтобы пройти через ничего, кроме соединения после объединения.

Может ли план объяснения указывать на конкретную область?

Спасибо за вашу помощь.


редактирует:

Невозможно опубликовать запрос, вопрос безопасности, и его слишком много, чтобы запутать. И я бы не хотел, чтобы кто-то на это смотрел.

1 Ответ

4 голосов
/ 12 октября 2011

Используйте онлайн-форматировщик SQL, чтобы получить четкое представление о ваших SQL-соединениях; затем разбейте ваш запрос на блок для устранения проблемы.

http://www.dpriver.com/pp/sqlformat.htm

Тогда вы можете использовать графическое представление плана на сервере mssql; это все объяснит.

P.S .: если у вас плохо выполняющийся запрос из-за соединения с вложенными циклами без предикатов (й) соединения, это не тот случай, когда вы пропускаете критерии соединения в вашем запросе. Чек http://sqlserverselect.blogspot.com/2010/10/nested-loops-join-no-join-predicate.html

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