Обойти анализ параметров в SQL Server 2005

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

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 ответ

Решение

На самом деле, вам нужно назначить переменную по умолчанию для поля @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

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

Другие вопросы по тегам