В базе данных SQL Server 2005 я работаю над этим запросом:
выберите *
из foo
бара соединения на bar.x = foo.x
присоединиться к baz на baz.y = foo.y
где foo.x = 1000
имеет значительно другой и более быстрый план запросов, чем следующая параметризованная версия.
объявить @p0 int
set @p0 = 1000
выберите *
из foo
бара соединения на bar.x = foo.x
присоединиться к baz на baz.y = foo.y
где foo.x = @p0
В моем конкретном случае версия с литеральным тиражом выполняется в второй раз. Параметрированная версия занимает 2-3 секунды. Я ожидал, что они будут одинаковыми, если они будут тем же самым запросом.
Почему они получают разные планы запросов?
Есть ли способ сделать параметризованную версию той же производительности, что и буквальная версия?
Вот планы запросов. Мой реальный запрос отличается от общего, который я дал выше, однако единственная разница между двумя запросами, которые произвели эти планы, является параметром. Почему замена литерала параметром приводит к таким совершенно различным планам?