Обойти анализ параметров в SQL Server 2005 - PullRequest
2 голосов
/ 24 мая 2011

Я видел, как люди предлагали скопировать параметры в локальную переменную, чтобы избежать перехвата параметров в хранимом процессе.Скажем, у вас есть

CREATE PROCEDURE List_orders_3 @fromdate datetime AS
 DECLARE @fromdate_copy datetime
 SELECT @fromdate_copy = @fromdate
 SELECT * FROM Orders WHERE OrderDate > @fromdate_copy

(я получил это от http://www.sommarskog.se/query-plan-mysteries.html, но мне нужно больше деталей, чтобы понять это полностью).

Но что это делает с кэшем плана запросов и оптимизатором плана запроса?Если это правда, что оптимизатор не делает никаких предположений о @fromdate_copy, то почему он не будет кэшировать план, который, скорее всего, будет полным просмотром таблицы (так как он не делает никаких предположений, как он мог генерировать что-то еще)?

Является ли этот метод в основном похожим на то, что «никакие входные данные не будут работать хорошо, но никакие входные данные также не будут работать ужасно»?

1 Ответ

2 голосов
/ 24 мая 2011

На самом деле, вам нужно назначить переменную по умолчанию для поля @fromdate_copy, которое вы объявляете, чтобы, когда механизм запросов просматривал сам запрос, он основывал план на значении, которое «жестко закодировано» - но вместо этогокогда запрос фактически выполняется, он выполняется с передачей и переключением значения.

Кен Хендерсон (сам Гуру) объяснил это очень подробно: http://blogs.msdn.com/b/khen1234/archive/2005/06/02/424228.aspx

ЕслиВы можете прочитать его книги - они предлагают множество информации о внутренностях сервера SQL: http://www.amazon.com/Gurus-Guide-Server-Architecture-Internals/dp/0201700476/ref=pd_bxgy_b_text_c

Я не уверен, что он написал что-то для более новых версий, но некоторые из основ не имеюттак сильно изменился ...

...