1
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 分钟。

4

1 回答 1

1

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

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

你应该检查一下查询计划,它会更好地告诉你那里发生了什么。

于 2012-09-27T07:14:12.267 回答