一条SQL语句的优化,在线等(急),多谢各位了.

sdl_goahead 2007-08-21 04:45:43
SELECT A.WAREHOUSECD WAREHOUSECD,
A.COMPANYCD COMPANYCD,
A.SHIPDATE SHIPDATE,
A.DOCUMENTNUMBER DOCUMENTNUMBERA,
A.DELIVNAME DELIVNAME,
A.SSZIPCODE SSZIPCODE,
(SELECT T.TRANSAMT
FROM EDIFREINVRATEMASTERRDC T
WHERE T.BUSI = TRIM(A.COMPANYCD) AND
T.RATEYY = TO_CHAR(A.SHIPDATE, 'YYYY') AND
T.SSZIPCODE = TRIM(A.SSZIPCODE) AND ROWNUM = 1) TRANSAMT,
A.NOTES NOTES,
A.SOTYPE SOTYPE,
DECODE(B.URGENT, 'Y', B.URGENT, 'N') URGENT,
B.LIACODE LIABILITYCD,
B.REACODE REASONCD,
B.MATERIAL ITEMCD,
B.ACTQUANTITY ACTQUANTITY,
B.ACCQUANTITY ACCQUANTITY,
FX_GETTOTMEASUREMENT(B.MESSAGERECEIVERIDENTIFIER,
B.MATERIAL,
B.ACTQUANTITY) CBM,
FX_GETTOTMEASUREMENT(B.MESSAGERECEIVERIDENTIFIER,
B.MATERIAL,
B.ACCQUANTITY) ACC_CBM,
Z.BASE_AMT BASE_AMT,
Z.BASE_AMT /
nvl((select count(*)
FROM EDIPODDLYRDC W, EDIPODDLYMATLISTRDC X
WHERE W.MESSAGENUMBER = X.MESSAGENUMBER AND W.ACTFLG = '1' AND
W.STS = 900 and W.RDREFERENCENUMBER = A.otherrefno1),
1) as avg_baseamt,
Z.ADD_AMT ADD_AMT,
MFWAREHOUSE.SNAME mfwarehouse_sname,
FX_GETCOMPANYNAME(A.COMPANYCD) mfcompany_sname,
B.lot1 lot1,
z.Documentdate Documentdate,
Z.DOCUMENTNUMBER DOCUMENTNUMBERZ
FROM TRSO A,
EDIOUTDLYRDC D,
V_EDIFRINVAMT Z,
(SELECT W.MESSAGERECEIVERIDENTIFIER,
W.RDREFERENCENUMBER,
W.URGENT,
W.LIACODE,
W.REACODE,
X.MATERIAL,
X.ACTQUANTITY,
X.ACCQUANTITY,
X.NAME lot1
FROM EDIPODDLYRDC W, EDIPODDLYMATLISTRDC X
WHERE W.MESSAGENUMBER = X.MESSAGENUMBER AND W.ACTFLG = '1' AND
W.STS = 900) B,
MFWAREHOUSE
WHERE A.otherrefno1 = D.DOCUMENTNUMBER AND
A.otherrefno1 = B.RDREFERENCENUMBER AND
A.WAREHOUSECD = MFWAREHOUSE.WAREHOUSECD AND
A.otherrefno1 = Z.SAMSUNGREFERENCENUMBER AND Z.GUBUN = 'FR' AND
A.ACTFLG = '1' AND A.STS = 900 AND D.ACTFLG = '1' AND D.STS = 900 AND
A.SOTYPE IN ('NOR', 'NOF', 'SMP', 'TEI') AND
A.WAREHOUSECD IN ('SH001', 'BJ001') AND
(a.warehousecd = 'BJ001' AND
a.shipdate >= to_date('2007/08/11 00:00', 'YYYY/MM/DD HH24:MI') AND
a.shipdate <= to_date('2007/08/21 00:00', 'YYYY/MM/DD HH24:MI') AND
to_date(Z.DOCUMENTDATE, 'YYYYMMDD') >=
to_date('2007/08/11 00:00', 'YYYY/MM/DD HH24:MI') AND
to_date(Z.DOCUMENTDATE, 'YYYYMMDD') <=
to_date('2007/08/21 00:00', 'YYYY/MM/DD HH24:MI'))
...全文
247 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rightyeah 2007-09-04
  • 打赏
  • 举报
回复
看的眼晕,帮你up吧
lzheng2001 2007-08-24
  • 打赏
  • 举报
回复
关键是要建索引,尤其是在where后面用到的关键字段.
wuhaifeng558 2007-08-24
  • 打赏
  • 举报
回复
dongquestion(书山有路勤为径) ( ) 信誉:100 2007-8-22 9:24:58 得分: 0



给你个提示:
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
最好不要在条件上使用to_char,to_date等函数。



WOFEIYANG 2007-08-23
  • 打赏
  • 举报
回复
首先在shipdate 或DOCUMENTDATE字段上,加聚集索引.在warehousecd ,SOTYPE 上加非聚集索引.
在SQL语句中,尽量少用IN,在落在某个日期间的数据最好用:dateiff()
dongquestion 2007-08-22
  • 打赏
  • 举报
回复
给你个提示:
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
最好不要在条件上使用to_char,to_date等函数。
LamarChen 2007-08-21
  • 打赏
  • 举报
回复
把要用到的表的关联搞清楚先。。。
优化的目的就是要让电脑执行程序的速度效率高
满足了这点,一切就OK啦!
ttjacky 2007-08-21
  • 打赏
  • 举报
回复
注意:后面这四个where条件严重影响性能,先想办法把等号左边的to_date函数去掉吧

to_date(Z.DOCUMENTDATE, 'YYYYMMDD') >=
to_date('2007/08/11 00:00', 'YYYY/MM/DD HH24:MI') AND
to_date(Z.DOCUMENTDATE, 'YYYYMMDD') <=
to_date('2007/08/21 00:00', 'YYYY/MM/DD HH24:MI'))
然后再考虑其它部分

609

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧