SQLSERVER2008中CTE的Split与CLR的性能比较 <转>
2010-01-09 08:23
477 查看
之前曾有一篇POST是关于用CTE实现Split,这种方法已经比传统的方法高效了。今天我们就这个方法与CLR实现的Split做比较。在CLR实现Split函数的确很简单,dotnetframework本身就有这个function了。
我们新建一个c#-数据库工程,然后建立一个用户自定义函数,Code像这样:
.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:
.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
我们新建一个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,所有包含用户程序集的应用程序域将立即被卸载
原文地址:
相关文章推荐
- SQLSERVER2008中CTE的Split与CLR的性能比较
- SQLSERVER2008中CTE的Split与CLR的性能比较
- SQL查询性能分析之(not in)、(and not)、(<>)、(!=)性能比较
- ArrayList Array List<T>性能比较
- List<T>在搜索和排序时采用不同方法的性能比较
- List<T> 和 Collection<T> 性能比较
- 艾伟_转载:数组排序方法的性能比较(中):Array.Sort<T> 实现分析
- 一起谈.NET技术,数组排序方法的性能比较(中):Array.Sort<T> 实现分析
- C# List<>与Array性能比较
- C# List<>与Array性能比较
- List<T>在搜索和排序时采用不同方法的性能比较
- SQL查询性能分析之(not in)、(and not)、(<>)、(!=)性能比较
- Android SparseArray和HashMap 性能比较<3>
- Array,ArrayList 和 List<T>的选择和性能比较.
- 数组排序方法的性能比较(2):Array.Sort<T>实现分析
- C# List<>与Array性能比较
- C# List<>与Array性能比较
- 泛型集合List<T>和非泛型集合ArrayList性能比较
- List<T> 与ArrayList 性能比较
- 品味性能之道<十一>:JAVA中switch和if性能比较