`
hypgr
  • 浏览: 277678 次
社区版块
存档分类
最新评论

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

阅读更多

游标、临时表、触发器、COLLATE等等……
无可厚非、这些都是好东西,我为什么今天要花时间来写这些东西呢?
是因为我发现慢慢的很多人用久了这些东西之后会形成一种习惯,不管解决什么问题动不动都会把它们搬出来,由此我看到了很多漂亮的代码在性能效率面前却显得不那么优秀。

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


今天的案例

场景:

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

要求:

得到的结果排序应为:

x

xia

xiao

yx

即:

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


补充:

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

得到的结果排序应为:

x

xiani

夏荣

肖小笑

杨星

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

 

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

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

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

先给出解决方案一

---------------------准备工作 开始-------------------------------
if object_id('zhuisuos')is not null
drop table zhuisuos
go

create table zhuisuos
(
name 
varchar(100)
)
insert into zhuisuos values('追索')
insert into zhuisuos values('追索2')
insert into zhuisuos values('xia')
insert into zhuisuos values('dxc')
insert into zhuisuos values('x')
insert into zhuisuos values('xx')
insert into zhuisuos values('xiani')
insert into zhuisuos values('yx')
insert into zhuisuos values('夏荣')
insert into zhuisuos values('肖小笑')
insert into zhuisuos values('杨星')
go
-------------------------------------------------------------------------------
--
建立汉字转拼音首字母函数
if object_id('fn_getpy1')is not null
drop function fn_getpy1
go

GO
create   function   [dbo].fn_getpy1
(
@str   nvarchar(4000)) 
returns   nvarchar(4000
as 
begin 
declare   @str_len   int,@result   nvarchar(4000
declare   @zhuisuo   table
(firstspell   
nchar(1)   collate   Chinese_PRC_CI_AS,
letter   
nchar(1)) 
set @str_len=len(@str)
set @result= ' ' 
insert   into   @zhuisuo
(firstspell,letter) 
    
select   '吖 '''   union   all   select   '八 '''   union   all 
    
select   '嚓 '''   union   all   select   '咑 '''   union   all 
    
select   '妸 '''   union   all   select   '发 '''   union   all 
    
select   '旮 '''   union   all   select   '铪 '''   union   all 
    
select   '丌 '''   union   all   select   '咔 '''   union   all 
    
select   '垃 '''   union   all   select   '嘸 '''   union   all 
    
select   '拏 '''   union   all   select   '噢 '''   union   all 
    
select   '妑 '''   union   all   select   '七 '''   union   all 
    
select   '呥 '''   union   all   select   '仨 '''   union   all 
    
select   '他 '''   union   all   select   '屲 '''   union   all 
    
select   '夕 '''   union   all   select   '丫 '''   union   all 
    
select   '帀 ''' 
    
while   @str_len> 0 
    
begin 
        
select   top   1   @result=letter+@result,@str_len=@str_len-1 
            
from   @zhuisuo     
            
where   firstspell <=substring(@str,@str_len,1
            
order   by   firstspell   desc 
        
if   @@rowcount=0 
          
select   @result=substring(@str,@str_len,1)+@result,@str_len=@str_len-1 
    
end 
    
return(@result
end
---------------------准备工作 结束-------------------------------

--正式查询
declare @str varchar(10)
set @str='x'
create table #result
(name 
varchar(100null,id int null,lens int null)

insert into #result 
select name,1,len(name) from zhuisuos
where name like @str+'%'

insert into #result
select name,2,len(name) from zhuisuos
where name like '%'+@str+'%' and name not like @str+'%'

insert into #result
select name,3,len(name) from zhuisuos
where dbo.fn_getpy1 (name) like @str+'%' and name not like @str+'%' and name not like '%'+@str+'%'

insert into #result
select name,4,len(name) from zhuisuos
where dbo.fn_getpy1 (name) like '%'+@str+'%' and dbo.fn_getpy1 (name) not like @str+'%'
  
and  name not like @str+'%' and name not like '%'+@str+'%'

select name from #result
order by id,lens
drop table #result

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

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

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

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

 

为什么这么说呢

这是它的执行计划

它用了临时表并且排序

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

估计总开销0.0246

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

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

解决方案二

create function [dbo].[fn_getpy2](@Str varchar(500)='')
returns varchar(500)
as
begin
declare @strlen int,@return varchar(500),@ii int
declare @n int,@c char(1),@chn nchar(1)

select @strlen=len(@str),</spa

分享到:
评论
1 楼 liangjing23 2011-07-24  
没写完??

相关推荐

    SQLServer汉字转全拼音函数 .txt

    ### SQLServer中的汉字转全拼音函数 在数据库管理和数据处理领域,经常需要对文本进行各种形式的转换,以便于检索、排序或者分析等操作。其中一个常见的需求是将汉字转换为拼音,这对于支持中文环境的系统尤其重要...

    修改SQL数据库排序规则修改表栏位排序规则

    修改SQL数据库排序规则修改表栏位排序规则 修改SQL数据库排序规则: 1.修改为单用户模式 2.然后关闭所有的查询窗口,修改Options的Collocation属性,如:Chinese_PRC_90_CI_AS 3.再修改为多用户模式 修改表栏位...

    SQL 汉字转拼音首字母

    ### SQL汉字转拼音首字母知识点解析 #### 一、背景介绍 在数据库处理过程中,有时候我们需要将汉字转换为对应的拼音,特别是在中文环境下的数据检索、排序等操作中,这种需求尤为常见。本篇文章将深入探讨如何利用...

    sqlserver中判断表或临时表是否存在

    SQL Server 中判断表或临时表是否存在 在 SQL Server 中判断表或临时表是否存在是非常重要的操作,以下将详细介绍如何判断表或临时表是否存在。 判断数据表是否存在 判断数据表是否存在可以使用两种方法。 方法...

    汉字转拼音函数代码

    ### 汉字转拼音函数代码解析 ...综上所述,该函数通过一系列细致的设计与实现,有效地解决了汉字转拼音的问题,并特别针对多音字进行了优化处理。这对于需要处理大量中文文本的应用程序来说是非常有用的工具。

    Mysql中文汉字转拼音的实现(每个汉字转换全拼)

    在MySQL中实现中文汉字转拼音的功能,主要是为了方便在数据库查询和数据分析时处理中文文本,尤其是在没有全文索引或者需要进行复杂模糊匹配时。以下是一个简单的实现方法,它利用自定义函数来完成这一任务。 首先...

    sql方法用于汉字转换拼音

    在数据库操作过程中,有时候我们需要对中文进行处理,例如将汉字转换为拼音。本文将详细介绍一种使用SQL实现汉字到拼音转换的方法,并解释其工作原理及应用场景。 #### SQL函数:fun_getPY 该函数`[dbo].[fun_...

    拼音和五笔码转换函数

    这个资源包含了实现这种转换功能的数据库表和函数,用户只需正确地建立这些表和函数,并在SQL环境中执行相应的SQL语句,即可完成转换操作。 首先,我们要理解拼音和五笔码的概念。拼音是中国汉字的拉丁字母表示形式...

    sql 按拼音首字母排序

    标题“SQL按拼音首字母排序”以及描述中的关键词“SQL按拼音排序”,指向了一种特殊的数据排序需求:在数据库中,针对包含中文字符的字段,按照中文拼音的首字母进行排序。这在处理大量含有中文名称、地点等信息的...

    oracle汉字转拼音的函数代码

    综上所述,"oracle汉字转拼音的函数代码"涉及到的是在Oracle数据库中通过自定义函数实现汉字到拼音的转换,这需要对Oracle的PL/SQL编程、字符编码和语言处理有一定的了解。通过学习并运用这些代码,我们可以增强...

    oracle批量修改汉字转拼音首字母的函数

    在Oracle数据库环境中,批量修改汉字转拼音首字母的需求常常出现在数据处理、索引优化或特定查询场景中。这里我们将深入探讨如何实现这个功能,并提供相关的函数和方法。 首先,我们需要理解汉字转拼音首字母的基本...

    汉字转换拼音函数

    汉字转换拼音函数SQL语句,希望可以帮助需要的人!

    sql 汉字转拼音首字母代码

    sql 汉字转拼音首字母 代码 function --汉字转拼音首字母sql Create FUNCTION dbo.fnpbGetPYFirstLetter ( @str NVARCHAR(4000) )

    拼音识别汉字函数(一个SQL函数)

    总结来说,这个“拼音识别汉字函数”提供了一种在SQL环境下对汉字进行拼音处理的方法,使得在不支持汉字搜索的环境中可以通过拼音进行模糊匹配和过滤,极大地扩展了SQL在处理中文数据时的功能。同时,这个函数的实现...

    sql2000的自定义函数,传入汉字返回汉字拼音

    在SQL Server 2000中,开发自定义函数(UDF)可以帮助用户扩展数据库系统的功能,以满足特定的需求。本案例中,我们讨论的是一个用于处理汉字并返回其拼音的UDF。这个函数对于那些需要进行基于拼音的搜索、排序或者...

    sql server汉字转化为拼音首字母函数

    输入汉字字符参数,返回汉字拼音的首字母!

    oracle汉字转拼音package包-支持UTF8

    在Oracle数据库环境中,有时我们需要将汉字转换为对应的拼音,以便进行数据分析、索引优化或文本处理等操作。针对这一需求,有一个专门的Oracle Package包,它支持UTF8编码,能够帮助我们实现汉字到拼音的转换。这个...

    sqlserver汉字转拼音(绝对的经典直接创建可用)

    标题和描述均表明了这是一个关于SQL Server中实现汉字到拼音转换的解决方案。该解决方案被描述为“绝对的经典”,意味着它可能是一种广泛认可且效果良好的实现方式。同时,“直接创建可用”表明该功能无需复杂的配置...

    查看数据库表空间大小并排序

    查看SQLSERVER数据库表空间的大小,并且按照其大小进行排序

    postgresql汉字转拼音首字母函数,用于批量生成助记码、拼音码,包含两万多个汉字

    postgresql汉字转拼音首字母函数,用于批量生成助记码、拼音码,包含两万多个汉字。

Global site tag (gtag.js) - Google Analytics