SQLSERVER2008中CTE的Split与CLR的性能比较
2010-01-08 15:38
381 查看
之前曾有一篇POST是关于用CTE实现Split,这种方法已经比传统的方法高效了。今天我们就这个方法与CLR实现的Split做比较。在CLR实现Split函数的确很简单,dotnetframework本身就有这个function了。
我们新建一个DataBaseproject,然后建立一个UserDefinedFunctions,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;}
然后Bulid,Deploy一切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:
接着我们执行测试T-sql使用相同的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;}
CTE实现的Splitfunction的Clientstatistic:
通过对比,你可以发现CLR的performance略高于CTE方式,原因在于CLR方式有Cache功能,并且把一个复杂的运算放到程序里比DataBase里更加高效。
您还可以参考:
SplitstringinSQLServer2005+CLRvs.T-SQL
Author:PetterLiuhttp://wintersun.cnblogs.com
希望这篇POST对您有帮助。
我们新建一个DataBaseproject,然后建立一个UserDefinedFunctions,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;}
然后Bulid,Deploy一切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:
接着我们执行测试T-sql使用相同的array:
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'
SELECTitemFROMstrToTable(@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;}
CTE实现的Splitfunction的Clientstatistic:
通过对比,你可以发现CLR的performance略高于CTE方式,原因在于CLR方式有Cache功能,并且把一个复杂的运算放到程序里比DataBase里更加高效。
您还可以参考:
Author:PetterLiu
希望这篇POST对您有帮助。
相关文章推荐
- SQLSERVER2008中CTE的Split与CLR的性能比较
- SQLSERVER2008中CTE的Split与CLR的性能比较 <转>
- String类的split()方法与StringTokenizer方法对字符串分割并输出内容的性能比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- StringTokenizer和Split性能比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java中subString、split、stringTokenizer三种截取字符串方法的性能比较(转)
- String的substring、split, StringTokenizer 截取字符串性能比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- Java中substring、split、StringTokenizer三种截取字符串方法的性能比较
- StringTokenizer和Split性能比较
- StringTokenizer和Split性能比较
- explode,split,preg_split性能比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- String 的 split、subString,外加StringTokenizer之性能比较