Обойти анализ параметров в 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
Я не уверен, что он написал что-нибудь для более новых версий, но некоторые основные принципы не сильно изменились...