Что делает SqlCommand.Prepare() и когда он должен использоваться?

Возможный дубликат:
Плюсы и минусы использования SqlCommand Подготовка на С#?

Это то, что MSDN говорит о SqlCommand.Prepare():

Создает подготовленную версию команды на экземпляре SQL Server.

Может ли кто-нибудь дать более глубокое представление о том, что это значит и когда оно должно использоваться?

Ответ 1

Метод Prepare на самом деле находится на DbCommand, который все классы, полученные из него, поднимут.

То, что он делает, специфично для поставщика баз данных, для которого используется DbCommand. Тем не менее, можно с уверенностью сказать (хотя и не абсолютное правило), что в большинстве случаев, если команда является хранимой процедурой, она не создаст op (она задокументирована как таковая для переопределить Prepare на SqlCommand), поскольку хранимые процедуры обычно оптимизируют планы запросов из-за предыдущих вызовов, явных вызовов для оптимизации или создания (опять же, в зависимости от базовой базы данных).

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

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

Следует отметить, что SQL Server (начиная с 2005 года, IIRC) кэширует параметризованные планы запросов в зависимости от использования после первого выполнения (я думаю, что кэш - это тайник с пониженным временем, который сбрасывается или скорость замедления замедляется при последующих использует), поэтому, если вы собираетесь совершать несколько вызовов с тем же параметризованным запросом, вы можете не сильно выиграть при вызове Prepare, за исключением того, что перемещение предварительной подготовки запроса вперед (что может быть полезно также, в зависимости от какую работу вы должны выполнять).

Ответ 2

Более подробную информацию можно найти здесь.

Однако помните:

В SQL Server подготовка/выполнение модель не имеет существенной производительности преимущество перед прямым исполнением, из-за того, как SQL Server повторно использует планы выполнения. SQL Server имеет эффективные алгоритмы для сопоставления текущие операторы SQL с выполнением планы, созданные для выполнение одного и того же оператора SQL. Если приложение выполняет SQL с параметрическими маркерами несколько раз SQL Server будет повторно использовать план выполнения с первого исполнение для второго и последующие казни (если только план возраста из кеша процедуры). у модели "подготовить/выполнить" все еще есть эти Преимущества:

Поиск плана выполнения с помощью определение дескриптора более эффективно чем алгоритмы, используемые для соответствия Оператор SQL для существующего выполнения планы.

Приложение может контролировать, когда план выполнения создается, и когда он повторно используется.

Модель ready/execute переносима к другим базам данных, включая ранее версии SQL Server.

Ответ 3

Обычно, когда вы выполняете запрос, он полностью перебирает синтаксический анализ строки для выполнения плана выполнения. Вызывая Prepare, он будет выполнять процесс как можно дальше к выполнению, фактически не выполнив план выполнения.

Это полезно при повторном выполнении одной и той же команды. Вы сохраните некоторое время выполнения, так как весь процесс не должен повторяться каждый раз.