您的位置:首页 > 数据库

SQLSERVER2008中CTE的Split与CLR的性能比较 <转>

2010-01-09 08:23 477 查看
之前曾有一篇POST是关于用CTE实现Split,这种方法已经比传统的方法高效了。今天我们就这个方法与CLR实现的Split做比较。在CLR实现Split函数的确很简单,dotnetframework本身就有这个function了。
我们新建一个c#-数据库工程,然后建立一个用户自定义函数,Code像这样:

///<summary>
///SQLsthearray.
///</summary>
///<paramname="str">TheSTR.</param>
///<paramname="delimiter">Thedelimiter.</param>
///<returns></returns>
///1/8/20102:41PMauthor:v-pliu
[SqlFunction(Name="CLR_Split",
FillRowMethodName="FillRow",
TableDefinition="idnvarchar(10)")]
publicstaticIEnumerableSqlArray(SqlStringstr,SqlCharsdelimiter)
{
if(delimiter.Length==0)
returnnewstring[1]{str.Value};
returnstr.Value.Split(delimiter[0]);
}
///<summary>
///Fillstherow.
///</summary>
///<paramname="row">Therow.</param>
///<paramname="str">TheSTR.</param>
///1/8/20102:41PMauthor:v-pliu
publicstaticvoidFillRow(objectrow,outSqlStringstr)
{
str=newSqlString((string)row);
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

然后编译,部署一切OK后,在SSMS中执行以下测试T-sql:

DECLARE@arrayVARCHAR(max)
SET@array='39,15,93,68,64,43,90,58,39,9,26,26,89,47,91,57,98,16,55,9,63,29,69,16,41,76,34,60,68,64,61,53,32,30,11,72,57,63,36,43,22,14,60,38,24,5,66,26,26,21,22,99,55,18,7,10,46,76,27,88,9,29,89,75,48,72,94,59,35,19,0,35,79,11,87,49,68,30,91,35,9,7,34,47,41,61,98,13,22,1,26,80,35,48,34,92,24,85,90,51'
SELECTidFROMdbo.CLR_Split(@array,',')


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

我们来看它的ClientStatistic:

go
reconfigure;
go
execsp_configure'clrenabled','1'
go
reconfigure;
execsp_configure'showadvancedoptions','1';
go

即可启用
"
配置选项'showadvancedoptions'已从0更改为1。请运行RECONFIGURE语句进行安装。
配置选项'clrenabled'已从0更改为1。请运行RECONFIGURE语句进行安装。
配置选项'showadvancedoptions'已从1更改为1。请运行RECONFIGURE语句进行安装。
"

解释:
sp_configure[[@configname=]'option_name'
[,[@configvalue=]'value']]

备注
使用sp_configure可以显示或更改服务器级别的设置。若要更改数据库级别设置,请使用ALTERDATABASE。若要更改仅影响当前用户会话的设置,请使用SET语句。
更新运行的配置值
为option指定新value时,结果集的config_value列中将显示该值。该值最初与run_value列中的值不同,后者显示当前运行的配置值。若要更新run_value列中的运行配置值,系统管理员必须运行RECONFIGURE或RECONFIGUREWITHOVERRIDE。
RECONFIGURE和RECONFIGUREWITHOVERRIDE对每个配置选项都有效。但是,基本RECONFIGURE语句会拒绝处于合理范围之外或可能导致选项冲突的任何选项值。例如,如果recoveryinterval的值大于60分钟,或affinitymask的值与affinityI/Omask的值重叠,则RECONFIGURE会生成错误。与此相反,RECONFIGUREWITHOVERRIDE则接受具有正确数据类型的任何选项值,并使用指定的值强制进行重新配置。
有些配置选项(例如affinitymask和recoveryinterval)被指定为高级选项。默认情况下,无法查看和更改这些选项。若要使这些选项可用,请将ShowAdvancedOptions配置选项设置为1。
使用clrenabled选项可以指定MicrosoftSQLServer是否可以运行用户程序集。clrenabled选项提供下列值。
值说明
0
不允许在SQLServer上执行程序集。

1
允许在SQLServer上执行程序集。

clrenabled选项是一个高级选项。如果使用sp_configure系统存储过程来更改该设置,则只有在showadvancedoptions设置为1时才能更改clrenabled。该设置在运行sp_configure后立即生效。不需要重新启动SQLServer实例。
注意:
运行RECONFIGURE时,clrenabled选项的运行值将从1改为0,所有包含用户程序集的应用程序域将立即被卸载

原文地址:/article/4753346.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: