一个关于CLR函数的性能问题,求解

yxhcool yxhcool 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
因为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函数的其他特殊性引起的性能下降?希望有大神帮忙解答下。
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
yxhcool
疑难问题 22,298 成员 121,727 内容