使用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优化技巧或 ...
随机推荐
- [UE4]蓝图函数库
在任何蓝图上都可以调用“蓝图函数库”的方法
- [UE4]利用取模运算达到循环遍历数组的目的
X mod Y: 1.X<Y: X mod Y = X.计算记过永远都是等于X 2.X=Y:X mod Y = 0.重新回到数组第一个索引位置
- HDFS 入门介绍
HDFS简介 HDFS(Hadoop Distributed File System,Hadoop分布式文件系统),它是一个高度容错性的系统,适合部署在廉价的机器上.HDFS能提供高吞吐量的数据访问, ...
- GRUB2 命令行使用笔记
在GRUB界面按C可进入命令行模式,学会命令行模式有助于玩转单机多OS. 磁盘描述规则: hd0,0 表示第1硬盘第1分区 help 显示帮助(内容会比这里全,此处只做几条常用命令介绍) cat 命令 ...
- java对redis的基本操作(初识)
一.server端安装 1.下载 https://github.com/MSOpenTech/redis 可看到当前可下载版本:redis2.6
- 解决Mac下idea运行速度慢
刚入手Mac,发现Mac下使用idea进行调试极其慢,然后发现和本地回环地址有关: 只需稍微修改hosts文件即可: sudo vim /etc/hosts,在localhost后面追加你的电脑名.l ...
- web api 本地测试
[最简单的,本人小白,大神勿喷] 一:创建web API 服务端 ①创建web api 的项目 ②在这个api项目的Web.config中加上如下几段话: <httpProtocol>&l ...
- Linux free -m 详解命令
如下显示free是显示的当前内存的使用,-m的意思是M字节来显示内容.我们来一起看看. 1 2 3 4 5 6 $ free -m total used ...
- glibc -The GNU C Library
1.使用库文件 1.1.头文件 C库实际包含两部分:头文件,实际的库文件.头文件定义类型.定义宏.声明变量.声明函数.头文件定义的内容实际在库文件中实现.需要使用到 C库 的某些功能时,程序源文件包含 ...
- raw格式和qcow2格式
Raw: "raw" 镜像格式是最最简单的,并且是被 KVM 和 Xen 原生支持的格式,你 可以想象裸格式镜像和块设备文件是二进制位相当的,就好像从块设备拷 贝过来的,比方说,使 ...