Большая разница в производительности запросов T-SQL между использованием переменных и констант - PullRequest
0 голосов
/ 05 ноября 2010

Все,

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

Я вижу, что

DECLARE @ID BIGINT
SET @ID = 5
SELECT * FROM tblEmployee WHERE ID = @ID

работает намного быстрее, чем когда я запускаю

SELECT * FROM tblEmployee WHERE ID = 5

Это, очевидно, более простая версия фактического запроса, но кто-нибудьзнать об известных проблемах в SQL Server 2005, как он анализирует запросы, которые объясняют это поведение.Мой первоначальный запрос проходит от 13 секунд до 8 минут между двумя подходами.

Спасибо, Ашиш

Ответы [ 4 ]

1 голос
/ 05 ноября 2010

Вы уверены, что это так?

Обычно параметризованный запрос будет медленнее, потому что SQL Server заранее не знает, каким будет параметр.Константу можно оптимизировать сразу же.

Здесь следует отметить одну вещь о типах данных ... что она делает:

SELECT * FROM tblEmployee WHERE ID = CAST(5 as bigint)

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

Другой способ, идентификатор маски для удаления «сниффинга параметров» влияет на первый запрос.И разница?

DECLARE @ID BIGINT
SET @ID = 5
DECLARE @MaskedID BIGINT
SET @MaskedID = @ID
SELECT * FROM tblEmployee WHERE ID = @MaskedID 

Наконец, добавьте OPTION (RECOMPILE) к каждому запросу.Это означает, что план отбрасывается и не используется повторно, поэтому он компилируется по-разному.

1 голос
/ 05 ноября 2010

Вы проверили планы запросов для каждого? Это всегда первое, что я делаю, когда пытаюсь проанализировать проблему с производительностью.

0 голосов
/ 26 июля 2013

Насколько я понимаю, это связано с кэшированными планами запросов.

Когда вы запускаете Select * from A, где B = @C, это один план запроса независимо от значения @C.так что если вы запускаете 10x с разными значениями для @C, это будет один план запроса.

Когда вы запустите:

Select * from A Where B = 1 it creates a query plan
Select * from A Where B = 2 creates another
Select * from A Where B = 3 creates another

и т. д.объем памяти.

Кэширование плана запросов Google и литералы, и я уверен, что вы включите подробные объяснения

0 голосов
/ 05 ноября 2010

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

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