使用CLR Function代替T-SQL函数,优化检索效率
前言:
在使用存储过程查询数据中,T-SQL字符串拆分函数效率低下,这个时候我们可以采用CLR Function代替T-SQL函数,使用DLL执行字符串分解过程,并返回值到SQL中。测试复杂运行的速度:未使用CLR Function时 CPU时间消耗为3228毫秒,占用时间为2375毫秒,使用后CPU时间消耗为125毫秒,占用时间为118毫秒。
概述
微软在推出SQL Server 2005后,实现了对.NET CLR的集成,使得.NET代码可在SQL Server服务器进程中执行。开发人员通过C#和SQLCLR可轻松创建存储过程、用户定义函数、触发器和用户定义类型等功能,改变了以前只能通过T- SQL语言来实现这些功能的局面。作为SQLCLR的典型应用,本文将通过C#编写基础简单的字符串分割,来演示怎么使用CLR Function代替T-SQL函数。
首先第一步:
在Visual Studio中新建一个名为“CLR_GetParamsList”的类库项目。 然后,新建一个名为“CLRFunctions”的类,并在其内添加一个名为“Split”的方法,并添加相应的引用,代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlTypes;
namespace CLR_GetParamsList
{
public class CLRFunctions
{
[Microsoft.SqlServer.Server.SqlFunction(Name = "Clr_Split", FillRowMethodName = "SplitFillRow", TableDefinition = "item nvarchar(256)")]
public static IEnumerable Split(SqlString input, SqlString separators)
{
string[] sArray;
if (input.IsNull)
{
sArray = new string[] { null };
}
else
{
string s = input.ToString();
sArray = s.Split(',');
}
return sArray;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
(注:这里我们未来将传入的示例参数为“1,2,3,4,5”格式,“,”为分隔符)
第二步
我们需要编译这个项目为一个DLL,并在SQL Server中注册它。 这也是比较简单的,在VS中右键单击项目,选择“生成”后程序就会生成一个DLL。 可以在如下所示那样的路径里找到编译好的DLL。
第三步
默认情况下,SQL Server中的CLR是关闭的,所以我们需要在SQL中执行如下命令打开CLR:(注:使用哪个数据库就在那个数据库中注册,注册到master或其他数据库中是无法使用的)
exec sp_configure 'clr enabled',1
reconfigure
go
- 1
- 2
- 3
第四步
为了调用我们写的那个方法,需要在SQL Server中注册我们刚刚编译好的那个DLL。 我们可以在数据库中使用如下命令来注册DLL(路径为你的DLL文件的路径),这里为了路径方便我把DLL提取到C盘根目录下存放。
CREATE ASSEMBLY CLR_GetParamsList FROM 'C:\CLR_GetParamsList.dll'
- 1
第五步
在SQL Server中调用我们的.NET方法 ,为了调用.NET方法,我们可以写一个SQL Server自定义函数,并在其内使用“EXTERNAL NAME”来通知SQL Server使用CLR功能。 代码如下:
CREATE FUNCTION [dbo].[CLR_GetParamsList](@input [NVARCHAR](MAX), @separators [NVARCHAR](MAX))
RETURNS TABLE (
[ID] [NVARCHAR](1000) NULL
) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [CLR_GetParamsList].[CLR_GetParamsList.CLRFunctions].[Split]
- 1
- 2
- 3
- 4
- 5
- 6
最后
执行你的存储过程吧!
SELECT * FROM [dbo].[CLR_GetParamsList] ('1,2,3,4,5,6,7,8,9,0',',')
- 1
提示
当你不使用这个方法的时候,可以在数据库中把它注销掉!
DROP ASSEMBLY CLR_GetParamsList(这个是注销该DLL文件)
- 1
总结
SQL Server 一般使用SQL-CLR来实现专门执行计算的操作功能,使用T-SQL来实现基于集合的操作功能,或许没有直接建表值函数和标量函数那么快速,但是在处理某些功能时却明显优于T-SQL,优势和劣势相对应,如果数量级较小建议使用T-SQL直接处理,方便管理,如果数量级较大影响到运行速度,也许CLR就是你的备选方案。
使用CLR Function代替T-SQL函数,优化检索效率的更多相关文章
- SQL Server中的SQL语句优化与效率问题
很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...
- SQL Server中的SQL语句优化与效率
很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...
- 记录一次SQL函数和优化的问题
一.前言 上次在年前快要放假的时候记录的一篇安装SSL证书的内容,因为当时公司开始居家办公了,我也打算回个家 毕竟自己在苏州这半年一个人也是很想家的,所以就打算年过完来重新写博客.不巧的是,当时我2月 ...
- 在SQL中使用PL/SQL函数存在的问题
-----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...
- SQL性能优化注意事项
1.选用适合的Oracle优化器 Oracle的优化器共有3种: a.RULE(基于规则) b.COST(基于成本) c.CHOOSE(选择性) 设置缺省的优化器,可以通过对init.ora文件中OP ...
- DB2开发系列之三——SQL函数
1.内置函数分类(SYSIBM模式内) 1)标量函数:返回一个标量值的函数: 2)聚合函数:也叫列函数,也返回一个标量值,这个值是一组输入值的计算结果:3)表函数:向引用它的 SQL 语句返回一个表: ...
- 深入SQL Server优化【推荐】
深入sql server优化,MSSQL优化,T-SQL优化,查询优化 十步优化SQL Server 中的数据访问故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性 ...
- CREATE FUNCTION - 定义一个新函数
SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...
- 重新学习MySQL数据库12:从实践sql语句优化开始
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...
随机推荐
- C++ Programming Language中的Calculator源代码
C++ Programming Language 4th中的Calculator源代码整理,因为在C++ Programming Language中,涉及了很多文件位置之类的变化,所以,这里只是其中的 ...
- Jmeter(二十七)Jmeter Question 之“集成Ant+Jenkins自动化”
首先介绍一下Ant.Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. 是的.还是Apache家 ...
- phpStudy配置站点 解决You don't have permission to access / on this server
1.配置站点:打开phpStudy->其他选项菜单->站点域名管理 2.配置站点:打开phpStudy->其他选项菜单->打开hosts 3.在apache的配置文件vhost ...
- android切换前后台状态监听
public class BaseApplication extends Application { private static BaseApplication instance; /** * 当前 ...
- mvc5总结(1)
1.Global.asax 全局的启动项,初始化相关配置 2.路由,按照默认规定请求就行,没必要扩展太多 3.区域路由,当我们想命名相同的controller和action时,结合命名空间使用 pub ...
- linux chown命令解除文件夹的root权限限制
sudo chown -R demouser file 这个命令可以解除linux文件的超级权限限制 摘录: chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名 ...
- windows模拟linux部分功能
--------------------------------------------分割线----------------------------------------------- 系统 wi ...
- 【CF1132F】Clear the String (DP)
/* 区间dp题目, 考虑当前区间l,r 是可以枚举最后一次拿的分界点来考虑最右边节点是不是具有贡献 */ #include<cstdio> #include<algorithm&g ...
- Struts2学习:Action获取properties文件的值
配置文件路径: 配置内容: 方法一: Action内被调用的函数添加下段代码: Properties props = new Properties(); props.load(UploadFileAc ...
- JS静态变量和函数、实例变量和函数以及prototype 说明
静态变量.函数 当定义一个函数后通过 “.”为其添加的属性和函数,通过对象本身仍然可以访问得到,但是其实例却访问不到,这样的变量和函数分别被称为静态变量和静态函数,用过Java.C#的同学很好理解静态 ...