前言: 
在使用存储过程查询数据中,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函数,优化检索效率的更多相关文章

  1. SQL Server中的SQL语句优化与效率问题

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...

  2. SQL Server中的SQL语句优化与效率

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...

  3. 记录一次SQL函数和优化的问题

    一.前言 上次在年前快要放假的时候记录的一篇安装SSL证书的内容,因为当时公司开始居家办公了,我也打算回个家 毕竟自己在苏州这半年一个人也是很想家的,所以就打算年过完来重新写博客.不巧的是,当时我2月 ...

  4. 在SQL中使用PL/SQL函数存在的问题

    -----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...

  5. SQL性能优化注意事项

    1.选用适合的Oracle优化器 Oracle的优化器共有3种: a.RULE(基于规则) b.COST(基于成本) c.CHOOSE(选择性) 设置缺省的优化器,可以通过对init.ora文件中OP ...

  6. DB2开发系列之三——SQL函数

    1.内置函数分类(SYSIBM模式内) 1)标量函数:返回一个标量值的函数: 2)聚合函数:也叫列函数,也返回一个标量值,这个值是一组输入值的计算结果:3)表函数:向引用它的 SQL 语句返回一个表: ...

  7. 深入SQL Server优化【推荐】

    深入sql server优化,MSSQL优化,T-SQL优化,查询优化 十步优化SQL Server 中的数据访问故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性 ...

  8. CREATE FUNCTION - 定义一个新函数

    SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...

  9. 重新学习MySQL数据库12:从实践sql语句优化开始

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...

随机推荐

  1. [UE4]蓝图:重写父类时调用父类方法

    右键重写的方法选择“Add call to parent function” 一定要善用这个功能,实现原有父类功能的同时实现子类特别的功能.

  2. android webview内存泄露解决方法

    完整的activity的onDestroy()方法:@Override protected void onDestroy() { if( mWebView!=null) { // 如果先调用destr ...

  3. 这些git命令判断提交到哪个分支哪个项目上

    git branch -r fuweikun@pengfei:~/e1_cp/AMSS$ git branch* 8939-E1-2104026-dev git config -l fuweikun@ ...

  4. delphi打开项目提示unable to find resource on dll projects

    用记事本打开*.dof文件, 把这行[Resource DLL Projects]及它的所属的内容删除就行了.

  5. C#多线程学习笔记之(abort与join配合使用)

    今天刚开始学多线程,尽管以前用过一点点,但是只是照着网上代码抄,没有真正理解,现在回过头来想研究研究,慢慢弄懂,下面就是我在网上所找资料的例子,相信大家都看过,做了小点改动 View Code nam ...

  6. Linux下使用OTL操作mysql数据库

    首先重点推荐介绍otl介绍及用法的文章:http://www.cnblogs.com/fnlingnzb-learner/p/5835560.html 一.编写代码 注:以下代码来自OTL示例,略有改 ...

  7. 电商系统架构总结1(EF)

    最近主导了一个电商系统的设计开发过程,包括前期分析设计,框架搭建,功能模块的具体开发(主要负责在线支付部分),成功上线后的部署维护,运维策略等等全过程. 虽然这个系统不是什么超大型的电商系统 数亿计的 ...

  8. Python列表生成式和生成器

    [1]列表生成器:列表生成式就是一个用来生成列表的特定语法形式的表达式. 1.基础语句结构:[exp for iter_var in iterable例如:a=[f(x) for x in range ...

  9. ajax事件执行顺序

    1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success(请求成功时调用) 5.ajaxSuccess(全局事件) 6.error 7.aja ...

  10. sourcetree回退已推送的代码

    方法一: https://blog.csdn.net/gang544043963/article/details/71511958 我百度到博主用这种界面的方式进行的,可视化很好.我想应该可以很好的回 ...