日期:2014-05-18  浏览次数:20468 次

sql语句优化,请高手指点!!!!
各们大侠好!
 现在我在做一个数据验证功能。判断我的条码是否已经成功扫描到我的系统中
我的表:
  DISPR008L 
  DISPD00F
上面的表是记录成功扫描到系统的条码, DISPR008L,DISPD00F两个表联合才能产生一个条码,而且是唯一的

 ELEMS21L
  DISFD05L
这个是包含所有的条码 ELEMS21L, DISFD05L两个表联合才能产生一个条码,而且是唯一的
我现在的思路就是下面的代码
SQL code

select a.* from 
( select cqtele,qcddis,qstepn,qcdmac,qcdmap,celeme,(CELEME ||cast(QSTEPN as char(3))) as barcode from elems21l,disfd05l where qcddis=ccddis and crect0='R' and qcddis='001187' and  qstepn=950) as a
  where a.barcode not in (                           
select (scdel0||cast(lstepn as char(3))) as barcode from  dispr08l,dispd01l where sindtr=lindtr  and lcddis='001187' and qstepn=950)
 
我这样写要运行40秒才能做出来,各位大侠给指点一下。看怎么写才最优化,速度快



------解决方案--------------------
好象不是MS—SQL的
------解决方案--------------------
感觉没什么优化的
------解决方案--------------------
DISPR008L,DISPD00F两个表联合才能产生一个条码??

SQL code
最好给出完整的表结构,测试数据,计算方法和正确结果.

------解决方案--------------------
友情帮顶哈
------解决方案--------------------
加内存和CPU吧
------解决方案--------------------
看数据量,如果内表数据量大用IN会很慢,改成临时表试试
------解决方案--------------------
写这么一团代码,好用吗?别人看得懂?自己过一段时间看得懂?交接给别人,他看得懂?

DB2可以自动调节缓存,只要把SQL写得好一点就没问题,建议:
1、写个存储过程,这样可以预编译,提高成本估算效率
2、DB2的临时表非常好用啊,怎么不多利用一下呢。DECLARE GLOBAL TEMPORARY TABLE SESSION.aaa()3、用你的表DISPR008L DISPD00F 联合生成一个条码做主键的临时表 my,联合键尽量用到索引
用所有表ELEMS21L DISFD05L 联合生成一个条码做主键的临时表 all,联合键尽量用到索引

判断你的输入参数,是否即在my中,又在all中
------解决方案--------------------
不知道NOT IN 里面有多少符合结果的数据.
------解决方案--------------------
不懂,路过,帮顶!
------解决方案--------------------
DB2可以自动调节缓存,只要把SQL写得好一点就没问题,建议: 
1、写个存储过程,这样可以预编译,提高成本估算效率 
2、DB2的临时表非常好用啊,怎么不多利用一下呢。DECLARE GLOBAL TEMPORARY TABLE SESSION.aaa()3、用你的表DISPR008L DISPD00F 联合生成一个条码做主键的临时表 my,联合键尽量用到索引 
用所有表ELEMS21L DISFD05L 联合生成一个条码做主键的临时表 all,联合键尽量用到索引
------解决方案--------------------
嵌套用的太多了,用存储过程吧.
------解决方案--------------------
路过 帮顶
------解决方案--------------------
试着给表加索引,看看查询速度会不会快点!!
------解决方案--------------------
路过顶。1.用临时表吧!