INSERT INTO T260_TMP_ARRIV_JS T260 
     ( 
  T260_CREATE_YMD, 
  T260_UPDATE_YMD, 
  T260_TRAN_KBN, 
  T260_TANTO_CD, 
  T260_TERM_CD, 
  T260_WAREH_CD, 
  T260_OWNER_CD, 
  T260_WORK_ID, 
  T260_STATES, 
  T260_KBN, 
  T260_SENDCONFIRM_FLG, 
  T260_FIRST_KBN, 
  T260_SLIP_NO, 
  T260_ACCEPT_NO, 
  T260_ITEM_CD, 
  T260_ORDER_UNITS, 
  T260_UNITS, 
  T260_GOOD_UNITS, 
  T260_BAD_UNITS, 
  T260_MEGIN_CD, 
  T260_REASON_STR, 
  T260_UNITS_SJ, 
  T260_FIRST_NM, 
  T260_FORM_NM, 
  T260_COST_PRICE, 
  T260_ITEM_NM, 
  T260_CK_STATUS) 
 SELECT 
  TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'), 
  TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'), 
  '1', 
  '91234567'   /*Param*/, 
  NULL, 
  '01'   /*Param*/, 
  '005'   /*Param*/, 
  '20090715033347'   /*Param*/, 
  CASE  
  WHEN T048.T048_ACCEPT_REPORT_FLG ='1' THEN '送信済'  
  WHEN T048.T048_SENDCONFIRM_FLG = '1' THEN '確定'  
  WHEN W1.T049_UNITS > 0 THEN '棚入済'  
  WHEN T048.T048_ARRIVAL_UNITS > 0 THEN '入荷検品済'  
  WHEN T048.T048_ARRIVAL_UNITS = 0 THEN '未検品'  
  END , 
  CASE  
  WHEN T048.T048_ORDER_UNITS = T048.T048_UNITS AND T048.T048_ORDER_UNITS = T048.T048_ARRIVAL_UNITS AND T048.T048_ORDER_UNITS = NVL(W1.T049_UNITS, 0) THEN '0'  
  WHEN T048.T048_ORDER_UNITS <> T048.T048_UNITS OR T048.T048_ORDER_UNITS <> T048.T048_ARRIVAL_UNITS OR T048.T048_ORDER_UNITS <> NVL(W1.T049_UNITS, 0) THEN '1'  
  END , 
  CASE  
  WHEN NVL(T048.T048_SENDCONFIRM_FLG,'0') = '0' THEN '未'  
  WHEN NVL(T048.T048_SENDCONFIRM_FLG,'0') = '1' THEN '済'  
  END , 
  CASE  
  WHEN NVL(T048.T048_FIRST_KBN,'0') = '1' THEN '初回入荷'  
  WHEN NVL(T048.T048_FIRST_KBN,'0') = '2' THEN '複回入荷'  
  END , 
   T048.T048_SLIP_NO, 
   T048.T048_ACCEPT_NO, 
   T048.T048_ITEM_CD, 
   T048.T048_ORDER_UNITS, 
   T048.T048_UNITS, 
   NVL(W2.GOODNUM, 0), 
   NVL(W2.BADNUM, 0), 
   T048.T048_MEGIN_CD, 
   M033.M033_REASON_STR, 
   NVL(W1.T049_UNITS, 0),  
   W3.M202_FIRST_NM, 
   M015.M015_FORM_NM, 
   T048.T048_COST_PRICE, 
   (M018_ITEM_NM1 || M018_ITEM_NM2) M018_ITEM_NM 
   ,'1' 
 FROM   
  T048_ARRIV_SCH T048  
 LEFT JOIN  
  M033_REASON M033 
 ON   
     M033.M033_REASON_KBN = '2' 
     AND T048.T048_MEGIN_CD = M033.M033_REASON_CD 
     AND M033.M033_TRAN_KBN  <> '3' 
 LEFT JOIN (SELECT  
 T047_ARRIVAL_MGT_ID, 
 T047_LINE_NO, 
 MAX(T047_WAREH_CD) T047_WAREH_CD, 
 MAX(T047_OWNER_CD) T047_OWNER_CD, 
 SUM(T047_GOOD_NUM) GOODNUM, 
 SUM(T047_BAD_NUM) BADNUM  
 ,MAX(T047_ARRIVAL_SCH_YMD) T047_ARRIVAL_SCH_YMD  
 FROM  
 T047_ARRIV_JS T047 
 WHERE  
 T047.T047_TRAN_KBN <> '3' 
 AND T047.T047_HISTORY_NO = '00' 
 AND T047.T047_CANCEL_FLG = '0' 
 AND T047.T047_WAREH_CD = '01'   /*Param*/ 
 AND T047.T047_OWNER_CD = '005'   /*Param*/ 
 GROUP BY 
 T047_ARRIVAL_MGT_ID, 
 T047_LINE_NO) W2  
 ON  
  T048.T048_ARRIVAL_MGT_ID = W2.T047_ARRIVAL_MGT_ID 
  AND T048.T048_WAREH_CD = W2.T047_WAREH_CD 
  AND T048.T048_OWNER_CD = W2.T047_OWNER_CD 
  AND T048.T048_LINE_NO = W2.T047_LINE_NO 
 LEFT JOIN  
 (SELECT 
  MAX(T048.T048_WAREH_CD) T048_WAREH_CD, 
  MAX(T048.T048_OWNER_CD) T048_OWNER_CD, 
  T048.T048_ARRIVAL_MGT_ID, 
  T048.T048_LINE_NO,   
  SUM(T049_UNITS) T049_UNITS    
 ,T049.T049_STORE_TR_YMD AS T049_STORE_TR_YMD   
 
 FROM   
  T048_ARRIV_SCH T048  
 LEFT JOIN  
  T047_ARRIV_JS T047  
 ON  
  T048.T048_ARRIVAL_MGT_ID = T047.T047_ARRIVAL_MGT_ID 
  AND T048.T048_WAREH_CD = T047.T047_WAREH_CD 
  AND T048.T048_OWNER_CD = T047.T047_OWNER_CD 
  AND T048.T048_LINE_NO = T047.T047_LINE_NO 
  AND T047.T047_TRAN_KBN <> '3' 
  AND T047.T047_HISTORY_NO = '00' 
  AND T047.T047_CANCEL_FLG = '0' 
 LEFT JOIN  
  T049_STORE_JS T049 
 ON   
  T047.T047_ARRIVAL_ID = T049.T049_ARRIVAL_ID  
  AND T048.T048_WAREH_CD = T049.T049_WAREH_CD 
  AND T048.T048_OWNER_CD = T049.T049_OWNER_CD 
  AND T049.T049_TRAN_KBN <> '3'   
     
 
 WHERE   
  T048.T048_TRAN_KBN <> '3'  
  AND T048.T048_WAREH_CD = '01'   /*Param*/  
  AND T048.T048_OWNER_CD = '005'   /*Param*/   
 AND T049_STORE_TR_YMD = '20090713'   /*Param*/ 
 
 GROUP BY 
  T048.T048_ARRIVAL_MGT_ID, 
  T048.T048_LINE_NO, 
  T049.T049_STORE_TR_YMD) W1 
 ON   
  T048.T048_ARRIVAL_MGT_ID = W1.T048_ARRIVAL_MGT_ID 
  AND T048.T048_OWNER_CD = W1.T048_OWNER_CD   
  AND T048.T048_WAREH_CD = W1.T048_WAREH_CD   
  AND T048.T048_LINE_NO = W1.T048_LINE_NO   
 LEFT JOIN  
  M018_ITEM M018  
 ON   
  T048.T048_ITEM_CD = M018.M018_ITEM_CD  
  AND T048.T048_WAREH_CD = M018.M018_WAREH_CD 
  AND T048.T048_OWNER_CD = M018.M018_OWNER_CD 
  AND M018.M018_TRAN_KBN <> '3'  
 LEFT JOIN  
  M015_FORM_CONT M015  
 ON   
  T048.T048_FORM_CD = M015.M015_FORM_CD  
  AND M015.M015_TRAN_KBN <> '3'  
 LEFT JOIN  
  (SELECT MAX(M202_FIRST_NM) M202_FIRST_NM,MAX(M202_WAREH_CD) M202_WAREH_CD,MAX(M202_OWNER_CD) M202_OWNER_CD,M202_FIRST_CD FROM M202_MD WHERE M202_TRAN_KBN <> '3' GROUP BY M202_FIRST_CD) W3  
 ON   
  SUBSTR(T048.T048_ITEM_CD,0,1) = W3.M202_FIRST_CD 
  AND T048.T048_WAREH_CD = W3.M202_WAREH_CD 
  AND T048.T048_OWNER_CD = W3.M202_OWNER_CD  
 
 WHERE   
  T048.T048_TRAN_KBN <> '3'  
  AND T048.T048_WAREH_CD = '01'   /*Param*/  
  AND T048.T048_OWNER_CD = '005'   /*Param*/   
 AND W1.T049_STORE_TR_YMD = '20090713'   /*Param*/ T048有2000条T049有11万T047只有几条  这样的检索要8分钟,不知道是为什么,麻烦大家帮我分析一下

解决方案 »

  1.   

    如果你是 window 上的 oracle  换到 linux 上。内存 用 8G 。像你这样的数据 随便跑。
      

  2.   

    对了忘记说环境了  windows2003 ora10g,请各位朋友帮我分析一下
      

  3.   

    内存就是8G的IBM的服务器,柜机里面放着的
      

  4.   

    好长的语句哦,把这条SQL中间的查询语句分开执行下,看看是哪段查询语句很慢,只优惠执行速度慢的语句就可以了
      

  5.   


    好像里面的表不 至 T047 T048 T049如果 T049 11万行,且是最大的表。就在其它表 T049 和其它表的 连接列上建索引。 在T049 上建索引 ,要建 联合索引. create index idx_x on table(f1,f2,f3)这样的。insert 逻辑太复杂了 能不能 优化一点。
     看不懂。 最好能分解成 不同的 insert 分批进行。
      

  6.   


    其他的M开头的表都是Master就是一些基础信息表,不是业务表了
      

  7.   

    在大表 和小表的连接列上 建个索引.
    如果有多个列 要联合 索引create index idx_x on 大表(f1,f2,f3)
    试试吧。
      

  8.   


    这个SQL的处理其实就是从多个表抽数据,插入到一个表中的处理,我认为好像不能多次插
      

  9.   

    create index idx_x on 大表(f1,f2,f3) f1,f2,f3 就是 表连接的那些关键字
      

  10.   

    有时要看 执行计划,建适当的索引。执行计划 看得多了就会看了。养成看 执行计划 的习惯。
    结合google 查里面的 index scan,needloop ,hash join  慢慢就能看懂了。 也就会优化了。
      

  11.   

    f1,f2,f3 就是 表连接的那些关键字
    仅仅是 大表里面的 字段对么
      

  12.   

    能分解最好分解,你应该也知道ORACLE的优化器对复杂SQL的优化功能可不怎么好,倒是对简单的SQL优化的很好。所以你这个这么长的SQL执行起来如果不慢了,就不会有人说oracle的优化功能不强了。
      

  13.   

    像你的这个写成存储过程,像通信行业的数据库的数据,那才交多呢。有的一张表就几千万条,这么弄就把服务器拖死了。你写SQL的原则就是让你的查询表的次数最少,那样可以在很大程度上提高查询的效率。不要重复的去扫描统一张表。
      

  14.   


    这个 一般 数据库自已选择的。
    这个就叫执行计划.可人为在 sql 里写入 oracle hint 来修改 执行计划.google oracle hint 就能找到相应的内容。
      

  15.   

    你这种只能这样写的sql, 一定数据库没设计好。设很差数据库,想在 sql 优化,就是重想新设计库。不可能,怎么改下sql ,速度就大副提高。
      

  16.   

    在高级SQL语句感觉在我们这找不到
      

  17.   

    前段日子不幸的我也在修改类似的sql
    支持下,很痛苦的
    横向尽量少写几张表,可以加快查询速度
    还有,就是逐段的排查
      

  18.   

       
    发表下自己的看法, 不一定正确。      M033.M033_REASON_KBN = '2' 
         AND T048.T048_MEGIN_CD = M033.M033_REASON_CD 
         AND M033.M033_TRAN_KBN  <> '3' 
    1.可以把关联条件写在前面,filter条件 写在后面, filter效果越好的越靠后
    2.尽量不用<> 不容易用到索引
    3. 不知道有在关联条件上建立索引没
    4.SUBSTR(T048.T048_ITEM_CD,0,1) = W3.M202_FIRST_CD 
      这个不要在字段上用索引, 或者你需要建立函数索引
      

  19.   

    发表一点看法:
    1、避免对索引字段使用计算公式,否则索引会失效
    2、少用left join,是否可以考虑用inner join代替
    3、对相关表进行分析(analyze table)
    4、考虑建适当索引
      

  20.   

    --改成 INSERT /*+ APPEND */ INTO ... 试试看
      

  21.   

    有些判断和选择可以用UPDATE语句来实现
      

  22.   

    我不知道你表中具体的数据分布情况,也不干乱推论!
    看你的sql。
    有两点:
    1、insert /*+append*/ 提示下加快插入!
    2、在select /*+rule*/ 你这么长的sql,Oracle解析就需要花费长时间!(不敢保证有效)
      

  23.   

    你还是好好分解一下SQL,然后些个proc来跑吧分成若干个小段会比用整个sql来完成要快
      

  24.   

    貌似连接了几个比较大的子查询你不如把子查询的数据插入临时表,然后再和之前的SQL连接看看 速度应该会上去