SQLSERVER2008中CTE的Split与CLR的性能比较

时间:2024-01-28 06:56:04 

我们新建一个DataBase project,然后建立一个UserDefinedFunctions,Code像这样:


1: /// <summary>
/// SQLs the array.
/// </summary>
/// <param name="str">The STR.</param>
/// <param name="delimiter">The delimiter.</param>
/// <returns></returns>
/// 1/8/2010 2:41 PM author: v-pliu
[SqlFunction(Name = "CLR_Split",
FillRowMethodName = "FillRow",
TableDefinition = "id nvarchar(10)")]
public static IEnumerable SqlArray(SqlString str, SqlChars delimiter)
{
if (delimiter.Length == 0)
return new string[1] { str.Value };
return str.Value.Split(delimiter[0]);
}
/// <summary>
/// Fills the row.
/// </summary>
/// <param name="row">The row.</param>
/// <param name="str">The STR.</param>
/// 1/8/2010 2:41 PM author: v-pliu
public static void FillRow(object row, out SqlString str)
{
str = new SqlString((string)row);
}


然后Bulid,Deploy一切OK后,在SSMS中执行以下测试T-sql:


DECLARE @array VARCHAR(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' SELECT id FROM dbo.CLR_Split(@array,',')


我们来看它的Client Statistic:

SQLSERVER2008中CTE的Split与CLR的性能比较

接着我们执行测试T-sql使用相同的array:


DECLARE @array VARCHAR(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'
SELECT item FROM strToTable(@array,',')


CTE实现的Split function的Client statistic:

SQLSERVER2008中CTE的Split与CLR的性能比较

通过对比,你可以发现CLR的performance略高于CTE方式,原因在于CLR方式有Cache功能,并且把一个复杂的运算放到程序里比DataBase里更加高效。

您还可以参考:
Split string in SQL Server 2005+ CLR vs. T-SQL
Author:Petter Liu

标签:Split,CLR
0
投稿

猜你喜欢

  • javascript移动设备Web开发中对touch事件的封装实例

    2024-04-26 17:13:17
  • vue解决跨域路由冲突问题思路解析

    2024-04-28 09:32:05
  • oracle查看被锁的表和被锁的进程以及杀掉这个进程

    2024-01-15 12:04:15
  • 我用Python给班主任写了一个自动阅卷脚本(附源码)

    2023-11-16 07:43:25
  • python爬虫入门教程--优雅的HTTP库requests(二)

    2022-04-01 05:10:43
  • 深度学习入门之Pytorch 数据增强的实现

    2021-04-05 22:26:07
  • 教你如何在SQL Server数据库中加密数据

    2009-09-10 14:49:00
  • python dataframe NaN处理方式

    2022-12-01 18:49:33
  • python实现人机对战的五子棋游戏

    2021-07-05 04:36:03
  • Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

    2022-03-02 16:50:47
  • Vuex实现购物车小功能

    2024-05-21 10:29:07
  • 关于Ajax responseText 中文乱码问题

    2008-02-12 16:30:00
  • sql 百万级数据库优化方案分享

    2024-01-20 13:20:24
  • Python基于Opencv识别两张相似图片

    2021-01-13 20:16:42
  • Python extract及contains方法代码实例

    2021-03-29 07:51:25
  • Python实现归一化算法详情

    2023-05-11 12:18:33
  • Golang初始化MySQL数据库方法浅析

    2024-01-16 23:49:20
  • Python基于datetime或time模块分别获取当前时间戳的方法实例

    2021-01-19 22:53:18
  • 基于Jquery+Ajax+Json实现分页显示附效果图

    2024-05-21 10:12:27
  • python 实现绘制整齐的表格

    2022-09-25 05:51:22
  • asp之家 网络编程 m.aspxhome.com