在性能中使用值与变量

时间:2012-09-27 07:10:47

标签: sql sql-server sql-server-2008

select *
from table1 t1
where
  t1.somedate between UDF(date1) and UDF(date2)

UDF:用户定义的函数

UDF(date1)UDF(date2)将针对t1的每一行进行评估。

这会降低性能。

第二个选项我试过

declare @a datetime, @b datetime
set @a=UDF(date1)
set @b=UDF(date2)
select *
    from table1 t1
    where
      t1.somedate between @a and @b

即使这需要很长时间。

可能是什么原因,可能是什么工作。

如果我写

select *
    from table1 t1
    where
      t1.somedate between date1 and date2
它非常快。大约需要3秒。上述查询需要2-3分钟。

1 个答案:

答案 0 :(得分:1)

首先,我认为使用变量而不是UDF不会让你在性能上有所提升,因为udf应该是确定性的。所以它只会被计算一次。

其次,你在somedate字段上有索引吗?如果你不这样做,就放一个。如果有,您可以检查您获得了多少数据以及是否存在网络问题。

您应该检查以查看查询计划,它会更好地向您显示正在进行的操作。