sql语句优化(38分)

  • 主题发起人 主题发起人 hufei
  • 开始时间 开始时间
H

hufei

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高人: <br>&nbsp; &nbsp; 我在编程时用了这条sql语句 <br>update spxfmx set sfzx='''+sfzx1+''''+' &nbsp;where ywh='''+ywh1+''''+' and dm in (select dm from tc where tch='''+tch1+''''+')' <br>感觉执行速度慢,请问有什么方法优化一下 <br>谢谢!
 
Qry.SQL.Text:='update spxfmx set sfzx=:sfzx &nbsp;where ywh=:ywh and dm in (select dm from tc where tch=:tch)';<br>Qry.ParamByName('sfzx').AsString:=sfzx1;<br>Qry.ParamByName('ywh').AsString:=ywh1;<br>Qry.ParamByName('tch').AsString:=tch1;<br>Qry.Execute;<br>这样看起来直观点,但估计效率差不多,<br>如果使用存储过程的话,会快一点
 
觉得 where in 应该是速度下降的主要原因,有时对于大表,还会连接超时。<br><br>建议考虑一下其他方法,比如使用临时表,比如你这个问题:<br>(不知道你的用途,可能有不对的地方)<br>'select dm, x1='''+sfzx1+''',x2='''ywh1''' into ##temp_table<br>from tc where tch='''+tch1+''<br>ExecSQL...<br><br>update spxfmx a set sfzx=b.x1 from ##temp_table b<br>where a.dm=b.dm and a.ywh=b.x2<br>ExecSQL...<br><br>drop table ##temp_table<br>ExecSQL...
 
用存储过程吧,改为临时表处理,效率会提高的不只一点
 
dm in (select dm from tc where tch='''+tch1+''''+')' <br>换成storeprocedure试试
 
改成exsits就应该差不多了,
 
1.在查询分析器中按ctrl+i 让系统帮你优化一下索引.<br>2.把in的查询结构改为:<br>update t1 set a=t2.xx<br>from t1 join t2 on t1.a=t2.a<br>where XXX<br><br>这种会快些.这些可以优化决定性的速度<br>至于是否用存储过程,把前面优化好了,我想你就不会在乎那一点点的效率了.
 
总结一下:<br>1.再查询中需要用到where A in B<br>最好用 where exists (select 1 from B where A.XX=B.YY)来代替<br>2.你用的是更新,还有其他的一些类似的查询如果数据量比较大的,发现查询时间超过10秒的最好用把需要关联的子查询用临时表存储起来,这样的速度会快很多(原来我做的一个查询功能,刚开始是3分钟都没有反应,最后采用了临时表,用了7秒多)<br>3.对于更新或删除这些SQL语句,一定要注意自己的Where限定条件,即使是全部放开,也要加上 Where 1 = 1
 
后退
顶部