SQL批量查询替换速度慢,快来棒棒忙

问题描述

我的数据库中有个字段是NTEXT类型的。里面的数据长度大概是20万以上。然后我再循环另一个表中的某个字段替换与这个字段相匹配的值。速度超过了7秒。能不能提速啊。我在网上找了一些方法。好些都在七秒以上。需求大概跟下面的一样。usemastergoifobject_id('sp_replaceTextCol')isnotnulldropprocsp_replaceTextColgocreateproceduresp_replaceTextCol@tableNamesysname,@colNamesysname,@oldStrnvarchar(512),@newStrnvarchar(512),@whereStrnvarchar(200)=''/*万一昨天有收集我这个过程的同志注意了:存在严重bug,就是第一个字母不能是查找内容原来的替换语句是直接抄的(本来就是因为网上搜来的代码无法工作我才自己写,能少写几个单词我就必定抄),因为可以用所以就将就用了,结果早上睡醒忽然想到一个严重bug,于是起来改掉了上面说的内容谴责下自己抄别人代码的时候不注意阅读,也谴责下到处乱贴代码不做检查的网友然后这个修改还是有严重bug:查找内容不能是替换内容的一部分……使用charindex代替patindex可以修正此bug,不过会导致另一个bug:第4000个以后的文本不被处理使用substring可以完美解决此问题,不过需要注意substring不要把搜索字符串截断掉随便找种语言都基本上是不超过10行代码搞定的事情,在t-sql里却要多写那么多代码,于是懒得再写了。*//*作用:为一个表内的text做统一替换的存储过程版本:1.0缺点:慢,事实上还没办法支持任意表bug:查找内容不能是替换内容的一部分因为varchar的长度有限,当然还可以扩展,不过在sql2005里已经没这个问题了,懒得再写。realgz2008-05-06*/asbeginsetnocountondeclare@cursornvarchar(4000),@fetchnvarchar(4000),@insertnvarchar(4000),@wherenvarchar(4000)declare@replaceExecnvarchar(4000),@checkExecnvarchar(4000)declare@rpPtrvarbinary(16),@rpPostionint,@rpLenintifobject_id('tempdb..#key')isnotnulldroptable#key--获得主键列表selectsc.namekeyNameinto#keyfromsysobjectssojoinsysindexesidxonso.parent_obj=idx.idjoinsysindexkeysidkonso.parent_obj=idk.idandidx.indid=idk.indidjoinsyscolumnssconso.parent_obj=sc.idandidk.colid=sc.colidwhereso.xtype='PK'andso.parent_obj=object_id(@tableName)andidx.status&0x800>0if@@rowcount<1beginraiserror('表不符合要求或者没有这个表',12,1)returnend--增加键值列altertable#keyaddkeyValuesql_variantaltertable#keyaddprimarykey(keyName)--替换的长度select@rpLen=len(@oldStr),@oldStr='%'+@oldStr+'%'--游标声明语句select@cursor='declare#ccursorstaticforselecttextptr('+@colname+'),PATINDEX('''+replace(@oldStr,'''','''''')+''','+@colname+')'select@cursor=@cursor+',['+keyName+']'from#keyselect@cursor=@cursor+'from'+@tablename+''+@whereStr--为游标的提取生成语句select@fetch='',@insert='',@where=''select@fetch=@fetch+'declare@'+keyName+'sql_variant'+char(13)from#keyselect@fetch=@fetch+'fetchnextfrom#cinto@rpPtr,@rpPostion'select@fetch=@fetch+',@'+keyName+char(13)from#key--把游标提取出来的值放到临时表的语句select@insert=@insert+'insertinto#key(keyName,keyValue)'select@insert=@insert+'select'''+replace(keyName,'''','''''')+''',@'+keyName+'unionall'+char(13)from#keyselect@insert=left(@insert,len(@insert)-10)select@fetch=@fetch+@insert--每次获得游标行对应text指针的语句select@where='where1=1'select@where=@where+'and['+keyName+']=(selectkeyValuefrom#keywherekeyName='''+replace(keyName,'''','''''')+''')'from#key--改写的sqlselect@replaceExec='updatetext'+@tablename+'.'+@colname+'@rpPtr@rpPostion@rpLen@NewStr'--检查是否存在目标的sqlselect@checkExec='select@rpPostion=PATINDEX('''+replace(@oldStr,'''','''''')+''','+@colname+')from'+@tablename+@where--声明游标execsp_executesql@cursortruncatetable#keyopen#c--提取第一行execsp_executesql@fetch,N'@rpPtrvarbinary(16)output,@rpPostionintoutput',@rpPtroutput,@rpPostionoutput--print@fetchwhile@@fetch_status=0begin--只要@rpPostion>0证明还需要替换while@rpPostion>0begin--替换select@rpPostion=@rpPostion-1execsp_executesql@replaceExec,N'@rpPtrvarbinary(16),@rpPostionint,@rpLenint,@newStrnvarchar(512)',@rpPtr,@rpPostion,@rpLen,@NewStr--重新判断是否需要替换execsp_executesql@checkExec,N'@rpPostionintoutput',@rpPostionoutputendtruncatetable#key--提取下一行execsp_executesql@fetch,N'@rpPtrvarbinary(16)output,@rpPostionintoutput',@rpPtroutput,@rpPostionoutputendclose#cdeallocate#cifobject_id('tempdb..#key')isnotnulldroptable#keysetnocountoffendgousetempdbgocreatetabletest(idintidentity,bntextprimarykey(id))godeclare@xintselect@x=1while@x<1600begininsertintotest(b)selectreplicate(newid(),1000)select@x=@x+1endgoselect*fromtestgoexecsp_replaceTextCol'test','b','1','$$'goselect*fromtestgodroptabletestgo

解决方案

解决方案二:

解决方案三:
建立适当的索引,比如给主键建立索引用了游标的话,本来速度就会受影响
解决方案四:
应该是你列数据太多原因1.建索引,主键索引全文索引2.查询优化排序3.增加缓存设置4.临时表5增加内存(硬件方面的了)
解决方案五:
NTEXT是不适合建索引的建议考虑全文检索

时间: 2024-10-01 08:13:05

SQL批量查询替换速度慢,快来棒棒忙的相关文章

三星开发出全球速度最快嵌入式内存产品

[导读]这些内存产品的容量分为16GB.32GB和64GB等3种规格,可应用于下一代智能手机和平板电脑.三星开发出全球速度最快嵌入式内存产品 腾讯科技讯(林靖东)北京时间7月28日消息,据国外媒体报道,三星电子周五宣布它已经开始批量生产全球速度最快的嵌入式内存产品即业内首批eMMC 5.0内存设备,那些内存产品的容量分为16GB.32GB和64GB等3种规格,可应用于下一代智能手机和平板电脑.eMMC PRO内存条的接口速度高达400MB/s,可以非常快速地完成应用程序的启动和加载.这些芯片可以

sql 视图与直接查询的效率那个快 视图第二次查询速度与第一次查询速度是否有差别 等等

问题描述 sql 视图与直接查询的效率那个快 视图第二次查询速度与第一次查询速度是否有差别 等等 先说一下问这个问题的原因 刚接触数据库不到一年 视图这里疑问多多 跪求大牛讲解 问题如下 1 . 在同等查询语句的情况下视图的查询速度快 还是 效率一样 2. 一个视图在同等查询条件下 第一次查询的速度与第二次查询的速度是否有区别 3.一个索引视图与一个普通视图在不做其他运算的情况下 即select * from 视图 这种情况 效率是否有区别 解决方案 视图的效率略微高一些,毕竟不需要sql解析编

select-同样的sql只有查询的日期不同但执行速度相差很多

问题描述 同样的sql只有查询的日期不同但执行速度相差很多 SELECT messagestatusreceivernamemain.registnosendernameto_char(send_time) as send_timemobileriskcode from prplflsmssend ps left join prplflsmslog pl on pl.smssendid=ps.id prplflmaininfo main where trim(smstype)<>'' and

sql 调优 oracle 执行速度再快一点

问题描述 sql 调优 oracle 执行速度再快一点 select psf.pol_num, psf.bank_acct_num, cba_dda.bank_acct_nm from tbank_pos_slip_files psf, tclient_policy_links cpl_dda, tclient_bank_accounts cba_dda where cpl_dda.cli_num = cba_dda.cli_num and cpl_dda.bank_acct_typ = cba

使用SQL批量替换语句修改、增加、删除字段内容_MsSql

sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符. 命令总解:update 表的名称 set 此表要替换的字段名=REPLACE(此表要替换的字段名, '原来内容', '新内容') 如 UPDATE Whir_ProductRelese SET ReleseName=REPLACE(ReleseName,'http://www.maidq.com','http://maidq.com') 举例说明: 1)把backupfile表里url的字段内容里为htt

使用SQL批量替换语句修改、增加、删除字段内容

sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符. 命令总解:update 表的名称 set 此表要替换的字段名=REPLACE(此表要替换的字段名, '原来内容', '新内容') 如 UPDATE Whir_ProductRelese SET ReleseName=REPLACE(ReleseName,'http://www.maidq.com','http://maidq.com') 举例说明: 1)把backupfile表里url的字段内容里为htt

关于sql server查询语句的写法。

问题描述 关于sql server查询语句的写法. 怎样写一个查询语句select distinct ID from TrainTime order by ID select Station from TrainTime where S_No='1'order by ID select Stationfrom TrainTime where D_Time='-' order by ID 怎样把这3个查询语句写为一句啊,让查询查来的结果为这3列数据. 因为我想建一个表,为3列,列名为:列车车次.起

T-SQL命令在SQL Server查询中的运用

server 首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET STATISTICS TIME这二条被经常忽略的Transact-SQL命令的. 从表面上看,查询性能的调节是一件十分简单的事.从本质上讲,我们希望查询的运行速度能够尽可能地快,无论是将查询运行的时间从10分钟缩减为1分钟,还是将运行的时间从2秒钟缩短为1秒种,我们最终的目标都是减少运

MySQL中优化sql语句查询常用的30种方法

本篇文章是对MySQL中优化sql语句查询常用的30种方法进行了详细的分析介绍,需要的朋友参考下   1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以