`
wsql
  • 浏览: 11789128 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

分拆函数性能优化

 
阅读更多

use Tempdb

GO

if OBJECT_ID ( 'F_Str1' ) is not null

drop function F_Str1

go

/*

此函数缺点,字符长度越长性能越低。

*/

create FUNCTION dbo . F_Str1 (

@Str NVARCHAR ( 4000 ), -- 需要处理的字符串

@Condition nvarchar ( 1000 ) -- 保留字符串如 :N'%[0-9a-zA-Z]%', 注意这里需要有 []

)

RETURNS NVARCHAR ( 4000 )

AS

BEGIN

if charindex ( '[^' , @Condition )=0

set @Condition = STUFF ( @Condition , charindex ( '[' , @Condition )+ 1 , 0 , '^' ) --这一段是为了与后面函数的条件统一

declare @i int

set @i = PATINDEX ( @Condition , @Str )

WHILE @i > 0

SELECT @Str = STUFF ( @Str , @i , 1 , '' ), @i = PATINDEX ( @Condition , @Str )

RETURN @Str

END

go

IF OBJECT_ID ( 'F_Str2' ) IS NOT NULL

DROP FUNCTION F_Str2

go

CREATE FUNCTION dbo . F_Str2 (

@Str NVARCHAR ( 4000 ), -- 需要处理的字符串

@Condition nvarchar ( 1000 ) -- 保留字符串如 :N'%[0-9a-zA-Z]%', 注意这里需要有 []

)

RETURNS NVARCHAR ( 4000 )

AS

BEGIN

DECLARE @s NVARCHAR ( 4000 ), @s2 NVARCHAR ( 4000 )

, @s3 NVARCHAR ( 2 ), @s4 NVARCHAR ( 2 )

, @a NVARCHAR ( 4000 ), @b NVARCHAR ( 4000 )

, @i INT , @j INT , @k INT

SELECT @s = '' , @s2 = '' , @i = 1 , @k = len ( @Str ), @j = CEILING ( @k * 1.0 / 2 )

SELECT @a =LEFT( @Str , @j ), @b =RIGHT( @Str , @k - @j )

WHILE @i <= @j

begin

SELECT @s3 = SUBSTRING ( @a , @i , 1 ), @s4 = SUBSTRING ( @b , @i , 1 )

if @s3 LIKE @Condition

SET @s = @s + @s3

if @s4 LIKE @Condition

SET @s2 = @s2 + @s4

SET @i = @i + 1

end

RETURN @s + @s2

END

GO

--- 以保留数字和字母(字符长度为 4000 )为例,测试结果:

use tempdb

go

select @@VERSION--测试环境

/*

Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition on Windows NT 6.1 <X86> (Build 7600: )

*/

go

IF OBJECT_ID ( 'Tempdb..#T' ) IS NOT NULL

DROP TABLE #T

CREATE TABLE #T( Col NVARCHAR ( 4000))

go

DECLARE @s NVARCHAR ( 4000)

SET @s= REPLICATE ( N' A B' , 2000) -- 改動一下測試數據

INSERT #T SELECT @s

go 10 --10 条记录

GO

-- 清空缓存计划

DBCC FREEPROCCACHE -- 从过程缓存中删除所有元素

DBCC DROPCLEANBUFFERS -- 从缓冲池中删除所有清除缓冲区。

DBCC FREESYSTEMCACHE( 'Tempdb' ) -- 从所有缓存中释放所有未使用的缓存条目

-- 多执行几次取最小值

--F_str1 函数

DECLARE @dt DATETIME = GETDATE ()

SELECT LEN ( dbo. F_str1( Col, N'%[0-9a-zA-Z]%' )) AS [ 檢查長度 ], dbo. F_str1( Col, N'%[0-9a-zA-Z]%' )

FROM #T

SELECT DATEDIFF ( ms, @dt, GETDATE ())

-- 时间为

/*

21466 ms

*/

go

--F_str2 函数

DECLARE @dt DATETIME = GETDATE ()

SELECT LEN ( dbo. F_str2( Col, N'%[0-9a-zA-Z]%' )) AS [ 檢查長度 ], dbo. F_str2( Col, N'%[0-9a-zA-Z]%' )

FROM #T

SELECT DATEDIFF ( ms, @dt, GETDATE ())

/*

496 ms -- 效率提高了44倍多

*/

-- 当字符串长度越大时,效率提高越明显。

以下针对性过滤写法,利用指定排序规则,过滤以上测试数据的中文字符

以下以排序 Latin1_General_CI_AS 为例,支持数字与字符不支持繁体和简体字 , 当不支持时会显示为 ”?” ,利用这一特性可以这样写:

GO

if OBJECT_ID ( 'F_Str3' ) is not null

drop function F_Str3

go

create FUNCTION dbo. F_Str3(

@Str NVARCHAR ( 4000) --

)

RETURNS NVARCHAR ( 4000)

AS

BEGIN

set @Str= REPLACE ( cast ( @Str as varchar ( 8000)) COLLATE Latin1_General_CI_AS, '?' , '' ) -- 取巧方法

RETURN @Str

END

GO

-- 测试结果

--F_str3 函数

DECLARE @dt DATETIME = GETDATE ()

SELECT LEN ( dbo. F_str3( Col)) AS [ 檢查長度 ], dbo. F_str3( Col) FROM #T

SELECT DATEDIFF ( ms, @dt, GETDATE ())

/*

266 ms

*/

闹剧总结

分享到:
评论

相关推荐

    ORACLE9i_优化设计与系统调整

    §5.1 理解ORACLE性能优化 82 §5.1.1 响应时间与吞吐量的折衷 82 §5.1.2 临界资源 83 §5.1.3 过度请求的影响 83 §5.1.4 调整以解决问题 83 §5.2 优化的执行者 84 §5.3 设置性能目标 84 第7章 系统优化方法 85 ...

    并行 任务 管理 Parallel Task Manager:MATLAB并行任务优化管理器,只需输入具体的工作函数和数据,就能自动实现高效率的并行化处理-matlab开发

    同时,将单个任务拆分往往会造成一定的性能损失,在负载均衡的前提下应当尽量将单个任务交给单个进程执行。 本拆分函数接受多个任务各自的尺寸,和并行进程数目作为参数,给出合理化的任务分配方案。 对于单个较大的...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    MySQL优化之分区表

    当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种:  1、分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多。  优点:提高并发量,减小锁的...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    python数据分析随书代码

    第 12章 性能优化、性能分析与并发性 272 12.1 代码的性能分析 272 12.2 安装Cython 277 12.3 调用C代码 281 12.4 利用multiprocessing创建进程池 283 12.5 通过Joblib提高for循环的并发性 286 12.6 比较...

    精通正则表达式~~~

    在内嵌代码结构中使用local函数... 335 关于内嵌代码和my变量的忠告... 338 使用内嵌代码匹配嵌套结构... 340 正则文字重载... 341 正则文字重载的问题... 344 模拟命名捕获... 344 效率... 347 办法不只一...

    我对人工智能的理解与看法.pdf

    深度学习 是利⽤包含多个隐含层的神经⽹络结构的⼈⼯神经⽹络(深度神经⽹络),通过优化神经元的连接⽅法和激活函数等⽅⾯,来提⾼训练效果,产⽣模型后,通过模型对真实事件作出 决策和预测。 机器学习与深度学习...

    我对人工智能的理解与看法(2).pdf

    深度学习 是利⽤包含多个隐含层的神经⽹络结构的⼈⼯神经⽹络(深度神经⽹络),通过优化神经元的连接⽅法和激活函数等⽅⾯,来提⾼训练效果,产⽣模型后,通过模型对真实事件作出 决策和预测。 机器学习与深度学习...

    我对人工智能的理解与看法(1).pdf

    深度学习 是利⽤包含多个隐含层的神经⽹络结构的⼈⼯神经⽹络(深度神经⽹络),通过优化神经元的连接⽅法和激活函数等⽅⾯,来提⾼训练效果,产⽣模型后,通过模型对真实事件作出 决策和预测。 机器学习与深度学习...

    操作系统(内存管理)

    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要理解...

    SuperNotepad

    下列是由固有数学函数派生的非固有数学函数: Secant(正割) Sec(X) = 1 / Cos(X) Cosecant(余割) Cosec(X) = 1 / Sin(X) Cotangent(余切) Cotan(X) = 1 / Tan(X) Inverse Sine(反正弦) Arcsin(X) = ...

    VC与Labview、Matlab编程论文资料[2].rar

    基于LabVIEW的声卡虚拟仪器性能测试与实验.pdf 基于LabVIEW的多任务测控系统及数据库的应用研究.pdf 基于LabVIEW的多通道数据采集系统的研究.pdf 基于LabVIEW的实时控制与仿真技术应用研究.pdf 基于LabVIEW的数据库...

    VC与Labview、Matlab编程论文资料

    基于LabVIEW的声卡虚拟仪器性能测试与实验.pdf 基于LabVIEW的多任务测控系统及数据库的应用研究.pdf 基于LabVIEW的多通道数据采集系统的研究.pdf 基于LabVIEW的实时控制与仿真技术应用研究.pdf 基于LabVIEW的数据库...

    VC与Labview、Matlab编程论文资料[4].rar

    基于LabVIEW的声卡虚拟仪器性能测试与实验.pdf 基于LabVIEW的多任务测控系统及数据库的应用研究.pdf 基于LabVIEW的多通道数据采集系统的研究.pdf 基于LabVIEW的实时控制与仿真技术应用研究.pdf 基于LabVIEW的数据库...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 &lt;br&gt;1.1 Visual Studio开发环境安装与配置 2 &lt;br&gt;0001 安装Visual Studio 2005开发环境须知 2 &lt;br&gt;0002 配置合适的Visual Studio 2005...

    WINRAR5.0正式注册版

    a) RAR 常规压缩算法优化,更好得利用了多处理器核心。单处理器模式中提高一定的 速度的同时,多核心环境的压缩结果更好。 速度的提升效果依赖于数据类型和平均文件大小。在压缩大文件时多核心利用率更 高。 ...

    计算机应用技术(实用手册)

    本机病毒删除不了,解决方法是把硬盘拆下来换到别台主机上进行杀毒,要求挂上去的主机要采用正版杀毒软件,升过级的才可以 49 四.识别常见病毒,病毒一般是以隐藏形式藏匿在计算机的文件中,要把文件的隐藏属性打开...

    rar压缩软件.rar

    RAR 是一个让你在命令行模式中管理压缩文件的控制台应用。RAR 提供压缩、加 密、数据恢复和许多其它此手册中描述的其它功能。 RAR 只支持 RAR 格式压缩文件,它默认有 .rar 扩展名。不支持ZIP 和其他格 ...

Global site tag (gtag.js) - Google Analytics