一个关于CLR函数的性能问题,求解
因为SQL Server没有时间戳函数,因此自己用CLR函数写了个,可以自动获取时区将时间转换为linux时间戳:
[Microsoft.SqlServer.Server.SqlFunction]
public static double Unix_TimeStamp(DateTime dt)
{
return Convert.ToInt32((TimeZone.CurrentTimeZone.ToUniversalTime(dt)-new DateTime(1970,1,1)).TotalSeconds);
}
但在最近使用中,发现一些语句利用这个函数后速度十分慢,比如:
SELECT ISNULL(SUM(money),0) AS money
from [tb_recharge]
where ExchangeType=0 AND
createDate>=dbo.UNIX_TIMESTAMP('2013-03-14')
createDate字段为整数类型的时间戳,并且有索引,表大小在200w左右,耗时需要20秒。
如果我将时间直接转换为数字后,耗时则不到1秒:
SELECT ISNULL(SUM(money),0) AS money
from [tb_recharge]
where ExchangeType=0 AND
createDate>=1363190400
分析执行计划,发现并不相同,虽然都利用了索引,但效率完全不同。百思不得其解,为啥SQL Server 这么傻,难道不会先把dbo.UNIX_TIMESTAMP('2013-03-14') 一次性算出来再去计算?或者是因为CLR函数的其他特殊性引起的性能下降?希望有大神帮忙解答下。