使用变量时为什么SQL Server会变慢?

Vic*_*ues 18 sql sql-server stored-procedures

我有一个sql查询,运行超快,大约一秒,当不使用变量,如:

WHERE id BETWEEN 5461094 and 5461097
Run Code Online (Sandbox Code Playgroud)

但是当我有:

declare @firstId int
declare @lastId int

set @firstId = 5461094
set @lastId = 5461097

...
    WHERE id BETWEEN @firstId and @lastId
Run Code Online (Sandbox Code Playgroud)

...查询运行速度很慢,仅在几分钟后完成.为什么会这样?我需要使用变量.我可以做任何改进以避免这种性能问题吗?

小智 24

好,

  1. 您是优化工具,查询计划是一种工具.
  2. 我会给你一个询问,你必须选择车辆.
  3. 图书馆中的所有图书都有序号

我的查询是去图书馆,给我3到5之间的所有书籍

你可以选择一辆正确,快速,便宜,高效且足以携带3本书的自行车.

新查询.

去图书馆,获取@x和@y之间的所有书籍.

选车.

前进.

这就是发生的事情.如果我要求1和Maxvalue之间的书籍,你会选择自卸卡车吗?如果x = 3且y = 5,那就太过分了.SQL必须在看到数字之前选择计划.

  • 这是关于微软做错了什么的一个很好的解释。现实生活:询问可变值,然后选择合适的车辆。 (2认同)

Ben*_*n R 11

这是因为当值被硬编码时,它可以查找它对表中数据的统计信息,并找出要运行的最佳查询.查看每个查询的执行计划.使用变量时必须扫描.

如果范围总是很小,您可以使用索引提示来帮助它.