一个关于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函数的其他特殊性引起的性能下降?希望有大神帮忙解答下。
[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函数的其他特殊性引起的性能下降?希望有大神帮忙解答下。
...全文
相关推荐
SQLSERVER2008中CTE的Split与CLR的性能比较
如果处理大量数据或对性能有严格要求,CLR可能是更好的选择。而在简单查询或系统不支持CLR的情况下,CTE仍然是一个实用的工具。
SQL:MS-SQL 的 CLR 函数
性能:CLR函数通常比T-SQL函数更快,但并非总是如此。应根据具体场景进行测试和优化。2.
CLR编程,CLR 原理,CLR 内幕
在CLR中,内存管理有着独特的机制,特别是垃圾回收(Garbage Collection)功能,解决了传统C++等语言中常见的内存泄漏和内存碎片问题。
SQLSERVER使用的CLR常用函数
必须SQLSERVER2005以上,支持CLR函数才行。其中Concatenate是拼接字符串的聚合函数,MaxOther是某列最大时获取另外一列值的聚合函数,MinOther则反之。Regex开头的
sql_clr调用c#生成数组函数
接下来,我们将探讨如何在SQL CLR中使用C#数组函数:1. **数组生成**:在C#中,你可以创建一个函数,该函数接收参数并返回一个数组。


疑难问题
