0 0

db2 9.7版本 200万数据group by 十秒,要怎么优化,望指导0

表结构
CREATE TABLE "STAT_TAXPRESTAT"
(
   SEQNO                BIGINT                 NOT NULL GENERATED BY DEFAULT AS IDENTITY
      (
          START WITH 1,
          INCREMENT BY 1
      ),
   "MONTH"              CHAR(6)                NOT NULL,
   "CORPNAME"           VARCHAR(60),
   "CORPCODE"           VARCHAR(20)            NOT NULL,
   "TRENAME"            VARCHAR(60),
   "TRECODE"            VARCHAR(10)            NOT NULL,
   "ORGNAME"            VARCHAR(60),
   "ORGCODE"            VARCHAR(12)            NOT NULL,
   "BUDGETTYPENAME"     VARCHAR(60),
   "BUDGETTYPE"         CHAR(1)                NOT NULL,
   "BUDGETSUBJECTNAME"  VARCHAR(60),
   "BUDGETSUBJECTCODE"  VARCHAR(30)            NOT NULL,
   "BUDGETLEVELNAME"    VARCHAR(60),
   "BUDGETLEVELCODE"    CHAR(1)                NOT NULL,
   "ECONATNAME"         VARCHAR(60),
   "ECONATCODE"         VARCHAR(3),
   "CITYNAME"           VARCHAR(60),
   "CITYCODE"           VARCHAR(2),
   "REGIONNAME"         VARCHAR(60),
   "REGIONCODE"         VARCHAR(4),
   "INDCATNAME"         VARCHAR(60),
   "INDCATCODE"         VARCHAR(5),
   "INDSECNAME"         VARCHAR(60),
   "INDSECCODE"         VARCHAR(3),
   "BANKNAME"           VARCHAR(60),
   "BANKNO"             VARCHAR(12),
   "TRAAMT"             DECIMAL(15,2)          NOT NULL,
   "NUM"                INTEGER,
   CONSTRAINT "P_IDENTIFIER_1" PRIMARY KEY (SEQNO)
);

CREATE UNIQUE INDEX "STAT_TAXPRESTAT_PK" ON "STAT_TAXPRESTAT" (
   SEQNO                ASC
);

--==============================================================
-- Index: "STAT_TAXPRESTAT_CO"
--==============================================================
CREATE INDEX "STAT_TAXPRESTAT_CO" ON "STAT_TAXPRESTAT" (
   "CORPCODE"           ASC
);

--==============================================================
-- Index: "STAT_TAXPRESTAT_BU"
--==============================================================
CREATE INDEX "STAT_TAXPRESTAT_BU" ON "STAT_TAXPRESTAT" (
   "BUDGETSUBJECTCODE"  ASC
);

--==============================================================
-- Index: "STAT_TAXPRESTAT_TR"
--==============================================================
CREATE INDEX "STAT_TAXPRESTAT_TR" ON "STAT_TAXPRESTAT" (
   "TRECODE"            ASC
);

--==============================================================
-- Index: "STAT_TAXPRESTAT_OR"
--==============================================================
CREATE INDEX "STAT_TAXPRESTAT_OR" ON "STAT_TAXPRESTAT" (
   "ORGCODE"            ASC
);

--==============================================================
-- Index: "STAT_TAXPRESTAT_MO"
--==============================================================
CREATE INDEX "STAT_TAXPRESTAT_MO" ON "STAT_TAXPRESTAT" (
   "MONTH"              ASC
);

--==============================================================
-- Index: "STAT_TAXPRESTAT_BU"
--==============================================================
CREATE INDEX "STAT_TAXPRESTAT_BU" ON "STAT_TAXPRESTAT" (
   "BUDGETLEVELCODE"    ASC
);

--==============================================================
-- Index: "STAT_TAXPRESTAT_EC"
--==============================================================
CREATE INDEX "STAT_TAXPRESTAT_EC" ON "STAT_TAXPRESTAT" (
   "ECONATCODE"         ASC
);

--==============================================================
-- Index: "STAT_TAXPRESTAT_AM"
--==============================================================
CREATE INDEX "STAT_TAXPRESTAT_AM" ON "STAT_TAXPRESTAT" (
   "TRAAMT"             ASC
);

--==============================================================
-- Index: "STAT_TAXPRESTAT_BA"
--==============================================================
CREATE INDEX "STAT_TAXPRESTAT_BA" ON "STAT_TAXPRESTAT" (
   "BANKNO"             ASC
);


查询SQL:
select
   a.trecode as trecode,
   a.trename as trename,
   a.Month as Month,
   sum(a.num) as num,
   sum(a.TraAmt) as traamt
   from STAT_TaxPreStat a
   group by a.trecode,
   a.trename,
   a.Month

加了组合索引后4秒左右
 CREATE INDEX "TAXPRESTAT_TRE_AMT" ON "STAT_TAXPRESTAT" (
   "TRECODE","TRENAME","MONTH"
);


这个查询没有查询条件,是对所有的数据按trecode分组的,最终出来结果是几十条,有没什么方法优化到一秒以内?
2013年4月08日 20:24

3个答案 按时间排序 按投票排序

0 0

汗~~~
   sum(a.num) as num,
   sum(a.TraAmt) as traamt
有这么两句,始终会去全表扫描的。
把这两字段加入索引,可以全索引扫描,不进行表扫描;index only scan。
开销应该至少会少一半,对于表字段越多的优化越多。

CREATE INDEX "TAXPRESTAT_TRE_AMT" ON "STAT_TAXPRESTAT" (
   TRECODE,TRENAME,MONTH,num,TraAmt
);

CPU,缓冲池不差的话,降低到1秒应该不难。

2013年4月10日 23:16
0 0

表有没有做过runstats?

2013年4月09日 20:59
0 0

新建一张表,存储统计概览(查询的时候直接查该表),在原表加触发器,数据有变动更新概览表,把压力分散到每一次操作。

2013年4月09日 09:55

相关推荐

Global site tag (gtag.js) - Google Analytics