300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 谈谈SQL数据库中滥用临时表 排序的解决方案优化(举例:汉字转拼音函数)...

谈谈SQL数据库中滥用临时表 排序的解决方案优化(举例:汉字转拼音函数)...

时间:2020-01-04 08:19:25

相关推荐

谈谈SQL数据库中滥用临时表 排序的解决方案优化(举例:汉字转拼音函数)...

游标、临时表、触发器、COLLATE等等……

无可厚非、这些都是好东西,我为什么今天要花时间来写这些东西呢?

是因为我发现慢慢的很多人用久了这些东西之后会形成一种习惯,不管解决什么问题动不动都会把它们搬出来,由此我看到了很多漂亮的代码在性能效率面前却显得不那么优秀。

好了废话不多说开始进入正题吧。

今天的案例

场景:

需要通过用户输入的姓名关键字来搜索用户。用户输入关键字'x'来搜索用户(数据来源于表[Name字段中]或内存[List<UserInfo>]中)

要求:

得到的结果排序应为:

x

xia

xiao

yx

即:

包含x字母的结果均应显示出来首字母匹配的结果应该排在前面(如x开头)在条件2相同的前提下更短的结果应排在前面(如x排在xia前面)各位大侠能否给出一套C#与SQL Server()的解决方案?

补充:

如果能一起解决中文问题最好,如搜索'x'

得到的结果排序应为:

x

xiani

夏荣

肖小笑

杨星

即将汉字的拼音首字母纳入在内,不知SQL Server是否支持这一特性的搜索?

感谢[学习的脚步]这位网友提出来的问题

其实要解决这个问题不难,无非就是汉字转拼音首字母

---------------------------------------------------------------------------------------------

先给出解决方案一

---------------------准备工作 开始-------------------------------

ifobject_id('zhuisuos')isnotnull

droptablezhuisuos

go

createtablezhuisuos

(

namevarchar(100)

)

insertintozhuisuosvalues('追索')

insertintozhuisuosvalues('追索2')

insertintozhuisuosvalues('xia')

insertintozhuisuosvalues('dxc')

insertintozhuisuosvalues('x')

insertintozhuisuosvalues('xx')

insertintozhuisuosvalues('xiani')

insertintozhuisuosvalues('yx')

insertintozhuisuosvalues('夏荣')

insertintozhuisuosvalues('肖小笑')

insertintozhuisuosvalues('杨星')

go

-------------------------------------------------------------------------------

--建立汉字转拼音首字母函数

ifobject_id('fn_getpy1')isnotnull

dropfunctionfn_getpy1

go

GO

createfunction[dbo].fn_getpy1

(@strnvarchar(4000))

returnsnvarchar(4000)

as

begin

declare@str_lenint,@resultnvarchar(4000)

declare@zhuisuotable

(firstspellnchar(1) collate Chinese_PRC_CI_AS,

letternchar(1))

set@str_len=len(@str)

set@result=''

insertinto@zhuisuo

(firstspell,letter)

select'吖','A'unionallselect'八','B'unionall

select'嚓','C'unionallselect'咑','D'unionall

select'妸','E'unionallselect'发','F'unionall

select'旮','G'unionallselect'铪','H'unionall

select'丌','J'unionallselect'咔','K'unionall

select'垃','L'unionallselect'嘸','M'unionall

select'拏','N'unionallselect'噢','O'unionall

select'妑','P'unionallselect'七','Q'unionall

select'呥','R'unionallselect'仨','S'unionall

select'他','T'unionallselect'屲','W'unionall

select'夕','X'unionallselect'丫','Y'unionall

select'帀','Z'

while@str_len>0

begin

selecttop1@result=letter+@result,@str_len=@str_len-1

from@zhuisuo

where firstspell<=substring(@str,@str_len,1)

orderby firstspelldesc

if@@rowcount=0

select@result=substring(@str,@str_len,1)+@result,@str_len=@str_len-1

end

return(@result)

end

---------------------准备工作 结束-------------------------------

--正式查询

declare@strvarchar(10)

set@str='x'

createtable#result

(namevarchar(100)null,idintnull,lensintnull)

insertinto#result

selectname,1,len(name)fromzhuisuos

wherenamelike@str+'%'

insertinto#result

selectname,2,len(name)fromzhuisuos

wherenamelike'%'+@str+'%'andnamenotlike@str+'%'

insertinto#result

selectname,3,len(name)fromzhuisuos

wheredbo.fn_getpy1 (name)like@str+'%'andnamenotlike@str+'%'andnamenotlike'%'+@str+'%'

insertinto#result

selectname,4,len(name)fromzhuisuos

wheredbo.fn_getpy1 (name)like'%'+@str+'%'anddbo.fn_getpy1 (name)notlike@str+'%'

and namenotlike@str+'%'andnamenotlike'%'+@str+'%'

selectnamefrom#result

orderbyid,lens

droptable#result

这个解决方案已经满足查询要求

其它都不管 我们重点来看看这次写的这个函数

象这样的汉字转拼音函数在网上一搜一大把 今天我就要举例几个方案让大家对优化及开销有个清楚的概念

解决方案一写的函数实在是太糟糕了(以上及接下来举出的案例并无冒犯任何雷同及原创代码之意,还请多多包涵)

为什么这么说呢

这是它的执行计划

它用了临时表并且排序

表插入开销0.01 表扫描开销0.003 表排序0.011

估计总开销0.0246

实际执行:我拿1万行数据调用此函数花了我20几秒、一个查询操作你愿意等20多秒吗

所以看到这样的执行计划实在很抱歉

解决方案二

createfunction[dbo].[fn_getpy2](@Strvarchar(500)='')

returnsvarchar(500)

as

begin

declare@strlenint,@returnvarchar(500),@iiint

declare@nint,@cchar(1),@chnnchar(1)

select@strlen=len(@str),

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。