+ -
当前位置:首页 → 问答吧 → 这个sql该如何优化?

这个sql该如何优化?

时间:2011-08-24

来源:互联网

CREATE TABLE tmp10(pk_f1 VARCHAR(10),pk_f2 VARCHAR(10),
pk_f3 VARCHAR(10),f1 VARCHAR(10),
f2 VARCHAR(10),f3 VARCHAR(10),
f4 VARCHAR(10),f5 VARCHAR(10),
YEAR VARCHAR(10),
startdt VARCHAR(10),
enddt VARCHAR(10));

CREATE TABLE tmp11(pk_f1 VARCHAR(10),pk_f2 VARCHAR(10),
pk_f3 VARCHAR(10),
t1 VARCHAR(10),
f1 VARCHAR(10),
f2 VARCHAR(10),f3 VARCHAR(10),
f4 VARCHAR(10),f5 VARCHAR(10),
count1 INT,
count2 INT,
YEAR VARCHAR(10),
startdt VARCHAR(10),
enddt VARCHAR(10));

SELECT tmp10.pk_f1,
        tmp10.pk_f2,
        tmp10.pk_f3,
        tmp10.f1,
        tmp10.f2,
        tmp10.f3,
        tmp10.f4,
        tmp10.f5,
        tmp10.YEAR,
        tmp10.STARTDT,
        tmp10.ENDDT,
        nvl((SELECT SUM(count1)
           FROM tmp11
          WHERE tmp10.pk_f1 = tmp11.pk_f1
            AND tmp10.pk_f2 = tmp11.pk_f2
            AND tmp10.pk_f3 = tmp11.pk_f3
            AND tmp10.STARTDT > tmp11.t1
            AND SUBSTR(tmp10.STARTDT, 0, 4) =
                SUBSTR(tmp11.t1, 0, 4)
            AND nvl(tmp10.f1,9999)=nvl(tmp11.f1,9999)
           AND nvl(tmp10.f2,9999)=nvl(tmp11.f2,9999)
           AND nvl(tmp10.f3,9999)=nvl(tmp11.f3,9999)
           AND nvl(tmp10.f4,9999)=nvl(tmp11.f4,9999)
           AND nvl(tmp10.f5,9999)=nvl(tmp11.f5,9999)),0) INIT_D,
          nvl((SELECT SUM(count2)
           FROM tmp11
          WHERE tmp10.pk_f1 = tmp11.pk_f1
            AND tmp10.pk_f2 = tmp11.pk_f2
            AND tmp10.pk_f3 = tmp11.pk_f3
            AND tmp10.STARTDT > tmp11.t1
            AND SUBSTR(tmp10.STARTDT, 0, 4) =
                SUBSTR(tmp11.t1, 0, 4)
            AND nvl(tmp10.f1,9999)=nvl(tmp11.f1,9999)
           AND nvl(tmp10.f2,9999)=nvl(tmp11.f2,9999)
           AND nvl(tmp10.f3,9999)=nvl(tmp11.f3,9999)
           AND nvl(tmp10.f4,9999)=nvl(tmp11.f4,9999)
           AND nvl(tmp10.f5,9999)=nvl(tmp11.f5,9999)),0) INIT_C,
              nvl((SELECT SUM(count1)
           FROM tmp11
          WHERE tmp10.pk_f1 = tmp11.pk_f1
            AND tmp10.pk_f2 = tmp11.pk_f2
            AND tmp10.pk_f3 = tmp11.pk_f3
            AND tmp10.endDT > tmp11.t1
            AND SUBSTR(tmp10.STARTDT, 0, 4) =
                SUBSTR(tmp11.t1, 0, 4)
            AND nvl(tmp10.f1,9999)=nvl(tmp11.f1,9999)
           AND nvl(tmp10.f2,9999)=nvl(tmp11.f2,9999)
           AND nvl(tmp10.f3,9999)=nvl(tmp11.f3,9999)
           AND nvl(tmp10.f4,9999)=nvl(tmp11.f4,9999)
           AND nvl(tmp10.f5,9999)=nvl(tmp11.f5,9999)),0) END_D,
          nvl((SELECT SUM(count2)
           FROM tmp11
          WHERE tmp10.pk_f1 = tmp11.pk_f1
            AND tmp10.pk_f2 = tmp11.pk_f2
            AND tmp10.pk_f3 = tmp11.pk_f3
            AND tmp10.endDT > tmp11.t1
            AND SUBSTR(tmp10.STARTDT, 0, 4) =
                SUBSTR(tmp11.t1, 0, 4)
            AND nvl(tmp10.f1,9999)=nvl(tmp11.f1,9999)
           AND nvl(tmp10.f2,9999)=nvl(tmp11.f2,9999)
           AND nvl(tmp10.f3,9999)=nvl(tmp11.f3,9999)
           AND nvl(tmp10.f4,9999)=nvl(tmp11.f4,9999)
           AND nvl(tmp10.f5,9999)=nvl(tmp11.f5,9999)),0) END_C
   FROM tmp10
  WHERE TMP10.STARTDT <> TMP10.ENDDT AND tmp10.year<>'0002'
  ORDER BY 1,2,3,4,5,6,7,8,9,10
  
  tmp10数据量约400W行,tmp11数据量约800多W行,正常情况下执行查询结果插入新表应该有多长时间啊,为什么上述执行一晚上数据都没装载完。

[ 本帖最后由 zhangqi0718 于 2011-8-24 12:11 编辑 ]

作者: zhangqi0718   发布时间: 2011-08-24

作者: 酷酷小山贼   发布时间: 2011-08-25