Sql 在绩效中使用价值vs变量

Sql 在绩效中使用价值vs变量,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,用户定义函数 此UDF(date1)和UDF(date2),将针对t1的每一行进行评估 这会降低性能 我试过的第二个选择 select * from table1 t1 where t1.somedate between UDF(date1) and UDF(date2) 即使这样也需要很长时间 可能的原因是什么,可能的工作是什么 如果我写 declare @a datetime, @b datetime set @a=UDF(date1) set @b=UDF(date2) select

用户定义函数

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

这会降低性能

我试过的第二个选择

select *
from table1 t1
where
  t1.somedate between UDF(date1) and UDF(date2)
即使这样也需要很长时间

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

如果我写

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

非常快。大约需要3秒。上面的查询需要2-3分钟。

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

第二,somedate字段上有索引吗?如果没有,就放一个。如果你有,你可以检查你有多少数据,如果你有网络问题


您应该查看查询计划,它将更好地向您展示那里正在发生的事情。

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

第二,somedate字段上有索引吗?如果没有,就放一个。如果你有,你可以检查你有多少数据,如果你有网络问题



您应该检查以查看查询计划,它将更好地显示那里发生的情况。

您的第二个选项是正确的方法。你能分享你的自定义代码吗?您是否检查了执行计划以确保UDF占用了时间,并且您不仅缺少表上的索引,等等。确保UDF占用了时间,因为第三个查询非常快,我在somedate列上有indexe。您是否可以告诉我是否会对一行的UDF每次进行评估,在第一个查询中。首先,为什么在这里需要自定义项?somedate位于时区x。日期1,日期2位于时区y。要比较x和y,我需要将date1、date2转换为时区x。这就是我使用udf的地方。你的第二个选择是正确的方法。你能分享你的自定义代码吗?您是否检查了执行计划以确保UDF占用了时间,并且您不仅缺少表上的索引,等等。确保UDF占用了时间,因为第三个查询非常快,我在somedate列上有indexe。您是否可以告诉我是否会对一行的UDF每次进行评估,在第一个查询中。首先,为什么在这里需要自定义项?somedate位于时区x。日期1,日期2位于时区y。要比较x和y,我需要将date1、date2转换为时区x。这就是我使用udf的地方。somedate有一个索引!udf是否会在每次(第一次查询)进行评估实际上,在查询中使用变量而不是udf可以帮助优化器选择合适的索引。我说过udf“应该”是确定性的。我很少看到非确定性UDF。如果udf被标记为deterministic,那么优化器会将其视为一个变量。my udf是deterministic,它的udf(datetime、fromtimezone、totimezone)。这样,您就可以在查询中使用它,而不必担心惩罚。somedate有一个索引!udf是否会在每次(第一次查询)进行评估实际上,在查询中使用变量而不是udf可以帮助优化器选择合适的索引。我说过udf“应该”是确定性的。我很少看到非确定性UDF。如果udf被标记为确定性,那么优化器会将其视为变量。my udf是确定性的,它的udf(datetime、fromtimezone、totimezone)。这样,您就可以在查询中使用它,而不用担心惩罚。
select *
    from table1 t1
    where
      t1.somedate between date1 and date2