【发布时间】:2016-09-15 19:36:56
【问题描述】:
我使用的是 SQL Server 2008。我有一个标量值函数来获取客户端的时区并将日期时间输出为客户端时区。我在存储过程的 select 语句中使用它。我注意到是否使用该函数会对性能产生巨大影响,我尝试检查执行计划并使用“统计时间,IO 开启”运行存储过程来检查是什么造成了差异。
例如,这是带有时区调整的查询:
Declare @ClientID int
Select @ClientID = 123
select
abt.someID, myDB..adjustTimeZone(@ClientID, abt.dtDate)
from
aBigTable as abt
where
abt.dtDate > '2016-08-01'
and abt.dtDate < '2016-08-30'
以上代码将返回大约 16k 条记录,需要 16 秒才能完成。
我将记录克隆到九月只是为了确保它不是因为任何缓存,然后我使用另一种方法来调整时区,如下面的查询:
Declare @ClientID int, @ZoneHourChange int
select @ClientID = 123
select @ZoneHourChange = (select hourOffSet from Client
where ClientID = @ClientID)
select
abt.someID, DateADD(hour, @ZoneHourChange, abt.dtDate)
from
aBigTable as abt
where
abt.dtDate > '2016-09-01'
and abt.dtDate < '2016-09-30'
上面的代码也返回 16k 条记录,但只需要一半的时间。从执行计划中可以看出,代价是一样的,并且不涉及并行性。是什么导致了巨大的差异?先感谢您。
【问题讨论】:
-
一个对每一行进行查找..另一个没有
-
你的意思是这个函数会在Client表中查找每一行的时区信息吗?
-
谢谢。这是一篇好文章,我从没想过用视图代替函数
标签: sql sql-server-2008 sqlperformance