Хорошо ли ... Хорошо / Плохо / Хорошо ... использовать IF / While Условия в хранимых процедурах? - PullRequest
4 голосов
/ 25 января 2010

Моя основная проблема связана с SQL Server 2005 ... Я просмотрел множество веб-сайтов, и каждый рассказывает что-то свое.

Каковы сценарии, которые хорошо / хорошо использовать .. Например, больно даже устанавливать значения переменных внутри IF или только если я запускаю запрос.Предположим, что мои SP создают динамический SQL на основе нескольких условий во Входных параметрах, нужно ли переосмыслить запрос ... Как насчет SP, который выполняет другой запрос в зависимости от того, существует ли какая-либо запись в таблице.и т. д. и т. п. Мой вопрос не ограничивается этими сценариями ... Я ищу более обобщенный ответ , чтобы я мог улучшить свои будущие SP

По сути... Какие утверждения хорошо использовать в условиях ветвления / циклов, что плохо, а что нормально.

Ответы [ 3 ]

5 голосов
/ 25 января 2010

Как правило ... Избегайте процедурного кода в вашей базе данных и придерживайтесь запросов.Это дает Оптимизатору запросов возможность выполнять свою работу намного лучше.

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

1 голос
/ 25 января 2010

Очень сложно ответить на этот вопрос, если вы не предоставите код. Ни одна языковая конструкция сама по себе не является Хорошей / Плохой / Ладной, это то, чего вы хотите достичь и насколько хорошо это можно выразить с помощью этих конструкций.

0 голосов
/ 25 января 2010

Нет однозначного ответа, так как он действительно зависит от ситуации.

В общем, я думаю, что лучше всего сохранять логику внутри sproc как можно более простой и основанной на множествах. Например, слишком сложная задача с несколькими вложенными условиями IF может усложнить его для оптимизатора запросов, что означает, что он не может создать хороший план выполнения, подходящий для всех путей через sproc. Например, при первом запуске sproc он проходит путь A через логику, и план выполнения отражает это. В следующий раз, когда он запускается с другими параметрами, он проходит по пути B, но повторно использует исходный план выполнения, который не является оптимальным для этого второго пути. Одним из решений этой проблемы является разделение нагрузки на отдельные хранимые процедуры для вызова в зависимости от используемого пути - это позволяет оптимизировать этот подпроцесс и кэшировать план выполнения независимо.

Циклы могут быть единственным жизнеспособным вариантом, но в целом я бы старался их не использовать - всегда старайтесь делать вещи на основе множеств, если это возможно.

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