使用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优化技巧或 ...
随机推荐
- Kowala协议:一组分布式,自我调节,资产跟踪特性的加密货币(二)
对于稳定币来言,设计过程中会遇到很多细节的问题,今天来讲述下有关通证设计过程中的一些问题. 1.计算手续费 计算费是交易费的一部分,转移给kUSD矿工,并由以下公式决定: 其gasUsed(t) 是用 ...
- 结合源码分析 bubble 使用注意事项
使用dubbo时候要尽量了解源码,不然会很容易入坑. 一.服务消费端ReferenceConfig需要自行缓存 ReferenceConfig实例是个很重的实例,每个ReferenceConfig实例 ...
- 00010 - cut选取命令详解
定义 正如其名,cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的.cut是以每一行为一个处理对象的,这种机制和sed是一样的 剪切依据 cut命令主要是接受三个定位方法: 第一,字节(by ...
- Win10开发环境配置
基本环境变量配置:最近工作电脑固态硬盘损坏了,导致不得不重新装机,从前配置的环境需要重新配置,在此标记. Java环境配置: 添加变量 JAVA_HOME=D:\Program Files\Java\ ...
- [电脑知识点]Excel取消受保护视图
- (转)C#动态webservice调用接口
原文地址:http://www.cnblogs.com/zouhao/p/6236785.html ,此处仅测试了使用Http post请求调用webservice 调用类: using Syst ...
- Django的select_related 和 prefetch_related 函数优化查询
在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...
- windows10配置python
官网下载:https://www.python.org python3---->Download Windows x86-64 executable installer python2----& ...
- es6(15)--generator
//generator处理异步,下一步用next,遇到return或者yied就会停止 { //generator基本定义 let tell=function* (){ yield 'a'; yiel ...
- QT_QSlider的总结
当鼠标选中QSlider 上时,通过点击的数值为setpageStep():通过左右方向键按钮移动的数值为setsingleStep(). 鼠标滚轮上面两者都不行,不知道是什么原因! 应用: http ...