SlideShare a Scribd company logo
1 of 71
数据库系统优化管理研讨沙龙-上海站
    ITPUB ChinaUnix IXPUB主办
Ⅰ

Ⅰ

Ⅰ

Ⅰ

Ⅰ

Ⅰ

Ⅰ

Ⅰ

Ⅰ

Ⅰ   数据库系统优化管理研讨沙龙-上海站
        ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站
    ITPUB ChinaUnix IXPUB主办
Ⅰ




  •   公司名称 : EN-CORE CO., LTD. (www.en-core.com, www.en-core.com.cn)
  •   公司代表 : 李华植
  •   公司地址 : Allianz Tower 3F,45-21, Yeouido-dong, Yeongdeugpo-gu, Seoul, korea
  •   联系电话 : 82-2-754-7301(FAX 82-2-754-7305)
  •   成 立 日 : 1997年 11月 13日
  •   业    种 : IT
  •   经营范围 : 咨询服务/ 软件开发,书籍出版/书籍销售/技术培训



数据库系统优化管理研讨沙龙-上海站         ITPUB ChinaUnix IXPUB主办
Ⅰ




                                                                                                 ™
               Consulting                   Solution                  Academy


    Consulting Service      EN-CORE DataWare™                培 训 课 程                  信 息 服 务

      Data Architecture     DataWare™ DA               DA                       Lab

         Database           DataWare™ Repository       Modeling                 News

        Data Quality        DataWare™ IDO              Tuning                   Education

       Data Upgrade         DataWare™ DQ               海量数据库解决方案                Books

     Data Governance        DataWare™ Impact           SQL                      Open Club

                            DataWare™ Meta                                      New Tech
         综合服务                                                   DA Master
                            DataWare™ ETL                                       Recruiting
        Next System
                                                             企业委托培训
     System Monitoring                                                                    书籍出版
          ISP/EAP                                                               书籍

          DW / BI                                                               Reports

            BAM                                                                           国际出版


数据库系统优化管理研讨沙龙-上海站               ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站
    ITPUB ChinaUnix IXPUB主办
Ⅰ




                                                                               <= Ford
                                                                               > Ford




                                                       <= Clark                                       <= Hunt
                                                       > Clark                                        > Hunt




                                              Allen 0007          Davis 0002             Green 0006             Jones 0004
                                              Clarke 0003         Ford 0005              Hunt 0008              King 0001




数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站
    ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
最佳索引设计步骤


                                                                最佳索引设计步骤

                                            SQL Parsing   1
                                                               从应用程序中搜集全部SQL


                                            设计索引          2    以表为单位从SQL中搜集读取
                                                                 类型并对其进行分析

                                                          3
                                                                 创建能够满足所有
                                                                 读取要求的最佳索引

                                                          4    以新创建的最佳索引为依据,
                                                               确认优化器制定的执行计划

                                                          5
                                                              修优未能正确使用最佳索引的SQL




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
DeptNo    12%                     Sal_Date   2010-01-01    ~   2010-12-31          Search


             DeptNo            Ename           EmpNo              Job              Sal_Tot       Com_Tot          ▲
          12345            KING             7839             PRESIDENT              781,360.30        10,600
          12345            SCOTT            7788             ANALYST                268,158.15            6,100
                                                                                                                  ▼
          12345            FORD             7902             MANAGER                101,682.93            4,500




        SELECT deptno, y.ename, y.empno, y.job, sal_tot, comm_tot
         FROM
           ( SELECT empno, sum(sal_amt) sal_tot, sum(comm) comm_tot
              FROM salary s
             WHERE s.deptno like ’12%’
               AND s.sal_date between ‘20100101’ and ‘20101231’
             GROUP BY empno ) x, employee y
        WHERE y.empno = x.empno

        ■ 为了提高执行速度而将DEPTNO列添加到salary表中,索引的构成是(deptno + sal_date)
        ■ 满足Sal_Date查询条件的数据量越大,通过索引查询的行数就越多,执行速度就越慢

数据库系统优化管理研讨沙龙-上海站             ITPUB ChinaUnix IXPUB主办
1      2

                     DeptNo    12%              Sal_Date   2005-01-01   ~      2005-12-31             Search


                           DeptNo               Ename
                                                Ename      EmpNo
                                                           EmpNo            Job
                                                                             Job            Sal_Tot
                                                                                            Sal_Tot    Com_Tot
                                                                                                       Com_Tot     ▲
                   12345                   SMITH
                                           KING            7369
                                                           7839     CLERK
                                                                    PRESIDENT           781,360.30
                                                                                         52,831.32        10,600
                                                                                                           2,200
                   12643                   MARTIN
                                           SCOTT           7900
                                                           7788     SALESMAN
                                                                    ANALYST            113,863.15
                                                                                       268,158.15          4,100
                                                                                                           6,100
                                                                                                                   ▼
                   12742                   WARD
                                           FORD            7521
                                                           7902     SALESMAN
                                                                    MANAGER            156,167.01
                                                                                       101,682.93          5,200
                                                                                                           4,500




      SELECT deptno into :v_deptno       SELECT deptno, y.ename, y.empno, y.job, x.sal_tot, x.comm_tot
       FROM dept                         FROM
      WHERE deptno like ’12%’               ( SELECT empno, sum(sal_amt) sal_tot, sum(comm) comm_tot
                                               FROM salary s
                                              WHERE s.deptno = :v_deptno
                                                AND s.sal_date between ‘20100101’ and ‘20101231’
                                              GROUP BY empno ) x, employee y
                                         WHERE y.empno = x.empno




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
select col1, col2
         from AT              Lock                                                 col1 col2
        where col1 = '20'            处理
                                           commit
          and rownum = 1
        for update;                                                                10      AA

                                                                                   20      AB
        select col1, col2       失
                                     再尝试    处理        commit                        20     AB
         from AT                败
        where col1 = '20'                                                          20     CM
          and rownum = 1
        for update;                                                                      …
                                失           失
           from AT                   再尝试    败
                                                     再尝试        处理       commit     20     SK
          where col1 = '20'     败
            and rownum = 1                                                          21     BA
          for update;
   .
   .            .
                .                                                                  AT table
   .            .
        select col1, col2
         from AT
        where col1 = '20'
          and rownum = 1
                                失
                                败    再尝试
                                            失
                                            败
                                                     再尝试       .......      处理    commit

        for update;


数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
CREATE SEQUENCE squ
                             select squ.nextval into :A from dual;
            start with   1   select rnum, col1, col2
            increment by 1    from (select rownum as rnum, col1, col2
            maxvalue    10            from AT
                                     where col1 = '20')                 col1 col2
            cycle
                             where rnum = :A
            cache        9      and rownum = 1;
                                                                        10    AA

                                                                        20    AB
                             select squ.nextval into :A from dual;
                             select rnum, col1, col2                    20    AB
                              from (select rownum as rnum,col1,col2
         序列号                          from AT                           20    CM
                                     where col1 = '20')                      …
                             where rnum = :A
                                and rownum = 1;
                                                                        20    SK
                                 where rnum = :A
                                   and rownum = 1;
                                           ………..
                                           .
                                                                        21    BA


                             select squ.nextval into :A from dual;      AT table
            .
            .                select rnum, col1, col2
            .                 from (select rownum as rnum,col1,col2
                                      from AT
                                     where col1 = '20')
                             where rnum = :A
                                and rownum = 1;



数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主
区号 开始号码            结束号码         个数 使用与否   区号    使用与否 个数

                                                     123    0000         0000        1    O    123    O   1
                                                     123    0001         0004        4    X    123    X   4
                                                     123    0005         0006        2    O    123    O   2

              区号    序列号      使用与否                    123    0007         0009        3    X    123    X   3

              123   0000      O                      123    0010         0010        1    O    123    O   1

              123   0001      X     1                123    0011         0012        2    X    123    X   2

              123   0002      X     2                123    0013         0014        2    O    123    O   2

              123   0003      X                      123    0015         0021        7    X    123    X   7
                                    3
              123   0004      X                      123    0022         0022        1    O    123    O   1
                                    4
              123   0005      O     0                123   ……..                           …    123    …

              123   0006      O     0                123    9990         9999        9    X    123    X   9

              123   0007      X     1
              123   0008      X     2

              123   0009      X     3

              123   0010      O     0

              123   0011      X     1

              123   0012      X     2

              123   0013      O     0

              123   0014      O     0
              123   0015      X     1

              123   0016      X     2

              123   0017      X     3

              123   0018      X     4

              123   0019      X     5                区号 开始号码            结束号码         个数   .
              123   0020      X     6
                                                     123   ..........   ..........   …    …
              123   0021      X                      123    0015         0020        6    O
              123   0022      O                      123    0021         0021        1    X
              123   ……..      …                      123    0022         0022        1    O
              123   9999      X                      123   ……….         ……….         …    …




数据库系统优化管理研讨沙龙-上海站          ITPUB ChinaUnix IXPUB主办
合同编号 管理部门      结果
                O      O    Index Scan
                O      X    Index Scan
                X      O     Full Scan




数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
call     count        cpu    elapsed   disk query current      rows
                                   ------- ------   -------- ---------- ------ ------ --------   -----
                                   Parse       20       0.81    1848.30      0      0        0       0
                                   Execute     20       0.01       0.01      0      0        0       0
                                   Fetch       20       0.74       1.58    114 15693         0      50
                                   ------- ------   -------- ---------- ------ ------ --------   -----
                                   total       60       1.56    1849.89    114 15693         0      50




数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
Ⅰ




                 Literal SQL – Hard Parsing                                 Literal SQL
                                                              select * from tab where id = 1
   Connection con = null;                                     select * from tab where id = 2
   Statement stmt = null;                                     select * from tab where id = 3
   …                                                          select * from tab where id = 4
   String query = "select * from tab where id = " + id;       select * from tab where id = 5
   …                                                          select * from tab where id = 6
                                                                                                          Parsing
   stmt = con.createStatement(stmt);                          select * from tab where id = 7
                                                                                                          代价较大
   ResultSet rs = stmt.executeQuery();                        select * from tab where id = 8
                                                              select * from tab where id = 9
                                                              select * from tab where id = 10
                                                                                …
  须要对所有的SQL语句进行Hard parsing
                                                              select * from tab where id = 99999




          Static SQL(with Bind variable) – Soft Parsing                     Static SQL
                                                              select * from tab where id = ?
   Connection con = null;                                                                       Bind
   PreparedStatement pstmt = null;                                                             Variable
   …                                                                                                  1
                                                                                                      2
   String query = "select * from tab where id = ?";                                                   3
   pstmt = con.prepareStatement(query);                                                               4
   pstmt.setInt(1, id);                                                                               5
                                                                                                      6
   ResultSet rs = pstmt.executeQuery();
                                                                                                      7
                                                                                                      8
                                                                                                      9

  最少须要执行1次Hard parsing,soft parsing可以被反复执行                                                           10
                                                                                                     …
                                                                                                 99999




数据库系统优化管理研讨沙龙-上海站                   ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站
  ITPUB ChinaUnix IXPUB主办
.
     .
     .
                                                           .
                                                           .
                                                           .


                                 No      Data
                                   1     AAAA
                                   2     BBBB     每次邀请的
                                   3     CCCC     数据为25行
                                   4     DDDD
                                   5     EEEE
                      全部数据为        6     FFFF
                       100万行       7     GGGG
                                   8     HHHH
                                   9       IIII
                                  10      JJJJ
                                  11     KKKK
                                  12      LLLL
                                   ..      …
                               1000000    ZZZ



数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
• 确认查询结果周围数据时使用的留言板
                                              • 按照顺序确认程序结果
                                              • 用户没有必要选择页数




 • 一般型WEB留言板
 • 查询的数据被显示在多个页中
 • 每次提供多页,例如:在这里以10页为单位向用户提供结果
 • 用户可以随意选择页数


数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
首页                       输入 : 顾客姓名
SELECT /*+ index(w cust_name_idx) */
      ROWIDTOCHAR(rowid) rid, cust_name,…
 FROM cust_table w
WHERE :v2 = 'FIRST' AND cust_name like :v1 || '%'
  AND rownum <= 25                                                                                   查询 : ‘>=‘
UNION ALL
SELECT /*+ use_concat index (x cust_name_idx) */
      ROWIDTOCHAR(rowid) rid, cust_name,…                 下一页
 FROM cust_table x
                                                                                          上一页 / 下一页
WHERE :v2 = 'NEXT'
  AND (cust_name > :v3 OR
      (cust_name = :v3 AND rowid > CHARTOROWID(:v4)))
  AND cust_name like :v1||'%'                                        索引 : cust_name_idx(cust_name)
  AND rownum <= 25                                                        non-unique
UNION ALL
SELECT /*+ use_concat index_desc(y cust_name_idx) */
      ROWIDTOCHAR(rowid) rid, cust_name,…
 FROM cust_table y
WHERE :v2 = 'PREV'
                                                          上一页
  AND (cust_name < :v3 OR
      (cust_name = :v3 AND rowid < CHARTOROWID(:v4)))
  AND cust_name like :v1 || '%'
  AND rownum <= 25
ORDER BY cust_name, rid;




数据库系统优化管理研讨沙龙-上海站                          ITPUB ChinaUnix IXPUB主办
1    341
                                                            2    321
                                                            3    301
                                                            4    281
                                                            …
                                                            8    201
                                                            9    181
                        每页 : 20行                            10   161

                                                            11 141
                                                            12 121
                                                            13 101
                                                            14 81
                                                            …
                                                            18   1
                              每个set : 10页




   • SQL解决方案                                • 开始点 : 留言板编号(bbs_id) +
      ① 在进行SET移动时,需要查找页的列表和开始点                    留言日期(cre_dt) + 留言编号(num)
      ② 查找具有特定开始点的页




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
处理目录列表的SQL                                                 处理特定页的SQL
   SELECT rnum, bbs_id, cre_dt, num
   FROM ( SELECT /*+ USE_CONCAT INDEX_DESC(a bbs_idx1) */                 SELECT /*+ USE_CONCAT
                                                                                   INDEX_DESC(a bbs_idx1) */
              ROWNUM rnum, bbs_id, cre_dt, num …………… (a)
                                                                              bbs_id, cre_dt, num, c_text
          FROM BILLBOARD a
                                                                           FROM BILLBOARD a
         WHERE :sw = 'NEXT'
                                                                          WHERE bbs_id = :bbs
          AND bbs_id = :v_bbs
                                                                           AND ( cre_dt < :v_init_dt
           AND ( cre_dt < :v_init_dt
                                                                            OR ( cre_dt = :v_init_dt
            OR ( cre_dt = :init_dt AND num <= :v_num) )
                                                                                      AND num <= :v_num) )
           AND ROWNUM <= 201
                                                                           AND ROWNUM <= 20;
         UNION ALL
        SELECT /*+ USE_CONCAT INDEX_ASC(a bbs_idx1) */
            ((20*10)+2 - ROWNUM) rnum,bbs_id,cre_dt,num …… (b)
         FROM BILLBOARD a
       WHERE :sw = 'PREV'
          AND bbs_id = :v_bbs
          AND (cre_dt > :v_init_dt
           OR (cre_dt = :v_init_dt AND num >= :v_num ) )
          AND ROWNUM <= 201
       )
   WHERE rnum IN (1, 21, 41, 61, 81, 101,121, 141, 161, 181, 201)…… (c)
   ORDER BY rnum ;




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站
Declare Cursor



                                Fetch Cursor



                                    IF


                      SELECT                    SELECT



                      INSERT                    SELECT



                                                UPDATE




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
Cursor SQL 优化方案
               Declare Cursor

                                         改变表连接方式 : Hash, NL Join, …
                                         改变表连接顺序
               Fetch Cursor
                                         改变读取方式 : Full Scan, Index Scan, …
                                         使用并行处理方式

                     IF




      SELECT                    SELECT

                                                          Loop SQL 优化方案

      INSERT                    SELECT

                                         对个别SQL进行优化 :修改和追加索引
                                         应用Array Process
                                UPDATE   将LOOP循环中的SQL语句向Cursor SQL合并




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
FLD1    NUM1            FLD2   NUM2                           TABLE2.ROWID   NUM1   NUM2

   DATA1    100   O   X                                           ROWID3        300    100
                                         .....       .........
   DATA2    200   O   X                  .....   S   .........
                                                                  ROWID4         70    200
                                                                  ........      ...    ...
                                         .....       .........
   DATA3    300   O   O   DATA3   100
                                         .....   O   .........
                                                                  ROWIDn        ...    ...
   DATA4    70    O   O   DATA4   200    .....       .........
                                         .....   R   .........    NULL          100
   ………..    ….    ……….    ………..    ….    .....       .........    NULL          200
                                         .....   T   .........
   DATAn    600   O   O   DATAn   900                             ........      ...    ...
                                         .....       .........
                                                                                 ...   ...
                                                                  NULL
     TABLE1                  TABLE2                                          BUFFER




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
#define ARRAY_SIZE 100
       …
       EXEC SQL DECLARE C1 CURSOR FOR
           SELECT a.num1, a.fld1, b.rowid FROM TABLE1 a, TABLE2 b WHERE a.fld1 = b.fld2(+)
           ORDER BY B.ROWID ;
       …
       EXEC SQL OPEN c1;
       while (1)
       {
         EXEC SQL FETCH c1 INTO :v_num1,:v_fld1,:v_rowid,:i_rowid;
         loop = sqlca.sqlerrd[2] - num_ret;
         num_ret = sqlca.sqlerrd[2]; /* Reset the number */
         /* rowid is null at the fist row fetched */
         if ( i_rowid[0] == -1 ) {
               process_up_ins(0);            /* INSERT ONLY */
         } else {
           /* rowid is null at the last row fetched */
           if ( i_rowid[loop - 1] == -1 ) {
               process_up_ins(1);       /* UPDATE AND INSERT BOTH */
           } else {
               process_up_ins(2);            /* UPDATE ONLY */ }
         }
         EXEC SQL COMMIT WORK;
         if (sqlca.sqlcode == 1403) break; }
         EXEC SQL CLOSE c1;
         EXEC SQL COMMIT WORK RELEASE; }

       process_up_ins(int proc_flag )
       {
          if (proc_flag == 2) {
              EXEC SQL FOR :loop UPDATE TABLE2 SET num2 = num2 + :v_num1 WHERE ROWID = :v_rowid;
          } else if (proc_flag == 1) {
              EXEC SQL FOR :loop INSERT INTO TABLE2 SELECT :v_fld1, :v_num1 FROM dual WHERE :v_rowid IS NULL;
              EXEC SQL FOR :loop UPDATE TABLE2 SET num2 = num2 + :v_num1 WHERE :v_rowid IS NOT NULL AND ROWID = :v_rowid;
          } else {
              EXEC SQL FOR :loop INSERT INTO TABLE2 VALUES ( :v_fld1, :v_num1 );}
       }

数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
DECLARE CURSOR C1 IS                                            DECLARE CURSOR C1 IS
SELECT A.PLYNO , A.AW_PYDT, B.AV_YYMM, A.INCM_PRM_CR_SEQNO,     SELECT /*+ ORDERED USE_HASH(BJ CR) PARALLEL(BJ 5) PARALLEL(CR 5) */
       A.AW_CR_SEQNO, A.AW_BEN_STFNO, B.BZ_ATRCD                      BJ.AW_CR_SEQNO, BJ.AW_BEN_STFNO
FROM SAM_CSCL_AW_PY_BJ_STF A, SAM_AW_CC_ACHV_STF B                  , BJ.BZ_ATRCD, BJ.AW_PYAMT, BJ.PRPN_AW_FLGCD, CR.IKD_GRPCD
WHERE A.AW_PYDT = '$$AW_PYDT' AND A.IKD_GRPCD IN ('LA', 'SA')       , CR.INS_IMCD, CR.GDCD, CR.CE_STFNO, CR.DH_STFNO
  AND A.AW_BEN_STFNO = B.STFNO AND B.STF_FLGCD <> '01‘              ...
ORDER BY AW_BEN_STFNO;                                          FROM (
                                                                  SELECT A.PLYNO , A.AW_PYDT, B.AV_YYMM, A.INCM_PRM_CR_SEQNO
…                                                                       , A.AW_CR_SEQNO, A.AW_BEN_STFNO, B.BZ_ATRCD
                                                                  FROM SAM_CSCL_AW_PY_BJ_STF A, SAM_AW_CC_ACHV_STF B
OPEN C1;                                                          WHERE A.AW_PYDT = '$$AW_PYDT' AND A.IKD_GRPCD IN ('LA', 'SA')
LOOP                                                              AND       A.AW_BEN_STFNO = B.STFNO AND B.STF_FLGCD <> '01‘
  FETCH C1                                                        ) BJ, SAM_AW_CR CR
    INTO V_PLYNO, V_AW_PYDT, V_INCM_PRM_CR_SEQNO, …;            WHERE BJ.PLYNO = CR.PLYNO AND BJ.INCM_PRM_CR_SEQNO =
  …                                                             CR.INCM_PRM_CR_SEQNO
  SELECT … INTO …                                                  AND BJ.AW_CR_SEQNO = CR.AW_CR_SEQNO
  FROM SAM_AW_CR CR                                             ORDER BY BJ.AW_BEN_STFNO;
  WHERE CR.PLYNO = V_PLYNO                                      …
   AND CR.INCM_PRM_CR_SEQNO = V_INCM_PRM_CR_SEQNO;              LOOP
                                                                  FETCH C1
    …                                                                INTO V_PLYNO, V_AW_PYDT, V_INCM_PRM_CR_SEQNO, …;
    SELECT COUNT(*) INTO V_CNT
    FROM SAM_AW CHR CR                                           SELECT COUNT(*) INTO V_CNT
    WHERE CR.PLYNO = V_PLYNO                                     FROM SAM_AW CHR CR
     AND CR.INCM_PRM_CR_SEQNO = V_INCM_PRM_CR_SEQNO + 1;         WHERE CR.PLYNO = V_PLYNO
                                                                  AND CE.INCM_PRM_CR_SEQNO = V_INCM_PRM_CR_SEQNO + 1;
  IF(V_CNT > 0) UPDATE SAM_AW CHR SET … ;
  ELSE INSERT INTO SAM_AW CHR VALUES (…) ;                       IF(V_CNT > 0) UPDATE SAM_AW CHR SET … ;
  END IF;                                                        ELSE INSERT INTO SAM_AW CHR VALUES (…) ;
  …                                                              END IF;
END LOOP;
                                                                END LOOP;
COMMIT;                                                         COMMIT;
                                                                CLOSE C1;
CLOSE C1;




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
DECLARE
    v_counter NUMBER := 2;
    v_exist NUMBER := 0;
 BEGIN                                                                     INSERT INTO DC_TEST
 LOOP                                                                      SELECT *
   INSERT INTO DC_TAB
   SELECT A.RNUM, A.RK, B.BILL_AMNT OLD_BILL_AMNT, A.DC_RATE, A.DC_AMNT,   FROM DC_TEST
        (CASE WHEN A.DC_RATE IS NOT NULL
               THEN B.BILL_AMNT * (A.DC_RATE / 100)                        MODEL
            WHEN A.DC_AMNT IS NOT NULL                                       DIMENSION BY (RNUM)
               THEN A.DC_AMNT
         END) RESULT_DC_AMNT,
                                                                             MEASURES (RK, BILL_AMNT, DC_RATE, DC_AMNT, -1
         B.BILL_AMNT -                                                     START_AMNT,
         (CASE WHEN A.DC_RATE IS NOT NULL                                           0 DC, 0 DC_RESULT)
               THEN B.BILL_AMNT * (A.DC_RATE / 100)
            WHEN A.DC_AMNT IS NOT NULL                                     RULES
               THEN A.DC_AMNT
         END) BILL_AMNT
                                                                           (
   FROM HJH_TEST_00 A                                                        DC_RESULT[ANY] ORDER BY RNUM =
     , HJH_TEST_01 B                                                           (CASE WHEN DC_RATE[CV()] IS NOT NULL
   WHERE A.RNUM = v_counter                                                        THEN NVL(DC_RESULT[CV()-1],
     AND B.RNUM = v_counter /* A.RNUM – 1 */
     AND B.BILL_AMNT > 0;
                                                                                              BILL_AMNT[CV()]) - (NVL(DC_RESULT[CV()-1],
                                                                                                      BILL_AMNT[CV()]) *
  SELECT COUNT(*)                                                          DC_RATE[CV()]/100)
  INTO v_exist                                                                     WHEN DC_AMNT[CV()] IS NOT NULL
  FROM DC_TAB
  WHERE RNUM = v_counter
                                                                                   THEN NVL(DC_RESULT[CV()-1],
   AND ROWNUM = 1;                                                                            BILL_AMNT[CV()]) - DC_AMNT[CV()]
                                                                                END),
  IF v_exist = 0 THEN                                                        DC[ANY] ORDER BY RNUM = NVL(DC_RESULT[CV()-1],
     EXIT;
  END IF;
                                                                                                        BILL_AMNT[CV()]) -
                                                                           DC_RESULT[CV()],
  v_counter := v_counter + 1;                                                START_AMNT[ANY] ORDER BY RNUM = NVL(DC_RESULT[CV()-1]
                                                                                                                      BILL_AMNT[CV()])
 END LOOP;
                                                                           )
 COMMIT;                                                                   ORDER BY RNUM

 END;
 /




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
SP_1      SP_2          SP_3         SP_4    SP_5             SP_6




          SP_12     SP_11        SP_10         SP_9    SP_8             SP_7



                    SP_
                    2

                    SP_            SP_                        Critical Path
                    3              4

        SP_         SP_                          SP_      SP_                 SP_1
        1           5                            7        9                   1

                                  SP_
                    SP_           8
                    6

                                 SP_1           SP_1
                                 0              2
数据库系统优化管理研讨沙龙-上海站    ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站
     ITPUB ChinaUnix IXPUB主办
LOOP   Black Box
    Read   Write
                    SELECT "ZKNTYP"
                    FROM "ZXSPZLB"
                    WHERE "MANDT" = :A0
                     AND "ZKNTYP " = :A1




                                      Join




数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
SELECT /*+ FIRST_ROWS */ "ADDRNO"
                                         FROM "ZCMT0006"
                                         WHERE "MANDT" = :A0
                                          AND "BUKRS" = :A1
                                          AND "CITY" = :A2
                                          AND "GU" = :A3
                                          AND "DONG" = :A4
                                          AND "ADDR1" = :A5
                                          AND "ADDR2" = :A6
                                          AND ROWNUM <= :A7

                                         Rows        Execution Plan
                                         --------- ---------------------------------------------------
                                               74 COUNT (STOPKEY)
                                               74      TABLE ACCESS (BY INDEX ROWID) OF 'ZCMT0006'
                                          444110           INDEX (RANGE SCAN) OF 'ZCMT0006~0' (UNIQUE)




数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
CE4CJ00~1 : MANDT+AKTBO+KNDNR+ARTNR+BUKRS+WERKS+VTWEG         CE4CJ00~ENC2 : COPA_KOSTL+KMVKGR+KMVKBU+WW004+WW007

                                                                call   count    cpu elapsed   disk   query current    rows
  call    count    cpu elapsed   disk query current    rows
                                                                ----- ------ ------ ------- ------ ------- -------- ------
  ------ ------ ------ ------- ------ ------ ------- ------
                                                                Parse      1   0.03    0.03      0       0        0      0
  Parse       1   0.19    0.19      0      0       0      0
                                                                Execute    1   0.00    0.00      0       0        0      0
  Execute     1   0.00    0.00      0      0       0      0
                                                                Fetch      2   0.00    0.04      8      24        0     12
  Fetch       2   7.29   18.28   8377 26389        0     12
                                                                ----- ------ ------ ------- ------ ------- -------- ------
  ------ ------ ------ ------- ------ ------ ------- ------
                                                                total      4   0.03    0.07      8      24        0     12
  total       4   7.48   18.47   8377 26389        0     12
                                                                Rows    Execution Plan
  Rows      Execution Plan
                                                                ------ -------------------------------------------------
  -------   ------------------------------------------------
                                                                     0 SELECT STATEMENT   GOAL: CHOOSE
        0   SELECT STATEMENT GOAL: CHOOSE
                                                                    16   TABLE ACCESS (BY INDEX ROWID) OF 'CE4CJ00'
    34010     TABLE ACCESS (BY INDEX ROWID) OF 'CE4CJ00'
                                                                    24    INDEX (RANGE SCAN) OF 'CE4CJ00~ENC2'(NON-
    34011      INDEX (RANGE SCAN) OF 'CE4CJ00~1' (NON-UNIQUE)
                                                                UNIQUE)




数据库系统优化管理研讨沙龙-上海站                  ITPUB ChinaUnix IXPUB主办
SELECT *

     FROM "DBVM"

     WHERE "MANDT" = :A0

       AND "MAFID" = :A1

       AND "DISST" = :A2

       AND "MATNR" > :A3

       AND "BERID" = :A4

       AND "MPSKZ" = :A5

       AND ( "GSAEN" = :A6 OR

             "RHYTD" > :A7 AND "RHYTD" <= :A8)

     ORDER BY "MANDT" , "MAFID" , "DISST" , "MATNR"




                   SELECT * FROM "DBVM"

                   WHERE "MANDT" = :A0    AND "MAFID" = :A1   AND "DISST" = :A2

                     AND "MATNR" IN (SELECT “MATNR” FROM “MAWA”

                                    WHERE “MANDT” = :A0 AND “MATNR” > :A3 )

                     AND "BERID" = :A4 …………………




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
SELECT ……

      FROM RQHD

      WHERE "MANDT" = :A0

       AND "MATNR" = :A1

       AND "PLWRK" = :A2



    Execution Plan
    ------------------------------------------
    SELECT STATEMENT GOAL: CHOOSE
      TABLE ACCESS (BY INDEX ROWID) OF ‘RQHD'
       INDEX (RANGE SCAN) OF 'RQHD~0' (UNIQUE)




数据库系统优化管理研讨沙龙-上海站              ITPUB ChinaUnix IXPUB主办
SELECT …

                                              FROM STKO

                                              WHERE "MANDT" = '100'

                                                AND "STLTY" = 'M'
       I     T
             A                                  AND "STLNR" = '00001842'
       N
       D     B
                                                AND "LOEKZ" = 'X'
       E     L
       X     E




数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
SELECT /*+ ORDERED USE_HASH( T01 T3 ) FULL(T3) */
 SELECT VKONT, GPART, OPBUK, ZAHLKOND
                                                                         T02.OPBUK, T02.VKONT, T02.GPART, T02.OPBEL,
 FROM FKKVKP
                                                                         T02.ZAHLKOND, T02.FAEDN, T02.STUDT, T3.TEXT
 WHERE EZAWE = 'D'
                                                                  FROM ( SELECT T01.OPBUK, T01.VKONT, T01.GPART, T01.OPBEL, …
   AND VKONT IN P_VKONT -- 입력값
                                                                        FROM ( SELECT /*+ ORDERED USE_HASH( T00 T2 ) FULL(T2) */
 LOOP AT I_FKKVK .
                                                                                        ROWNUM,T00.VKONT, T00.GPART, T00.OPBUK,
                                                                                         ……
 CONCATENATE I_FKKVK-VKONT I_FKKVK-GPART INTO LOOBJ1.                                   T2.OPBEL||T2.OPUPW||T2.OPUPK||T2.OPUPZ LOOBJ1
 SELECT SINGLE *                                                                FROM ( SELECT T0.VKONT, T0.GPART, T0.OPBUK, T0.ZAHLKOND
 FROM DFKKLOCKS                                                                         FROM ( SELECT ROWNUM, VKONT||GPART VKONT_1 , ……
 WHERE LOOBJ1 = LOOBJ1 AND …….                                                                  FROM FKKVKP
                                                                                                WHERE EZAWE='D') T0
 CHECK SY-SUBRC <> 0 .
                                                                                        WHERE T0.VKONT_1 IS NOT NULL
 SELECT *                                                                                  AND T0.VKONT_1 NOT IN (SELECT /*+ HASH_AJ */ T1.LOOBJ1
 FROM DFKKOP                                                                                                      FROM DFKKLOCKS T1
 WHERE VKONT = I_FKKVK-VKONT AND …….                                                                              WHERE T1.LOTYP = '06'
                                                                                                                     AND ……
 CONCATENATE DFKKOP-OPBEL DFKKOP-OPUPW …… INTO LOOBJ1.                                                               AND T1.LOOBJ1 IS NOT NULL )
 SELECT SINGLE *                                                                       ) T00, DFKKOP T2
 FROM DFKKLOCKS                                                                 WHERE T2.MANDT='100'
 WHERE LOOBJ1 = LOOBJ1 AND …… .                                                    AND T2.VKONT = T00.VKONT
                                                                                   AND T2.AUGST = ' '
 IF SY-SUBRC <> 0 .
                                                                                   AND T2. …… ) T01
 ……    .
                                                                        WHERE T01.LOOBJ1 IS NOT NULL
 ENDLOOP /* END OF LOOP AT I_FKKVK*/
                                                                            AND T01.LOOBJ1 NOT IN ( SELECT /*+ HASH_AJ */ LOOBJ1
                                                                                                     FROM DFKKLOCKS T3
 LOOP AT I_TAB .
                                                                                                     WHERE LOTYP = '02'
 SELECT SINGLE *
                                                                                                        AND ……
 FROM TE052T …… .
                                                                                                        AND T3.LOOBJ1 IS NOT NULL )
 ……
                                                                       ) T02, TE052T T3
 ENDLOOP . /* END OF LOOP AT I_TAB
                                                                  WHERE T3.MANDT='100'
                                                                     AND T3.SPRAS = '3'
 SORT ITAB BY OPBUK ZAHLKOND VKONT OPBEL.
                                                                     AND T3.ZAHLKOND = T02.ZAHLKOND
 ……
 RESULT WIRTE                                                     ORDER BY T02.OPBUK, T02.ZAHLKOND, T02.VKONT , T02.OPBEL




数据库系统优化管理研讨沙龙-上海站                             ITPUB ChinaUnix IXPUB主办
call       count      cpu    elapsed       disk      query    current       rows
       -------   -------- -------- ---------- ---------- ---------- ---------- ----------
       Parse       140564   244.16     317.85         11        428          2          0
       Execute   10526260  1874.77    4142.31     269624    1200526    2093534     668250
       Fetch     10082824 58678.25 120332.29    53229657 504289814      876338   25637960
       -------   ------- -------- ---------- ---------- ---------- ---------- ----------
       total     20749648 60797.18 124792.45    53499292 505490768     2969874   26306210

       164520    user   SQL statements in session.


       call       count          cpu    elapsed       disk      query    current         rows
       ------- --------     -------- ---------- ---------- ---------- ----------   ----------
       Parse     170436       282.42     311.26          0          0          0            0
       Execute 4744591       1098.02    2787.62     143193     380570    2760825      1072739
       Fetch    4330992     10981.92   28401.65   12803058 136858937       86515     10953876
       ------- --------     -------- ---------- ---------- ---------- ----------   ----------
       total    9246019     12362.36   31500.53   12946251 137239507     2847340     12026615

       177815    user   SQL statements in session.




数据库系统优化管理研讨沙龙-上海站              ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站
     ITPUB ChinaUnix IXPUB主办
执行速度能够得到大幅提升的合计表设计案例




数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
SUMMARY TABLE SIMULATION (案例)


                                       投保             费率                                前加
               保险       特约    年龄 加入 年龄       追加 法人 短期    有偿 共同 受理人    排气       扣除 混合 车辆    审查    加入 加入
  项目 时间 公司        车型 用途    性别          人年 地区          变化           职业    车名 寿命          入公    单位
               种类       费率    限制 阅历 区分       优惠 类型 率     运输 使用 身份      量       金额 编码 价格    次数    类型 金额
                                        龄             时间                                 司                                                                        行数计算内容                  行数

  序号 100 800   15   57   2   5   2   3   4   5   47   166   13   6   14   4   5   5   8   85   10   200   10   5   5   9   17   4   3   17   15

  28   1       2    3                                                     4                                                                       100 * 145 * 4                          58,000

  29   1       2    3                                                         4                                                                   100 * 64(公司专用车除外) * 5                  32,000

  30   1       2    3                                                             4                                                               100 * 64(업무용전차종중 승용차 제외) * 5           32,000

  31   1       2    3                                                                                                      4                      100 * 145/2(일반만 볼 경우로 상정) * 17        123,250

  32   1       2    3                                                                                                                   4         100 * 40(개인용4+업무용36:일반만 ) * 17         68,000

  33   1       2    3                                                                                                                        4    100 * 8(개인용 보종*차종) * 15                12,000

  34   1       2                 5   3           4                                                                                                100*2(개인용)*3(연령한정)*47(연령)*2(성별)        56,400

  35   1       2                 5   3       4                                                                                                    100*6(개인용제외)*3*5(피보험자연령구분)*2           18,000

  36   1       2                             3                                            4                                                       100 * 2(개인용) * 5(연령구분) * 85(직업)        85,000

  37   1       2                             3                                                       4                                            100 * 2 * 5 * 127(차명)                 127,000

  38   1       2    3    4   5                                                                                                                    100 *2(개인용) *4(차종) *2(용도) *2(특약)       3,200

  39   1       2    3    4                       5                                                                                                100 * 1(일반만) * 4 * 2 * 2 * 47(연령)      75,200

  40           1    2                                  3                                                                                          145(개,업,영,이의 차종) * 166                 24,070

  41           1    2                                                3                                                                            145 * 14(단기율)                          2,030

  42           1    2                                                                     3                                                       145 * 85(직업)                           12,325

                                                                                                                                                  8(개인용차종)* 127(차명)* 3(한차량의 배기량
               1    2                                                                          3     4             5                                                                     15,240
  43                                                                                                                                              종류)* 5(혼합코드)

  44           1    2                                                                                          4                             3    145 * 15 * 5                           10,875

  45           1    2                                                                                                  4                     3    145 * 15 * 9                           19,575

               1    2                        4         3                                                                                          145 * 71(차종에 해당되는 지역 평균) * 5(연령)       51,475
  46

  47           1    2                                  3                      4                                                                   145 * 71 * 2(유상운송 평균)                  20,300

  48           1    2                                  3                          4                                                               145 * 71 * 2(공동사용 평균)                  20,300

               1    2                                  3                                                                                4         73(일반만,145/2)*71*17(향후 특정 건수 고려)       87,508
  49

  50           1    2                                  3                                  3          4                                            8(개인용 차종) * 85(직업) * 127(차명)           86,360

  51           1    2    4       6       5                                                3                                                       8 * 85 * 2(용도) * 5(연령구분) * 2(성별)       13,600

  52           1    2    5       4       6                                                           3                                            8*127(차명) * 2(성별) * 2(용도) * 4(가입경력)    16,256

  53           1    2                                                                                     5            4                     3    145 * 6(담보별) * 9(차량가액) * 10(차령)        78,300

  54           1    2    3   4   7           5         6                                                                                          8*2* 2(특약)*5(연령구분)*166(지역)*2(성별)       53,120




数据库系统优化管理研讨沙龙-上海站                                           ITPUB ChinaUnix IXPUB主办
以当前时点查询过去合计表(案例)

                                                                201103 140 50 …… 340000



                                      201103 120 10 …… 340000




           201103 120 ……….
           1234000000
           201103 130 ……….
           2156000000
           201103 140 ……….
           2302100000




201103 120 …… 1234000000     201103 120 …… -340000
                             201103 140 …… +340000




数据库系统优化管理研讨沙龙-上海站                           ITPUB ChinaUnix IXPUB主办
ROLAP的QUERY Optimizing


      ...
      DEPTNO                                              R
                                                  Y       E   J
      YEAR                                                G
                                              D   E           O
      JOB                                                 I
                                              E   A           B
                                                          O
                                              P       G
      REGION                                      R       N
                                              T       E
      GENDER                                  N       N
                                              O       D
      SALE_AMT
                                                      E
      ...                                             R




数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站
     ITPUB ChinaUnix IXPUB主办
灵活运用位图的数据模型和SQL

                                持续
                                增加     1    对合同底账中的属性进行管理

                                              属性非常多
                                              处理过程比较复杂
                            非常
                            之多!


                                       2    对合同底账表进行1:1垂直分割

                                              属性非常多
                                              很难维持追加和修改
                                              处理过程比较复杂.
                    在大量的知识信
                    息中,为了便于
                    处理而使用FLAG          3    对合同底账表进行1:1垂直分割(元数据管理)

                                              属性个数减少,适应性增强
                                              行的增加和条件处理比较困难


                                       4    在一个列中以Byte为单位来组建Flag
                                              全部作为一个属性来处理
                                              追加和修改容易.
                                              在有些情况下处理起来比较复杂


数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
灵活运用位图的数据模型和SQL                                                    FLAG Column Value
                                                   1    2   3     4    5      6   7   8      9   10   …   200
          数据模型的类型
                                                   1    1   0     0    0      1   1   0      0   0    0    1
          最初创建时将所有FLAG的
          值都设置为默认值 ‘0’                       Y          1

                                             N          0
  利用一个              可变长度
FLAG列替代                                                                                               特定账户的
全部的与否列                                                                                                FLAG值
                                                       FLAG META DATA
                                   编号            列说明                   列名             修改代码            值
                                    1    압류및법적제한与否              LEGAL_LIMIT               1001        Y

                                    2    통장증서분실도난与否             BOND_LOSS                 1002        Y

           逻辑关系                     3    인감분실도난与否               SEAL_LOSS                 1003        N

                   指定列的             4    현금카드분실도난与否             CARD_LOSS                 1004        N
                    位置
                                    5    전부지급정지与否               PAY_REFUSAL               1005        N

                                    6    일부지급정지与否               PART_REFUSAL              1006        Y

                                    7    입금금지与否                 RECEIPT_REJECT            1009        Y

                                    8    NET지급금지与否              NETPAY_REJECT             1008        N
 利用属性管理时                            9    경찰망연계与否                POLICE_CONNECT            1009        N
 原来列的名称
                                    10   당행질권설정与否               MORTGAGER_SW              1010        N
           管理元数据信息中BIT的
           位置和名称                   ……    ………………………              …………………                               …

                                   200   EDI계좌与否                EDI_ACCOUNT               1910        Y

数据库系统优化管理研讨沙龙-上海站     ITPUB ChinaUnix IXPUB主办
灵活运用位图的数据模型和SQL                                                               FLAG META DATA

       帐号              FLAGs                                      NO
                                                                        COLUMN                    COL       CHG_CD
                                                                        DESCRIPTION
    123-45-67       1000010100
                                                                  1      압류및법적제한与否         LEGAL_LIMIT       1001

                   SELECT                                         2      통장증서분실도난与否        BOND_LOSS         1002

   SELECT SUBSTR(FLAGS,3,1) SEAL_LOSS                             3      인감분실도난与否          SEAL_LOSS         1003
   FROM ACCOUNTS
   WHERE ACCT_NO = ‘123-45-67’                                    4      현금카드분실도난与否        CARD_LOSS         1004

                                  须要时可
   SELECT SUBSTR(FLAGS,NO,1) SEAL_LOSS                            5      전부지급정지与否          PAY_REFUSAL       1005
   FROM ACCOUNTS a, FLAG_META b  以使用变量
                                                                  6      일부지급정지与否          PART_REFUSAL      1006
   WHERE ACCT_NO = ‘123-45-67’
     AND COL     = ‘SEAL_LOSS’                                    7      입금금지与否            RECEIPT_REJECT    1009

                                                                  8      NET지급금지与否         NETPAY_REJECT     1008
                   UPDATE (直接指定)
                                                           1003          경찰망연계与否           POLICE_CONNEC     1009
    UPDATE ACCOUNTS                                               9
                                                                                           T
    SET FLAGS =
        SUBSTR(FLAGS,1,3-1)||'1'||SUBSTR(FLAGS,3+1)               ……     ………………………         …………………
    WHERE ACCT_NO = '123-45-67'


                       UPDATE (N个同时处理)                                           BYPASS_UJVC提示
   UPDATE /*+ bypass_ujvc */                                          为了实现'Updatable Join View‘
   ( SELECT ACCT_NO, FLAGS,
            SUBSTR(FLAGS,1,NO-1)||‘1’||SUBSTR(FLAGS,NO+1) DD,           • 能够进行表连接的表是1:1关系或1:M关系
            NO                                                          • 将Parent table的连接列设置为UK或PK
     FROM ACCOUNTS a, FLAG_META b
     WHERE ACCT_NO = '123-45-67'                                        • 可以被Update的列的表是M边的集合
       AND CHG_CD = '1009'              Join
                                        View                          如果无法满足该条件则会出现错误
   )
   SET FLAGS = DD;        2 个选择                                       使用提示可以避免该制约事项,且可以顺利执行UPDATE


数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
A   B    C   D   E   F   G
   No         Title
                                                       A   B    C   D   E   F   G   %
   1    ABCDEFG
   2    …                                                                           %
                                                       A   B    C   D   E   F   G
   …    …
                                                       A   B    C   D   E   F   G   %
        通过复制生成数据




   No   SubNo         Sub Title                        A   B    C   D   E   F   G

    1      1          ABCDEFG                          A   B    C   D   E   F   G
    1      2           BCDEFG
                                                       A   B    C   D   E   F   G
    1      3             CDEFG
    1      4              DEFG                         A   B    C   D   E   F   G
    1      5                EFG
    1      6                  FG
    1      7                      G




数据库系统优化管理研讨沙龙-上海站                     ITPUB ChinaUnix IXPUB主办
数据库系统优化管理研讨沙龙-上海站
     ITPUB ChinaUnix IXPUB主办
Non Partition Table                          Partition Table

   SELECT 月, SUM (月销售额)                       SELECT 月, SUM (月销售额)
   FROM 销售                             .      FROM 销售                            .
   WHERE 日期 LIKE ‘2010%’               .      WHERE 日期 LIKE ‘2010%’
   GROUP BY 月                                 GROUP BY 月
                                      2007
                                                                               2008
                     数据读              2008
                     取范围
                                      2009                                     2009
                                                        使用 Range Partition

                 有效数据范围               2010                 数据读取范围
                                                                               2010
                                                           有效数据范围


                                              虽然表中有10亿行数据,但只读取了其中的1亿行
   读取10亿行数据后,由于满足日期为2010的数据仅为1亿行,
                                              处理海量数据时,如使用索引则会发生大量随机读取,从而严重
  所以扔掉了9亿行数据,效率非常低下(使用索引没有任何意义)
                                             影响性能,因此使用全表扫描反倒比较有效。尤其在分区表使用全
   使用索引反倒会影响性能
                                             表扫描有利于提高性能。




数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
Partition Exchange

                                                                   DUMMY_FACT

     500万行   P_200704




     500万行   P_200705               DUMMY_FACT
                                    (500万行)

                                                                           DUMMY_FACT

     500万行              Partition
             P_200706
                        Exchange

       修改对象为
       300万行
                 …



                                                       P_200706
                                                                  DUMMY_FACT




数据库系统优化管理研讨沙龙-上海站       ITPUB ChinaUnix IXPUB主办
扩展UPDATE 语句应用(1)                                              扩展UPDATE 语句应用(2) – 防止空更新
  TABLE4                   TABLE3
                                                       TABLE2
  # ORD_ID                 # DATE3
                                                       # ITEM
    QTY4                     QTY3
                                                         COL2
    COL4                     COL3
                                                         FLD2
    ……                       FLD3
                                                         ……
                             ……




                                                                       UPDATE table1 x
                                                       TABLE1
                                                       # PROD
                                                                        SET col1 = ( SELECT nvl(x.col1,0) + nvl(y.fld1,0)
                                                         COL1
                                                         QTY1                       FROM table2 y
                                                         ……
                                                                                    WHERE y.key = x.key )
 UPDATE TABLE3 t3 SET                                                  WHERE ………………………….
     (COL3, FLD3, QTY3, ..........) =                                     and exists ( select ‘ ‘ from table2 z
     (SELECT decode(COL2, '1', substr(COL4,1,4)),
                                                                                       where z.key = x.key. )
              nvl(FLD3,0) + nvl(QTY2,0)*100 / nvl(QRY4,1),
              decode(FLD4, '1', nvl(QTY2,0)*0.01,
                             '2', nvl(QTY2,0)*0.05)-nvl(QTY3,0))
                                                                       UPDATE table1 x
     FROM TABLE2 t2, TABLE4 t4
                                                                        SET col1 = ( SELECT nvl(x.col1,0) + nvl(MIN(y.fld1),0)
     WHERE t2.ITEM      = t3.ITEM
                                                                                    FROM table2
         and t4.ORD_ID = t3.ORD_ID )
 WHERE ITEM IN ( SELECT ITEM                                                        WHERE y.key = x.key )

                   FROM TABLE2                                         WHERE ………………………….;

                  WHERE PROD IN
                         ( SELECT PROD
                           FROM TABLE1                                 在连接成功的表中,必须只能对有键值的表进行修改
                           CONNECT BY PROD = PRIOR MPROD               SELECT * FROM USER_UPDATABLE_COLUMNS
                           START WITH MPROD = :PROD ) ) ;              WHERE TABLE_NAME = ‘TABLE_V


数据库系统优化管理研讨沙龙-上海站                            ITPUB ChinaUnix IXPUB主办
批处理优化核心技术及案例 – 扩展MERGE应用

                                                优化前
   EXEC SQL DECLARE C1 CURSOR FOR
            SELECT A.JONGCODE, A.CPRICE, B.ROWID
             FROM DPRICE_C A, DSUM_S B                       SQL语句只被执行一次
            WHERE A.JONGCODE LIKE '45%'                      ( 总结果为3000万行)
              AND A.JONGCODE = B.JONGCODE(+)
              AND A.CDATE   = B.CDATE(+);
   EXEC SQL OPEN C1;
   FOR (;;)
   {
     EXEC SQL FETCH C1
      INTO :V_JONGCODE, :V_CPRICE, :V_DSUM_ROWID;
     IF (SQLCA.SQLCODE == 1403) BREAK;
        EXEC SQL                                             更新1000万行数据时
           UPDATE DSUM_S SET CSUM = CSUM + :V_CPRICE, ..     反复处理3000万行数据
            WHERE ROWID = :V_DSUM_ROWID;
       IF (SQLCA.SQLCODE == 1403)
        EXEC SQL                                            插入2000行数据时
           INSERT INTO DSUM_S                               反复处理2000万行数据
           VALUES ( :V_JONGCODE, '19940829', :V_CPRICE);
                                 反复处理3000万行数据
     EXEC SQL COMMIT WORK;                                     消耗大量时间
   }                                                       (消耗的时间最少为 8个小时)
   EXEC SQL CLOSE C1;
   EXEC SQL COMMIT WORK RELEASE;

数据库系统优化管理研讨沙龙-上海站             ITPUB ChinaUnix IXPUB主办
批处理优化核心技术及案例 – 扩展MERGE应用

                                             优化后
    MERGE /*+ USE_HASH(Y X) PARALLEL(Y 20) FULL(X) PARALLEL(X 20) */ INTO DSUM_S X
    USING DPRICE_C Y
    ON (Y.JONGCODE LIKE '45%‘
      AND Y.JONGCODE = X.JONGCODE
      AND Y.CDATE        = X.CDATE )
    WHEN MATCHED THEN
                                                          该SQL语句只需要被执行一次,
     UPDATE                                                 消耗时间得到了大量缩减
     SET     X. CSUM = Y.V_CPRICE,                          (最多消耗时间为30分)
           ...
    WHEN NOT MATCHED THEN
     INSERT
     VALUES (Y.JONGCODE, '19940829', Y._CPRICE);

    使用MERGE的情况下,表‘DPRICE_C’中的数量较少,表‘DSUM_S’中的数据量较多,在使用索引容易增加成本
    开销的情况下,使用HASH JOIN效果会比较明显
    重要的是以表‘DPRICE_C’为基准与表‘DSUM_S’执行外连接
    可以使用并行处理来进行更新
    将前面的批处理程序中所嵌套的多个SQL语句合并为一个SQL语句


数据库系统优化管理研讨沙龙-上海站           ITPUB ChinaUnix IXPUB主办
Web Server                                Web Server




    WAS Server                                WAS Server




    DB Server                                 DB Server




数据库系统优化管理研讨沙龙-上海站   ITPUB ChinaUnix IXPUB主办
企业信息系统性能优化实战
企业信息系统性能优化实战
企业信息系统性能优化实战
企业信息系统性能优化实战
企业信息系统性能优化实战
企业信息系统性能优化实战
企业信息系统性能优化实战
企业信息系统性能优化实战
企业信息系统性能优化实战

More Related Content

Similar to 企业信息系统性能优化实战

数据挖掘理论与实践
数据挖掘理论与实践数据挖掘理论与实践
数据挖掘理论与实践medcl
 
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseJack Gao
 
大規模微服務導入 - #1, 從零開始的系統架構設計概觀
大規模微服務導入 - #1, 從零開始的系統架構設計概觀大規模微服務導入 - #1, 從零開始的系統架構設計概觀
大規模微服務導入 - #1, 從零開始的系統架構設計概觀Andrew Wu
 
Build 1 trillion warehouse based on carbon data
Build 1 trillion warehouse based on carbon dataBuild 1 trillion warehouse based on carbon data
Build 1 trillion warehouse based on carbon databoxu42
 
E tom ngoss规范及siebel系统在电信行业的应用 陈永林
E tom ngoss规范及siebel系统在电信行业的应用 陈永林E tom ngoss规范及siebel系统在电信行业的应用 陈永林
E tom ngoss规范及siebel系统在电信行业的应用 陈永林corlin chen
 
Top100summit用友 池建强-构建企业级应用开发平台
Top100summit用友 池建强-构建企业级应用开发平台Top100summit用友 池建强-构建企业级应用开发平台
Top100summit用友 池建强-构建企业级应用开发平台drewz lin
 
Actuate presentation 2011
Actuate presentation   2011Actuate presentation   2011
Actuate presentation 2011Luke Han
 
Analytics in a Day.pptx
Analytics in a Day.pptxAnalytics in a Day.pptx
Analytics in a Day.pptxLigangJin
 
自下而上的数据仓库构建方法
自下而上的数据仓库构建方法自下而上的数据仓库构建方法
自下而上的数据仓库构建方法tongxiaojun
 
Foodie 餐廳推薦系統
Foodie 餐廳推薦系統Foodie 餐廳推薦系統
Foodie 餐廳推薦系統JamesMa54
 
imobile-beta技术沙龙
imobile-beta技术沙龙imobile-beta技术沙龙
imobile-beta技术沙龙posestudio
 
阿里巴巴运维团队的无状态运维思路
阿里巴巴运维团队的无状态运维思路阿里巴巴运维团队的无状态运维思路
阿里巴巴运维团队的无状态运维思路mysqlops
 
翟艳堂:腾讯大规模Hadoop集群实践
翟艳堂:腾讯大规模Hadoop集群实践翟艳堂:腾讯大规模Hadoop集群实践
翟艳堂:腾讯大规模Hadoop集群实践hdhappy001
 
翟艳堂:腾讯大规模Hadoop集群实践
翟艳堂:腾讯大规模Hadoop集群实践翟艳堂:腾讯大规模Hadoop集群实践
翟艳堂:腾讯大规模Hadoop集群实践hdhappy001
 
openGauss DBMind.pdf
openGauss DBMind.pdfopenGauss DBMind.pdf
openGauss DBMind.pdfwot chin
 
海通证券金融云思考与实践(数据技术嘉年华2017)
海通证券金融云思考与实践(数据技术嘉年华2017)海通证券金融云思考与实践(数据技术嘉年华2017)
海通证券金融云思考与实践(数据技术嘉年华2017)Zhaoyang Wang
 
Apache Kylin Data Summit 2019: Kyligence Presentation
Apache Kylin Data Summit 2019: Kyligence PresentationApache Kylin Data Summit 2019: Kyligence Presentation
Apache Kylin Data Summit 2019: Kyligence PresentationTyler Wishnoff
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器Leyi (Kamus) Zhang
 
Sbir 海量運算的雲端學習歷程與評量分析app開發0124簡報v2.01
Sbir 海量運算的雲端學習歷程與評量分析app開發0124簡報v2.01Sbir 海量運算的雲端學習歷程與評量分析app開發0124簡報v2.01
Sbir 海量運算的雲端學習歷程與評量分析app開發0124簡報v2.01Jackie Liu
 
Terracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering ArchitectureTerracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering ArchitectureTarget Source
 

Similar to 企业信息系统性能优化实战 (20)

数据挖掘理论与实践
数据挖掘理论与实践数据挖掘理论与实践
数据挖掘理论与实践
 
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouse
 
大規模微服務導入 - #1, 從零開始的系統架構設計概觀
大規模微服務導入 - #1, 從零開始的系統架構設計概觀大規模微服務導入 - #1, 從零開始的系統架構設計概觀
大規模微服務導入 - #1, 從零開始的系統架構設計概觀
 
Build 1 trillion warehouse based on carbon data
Build 1 trillion warehouse based on carbon dataBuild 1 trillion warehouse based on carbon data
Build 1 trillion warehouse based on carbon data
 
E tom ngoss规范及siebel系统在电信行业的应用 陈永林
E tom ngoss规范及siebel系统在电信行业的应用 陈永林E tom ngoss规范及siebel系统在电信行业的应用 陈永林
E tom ngoss规范及siebel系统在电信行业的应用 陈永林
 
Top100summit用友 池建强-构建企业级应用开发平台
Top100summit用友 池建强-构建企业级应用开发平台Top100summit用友 池建强-构建企业级应用开发平台
Top100summit用友 池建强-构建企业级应用开发平台
 
Actuate presentation 2011
Actuate presentation   2011Actuate presentation   2011
Actuate presentation 2011
 
Analytics in a Day.pptx
Analytics in a Day.pptxAnalytics in a Day.pptx
Analytics in a Day.pptx
 
自下而上的数据仓库构建方法
自下而上的数据仓库构建方法自下而上的数据仓库构建方法
自下而上的数据仓库构建方法
 
Foodie 餐廳推薦系統
Foodie 餐廳推薦系統Foodie 餐廳推薦系統
Foodie 餐廳推薦系統
 
imobile-beta技术沙龙
imobile-beta技术沙龙imobile-beta技术沙龙
imobile-beta技术沙龙
 
阿里巴巴运维团队的无状态运维思路
阿里巴巴运维团队的无状态运维思路阿里巴巴运维团队的无状态运维思路
阿里巴巴运维团队的无状态运维思路
 
翟艳堂:腾讯大规模Hadoop集群实践
翟艳堂:腾讯大规模Hadoop集群实践翟艳堂:腾讯大规模Hadoop集群实践
翟艳堂:腾讯大规模Hadoop集群实践
 
翟艳堂:腾讯大规模Hadoop集群实践
翟艳堂:腾讯大规模Hadoop集群实践翟艳堂:腾讯大规模Hadoop集群实践
翟艳堂:腾讯大规模Hadoop集群实践
 
openGauss DBMind.pdf
openGauss DBMind.pdfopenGauss DBMind.pdf
openGauss DBMind.pdf
 
海通证券金融云思考与实践(数据技术嘉年华2017)
海通证券金融云思考与实践(数据技术嘉年华2017)海通证券金融云思考与实践(数据技术嘉年华2017)
海通证券金融云思考与实践(数据技术嘉年华2017)
 
Apache Kylin Data Summit 2019: Kyligence Presentation
Apache Kylin Data Summit 2019: Kyligence PresentationApache Kylin Data Summit 2019: Kyligence Presentation
Apache Kylin Data Summit 2019: Kyligence Presentation
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器
 
Sbir 海量運算的雲端學習歷程與評量分析app開發0124簡報v2.01
Sbir 海量運算的雲端學習歷程與評量分析app開發0124簡報v2.01Sbir 海量運算的雲端學習歷程與評量分析app開發0124簡報v2.01
Sbir 海量運算的雲端學習歷程與評量分析app開發0124簡報v2.01
 
Terracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering ArchitectureTerracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering Architecture
 

More from mysqlops

The simplethebeautiful
The simplethebeautifulThe simplethebeautiful
The simplethebeautifulmysqlops
 
Oracle数据库分析函数详解
Oracle数据库分析函数详解Oracle数据库分析函数详解
Oracle数据库分析函数详解mysqlops
 
Percona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-managementPercona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-managementmysqlops
 
Percona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replicationPercona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replicationmysqlops
 
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB ClusterPercona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB Clustermysqlops
 
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationPercona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationmysqlops
 
Pldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internalsPldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internalsmysqlops
 
DBA新人的述职报告
DBA新人的述职报告DBA新人的述职报告
DBA新人的述职报告mysqlops
 
分布式爬虫
分布式爬虫分布式爬虫
分布式爬虫mysqlops
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践mysqlops
 
eBay EDW元数据管理及应用
eBay EDW元数据管理及应用eBay EDW元数据管理及应用
eBay EDW元数据管理及应用mysqlops
 
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现mysqlops
 
eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析mysqlops
 
对MySQL DBA的一些思考
对MySQL DBA的一些思考对MySQL DBA的一些思考
对MySQL DBA的一些思考mysqlops
 
QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示mysqlops
 
腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事mysqlops
 
分布式存储与TDDL
分布式存储与TDDL分布式存储与TDDL
分布式存储与TDDLmysqlops
 
MySQL数据库生产环境维护
MySQL数据库生产环境维护MySQL数据库生产环境维护
MySQL数据库生产环境维护mysqlops
 

More from mysqlops (20)

The simplethebeautiful
The simplethebeautifulThe simplethebeautiful
The simplethebeautiful
 
Oracle数据库分析函数详解
Oracle数据库分析函数详解Oracle数据库分析函数详解
Oracle数据库分析函数详解
 
Percona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-managementPercona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-management
 
Percona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replicationPercona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replication
 
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB ClusterPercona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
 
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationPercona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimization
 
Pldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internalsPldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internals
 
DBA新人的述职报告
DBA新人的述职报告DBA新人的述职报告
DBA新人的述职报告
 
分布式爬虫
分布式爬虫分布式爬虫
分布式爬虫
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
eBay EDW元数据管理及应用
eBay EDW元数据管理及应用eBay EDW元数据管理及应用
eBay EDW元数据管理及应用
 
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现
 
eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析
 
对MySQL DBA的一些思考
对MySQL DBA的一些思考对MySQL DBA的一些思考
对MySQL DBA的一些思考
 
QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示
 
腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事
 
分布式存储与TDDL
分布式存储与TDDL分布式存储与TDDL
分布式存储与TDDL
 
MySQL数据库生产环境维护
MySQL数据库生产环境维护MySQL数据库生产环境维护
MySQL数据库生产环境维护
 
Memcached
MemcachedMemcached
Memcached
 
DevOPS
DevOPSDevOPS
DevOPS
 

企业信息系统性能优化实战

  • 2. Ⅰ Ⅰ Ⅰ Ⅰ Ⅰ Ⅰ Ⅰ Ⅰ Ⅰ Ⅰ 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 4. Ⅰ • 公司名称 : EN-CORE CO., LTD. (www.en-core.com, www.en-core.com.cn) • 公司代表 : 李华植 • 公司地址 : Allianz Tower 3F,45-21, Yeouido-dong, Yeongdeugpo-gu, Seoul, korea • 联系电话 : 82-2-754-7301(FAX 82-2-754-7305) • 成 立 日 : 1997年 11月 13日 • 业 种 : IT • 经营范围 : 咨询服务/ 软件开发,书籍出版/书籍销售/技术培训 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 5. ™ Consulting Solution Academy Consulting Service EN-CORE DataWare™ 培 训 课 程 信 息 服 务 Data Architecture DataWare™ DA DA Lab Database DataWare™ Repository Modeling News Data Quality DataWare™ IDO Tuning Education Data Upgrade DataWare™ DQ 海量数据库解决方案 Books Data Governance DataWare™ Impact SQL Open Club DataWare™ Meta New Tech 综合服务 DA Master DataWare™ ETL Recruiting Next System 企业委托培训 System Monitoring 书籍出版 ISP/EAP 书籍 DW / BI Reports BAM 国际出版 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 7. <= Ford > Ford <= Clark <= Hunt > Clark > Hunt Allen 0007 Davis 0002 Green 0006 Jones 0004 Clarke 0003 Ford 0005 Hunt 0008 King 0001 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 10. 最佳索引设计步骤 最佳索引设计步骤 SQL Parsing 1 从应用程序中搜集全部SQL 设计索引 2 以表为单位从SQL中搜集读取 类型并对其进行分析 3 创建能够满足所有 读取要求的最佳索引 4 以新创建的最佳索引为依据, 确认优化器制定的执行计划 5 修优未能正确使用最佳索引的SQL 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 11. DeptNo 12% Sal_Date 2010-01-01 ~ 2010-12-31 Search DeptNo Ename EmpNo Job Sal_Tot Com_Tot ▲ 12345 KING 7839 PRESIDENT 781,360.30 10,600 12345 SCOTT 7788 ANALYST 268,158.15 6,100 ▼ 12345 FORD 7902 MANAGER 101,682.93 4,500 SELECT deptno, y.ename, y.empno, y.job, sal_tot, comm_tot FROM ( SELECT empno, sum(sal_amt) sal_tot, sum(comm) comm_tot FROM salary s WHERE s.deptno like ’12%’ AND s.sal_date between ‘20100101’ and ‘20101231’ GROUP BY empno ) x, employee y WHERE y.empno = x.empno ■ 为了提高执行速度而将DEPTNO列添加到salary表中,索引的构成是(deptno + sal_date) ■ 满足Sal_Date查询条件的数据量越大,通过索引查询的行数就越多,执行速度就越慢 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 12. 1 2 DeptNo 12% Sal_Date 2005-01-01 ~ 2005-12-31 Search DeptNo Ename Ename EmpNo EmpNo Job Job Sal_Tot Sal_Tot Com_Tot Com_Tot ▲ 12345 SMITH KING 7369 7839 CLERK PRESIDENT 781,360.30 52,831.32 10,600 2,200 12643 MARTIN SCOTT 7900 7788 SALESMAN ANALYST 113,863.15 268,158.15 4,100 6,100 ▼ 12742 WARD FORD 7521 7902 SALESMAN MANAGER 156,167.01 101,682.93 5,200 4,500 SELECT deptno into :v_deptno SELECT deptno, y.ename, y.empno, y.job, x.sal_tot, x.comm_tot FROM dept FROM WHERE deptno like ’12%’ ( SELECT empno, sum(sal_amt) sal_tot, sum(comm) comm_tot FROM salary s WHERE s.deptno = :v_deptno AND s.sal_date between ‘20100101’ and ‘20101231’ GROUP BY empno ) x, employee y WHERE y.empno = x.empno 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 13. select col1, col2 from AT Lock col1 col2 where col1 = '20' 处理  commit and rownum = 1 for update; 10 AA 20 AB select col1, col2 失 再尝试 处理 commit 20 AB from AT 败 where col1 = '20' 20 CM and rownum = 1 for update; … 失 失 from AT 再尝试 败 再尝试 处理 commit 20 SK where col1 = '20' 败 and rownum = 1 21 BA for update; . . . . AT table . . select col1, col2 from AT where col1 = '20' and rownum = 1 失 败 再尝试 失 败 再尝试 ....... 处理 commit for update; 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 14. CREATE SEQUENCE squ select squ.nextval into :A from dual; start with 1 select rnum, col1, col2 increment by 1 from (select rownum as rnum, col1, col2 maxvalue 10 from AT where col1 = '20') col1 col2 cycle where rnum = :A cache 9 and rownum = 1; 10 AA 20 AB select squ.nextval into :A from dual; select rnum, col1, col2 20 AB from (select rownum as rnum,col1,col2 序列号 from AT 20 CM where col1 = '20') … where rnum = :A and rownum = 1; 20 SK where rnum = :A and rownum = 1; ……….. . 21 BA select squ.nextval into :A from dual; AT table . . select rnum, col1, col2 . from (select rownum as rnum,col1,col2 from AT where col1 = '20') where rnum = :A and rownum = 1; 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主
  • 15. 区号 开始号码 结束号码 个数 使用与否 区号 使用与否 个数 123 0000 0000 1 O 123 O 1 123 0001 0004 4 X 123 X 4 123 0005 0006 2 O 123 O 2 区号 序列号 使用与否 123 0007 0009 3 X 123 X 3 123 0000 O 123 0010 0010 1 O 123 O 1 123 0001 X 1 123 0011 0012 2 X 123 X 2 123 0002 X 2 123 0013 0014 2 O 123 O 2 123 0003 X 123 0015 0021 7 X 123 X 7 3 123 0004 X 123 0022 0022 1 O 123 O 1 4 123 0005 O 0 123 …….. … 123 … 123 0006 O 0 123 9990 9999 9 X 123 X 9 123 0007 X 1 123 0008 X 2 123 0009 X 3 123 0010 O 0 123 0011 X 1 123 0012 X 2 123 0013 O 0 123 0014 O 0 123 0015 X 1 123 0016 X 2 123 0017 X 3 123 0018 X 4 123 0019 X 5 区号 开始号码 结束号码 个数 . 123 0020 X 6 123 .......... .......... … … 123 0021 X 123 0015 0020 6 O 123 0022 O 123 0021 0021 1 X 123 …….. … 123 0022 0022 1 O 123 9999 X 123 ………. ………. … … 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 16. 合同编号 管理部门 结果 O O Index Scan O X Index Scan X O Full Scan 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 17. call count cpu elapsed disk query current rows ------- ------ -------- ---------- ------ ------ -------- ----- Parse 20 0.81 1848.30 0 0 0 0 Execute 20 0.01 0.01 0 0 0 0 Fetch 20 0.74 1.58 114 15693 0 50 ------- ------ -------- ---------- ------ ------ -------- ----- total 60 1.56 1849.89 114 15693 0 50 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 18. Literal SQL – Hard Parsing Literal SQL select * from tab where id = 1 Connection con = null; select * from tab where id = 2 Statement stmt = null; select * from tab where id = 3 … select * from tab where id = 4 String query = "select * from tab where id = " + id; select * from tab where id = 5 … select * from tab where id = 6 Parsing stmt = con.createStatement(stmt); select * from tab where id = 7 代价较大 ResultSet rs = stmt.executeQuery(); select * from tab where id = 8 select * from tab where id = 9 select * from tab where id = 10 … 须要对所有的SQL语句进行Hard parsing select * from tab where id = 99999 Static SQL(with Bind variable) – Soft Parsing Static SQL select * from tab where id = ? Connection con = null; Bind PreparedStatement pstmt = null; Variable … 1 2 String query = "select * from tab where id = ?"; 3 pstmt = con.prepareStatement(query); 4 pstmt.setInt(1, id); 5 6 ResultSet rs = pstmt.executeQuery(); 7 8 9 最少须要执行1次Hard parsing,soft parsing可以被反复执行 10 … 99999 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 20. . . . . . . No Data 1 AAAA 2 BBBB 每次邀请的 3 CCCC 数据为25行 4 DDDD 5 EEEE 全部数据为 6 FFFF 100万行 7 GGGG 8 HHHH 9 IIII 10 JJJJ 11 KKKK 12 LLLL .. … 1000000 ZZZ 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 21. • 确认查询结果周围数据时使用的留言板 • 按照顺序确认程序结果 • 用户没有必要选择页数 • 一般型WEB留言板 • 查询的数据被显示在多个页中 • 每次提供多页,例如:在这里以10页为单位向用户提供结果 • 用户可以随意选择页数 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 22. 首页 输入 : 顾客姓名 SELECT /*+ index(w cust_name_idx) */ ROWIDTOCHAR(rowid) rid, cust_name,… FROM cust_table w WHERE :v2 = 'FIRST' AND cust_name like :v1 || '%' AND rownum <= 25 查询 : ‘>=‘ UNION ALL SELECT /*+ use_concat index (x cust_name_idx) */ ROWIDTOCHAR(rowid) rid, cust_name,… 下一页 FROM cust_table x 上一页 / 下一页 WHERE :v2 = 'NEXT' AND (cust_name > :v3 OR (cust_name = :v3 AND rowid > CHARTOROWID(:v4))) AND cust_name like :v1||'%' 索引 : cust_name_idx(cust_name) AND rownum <= 25 non-unique UNION ALL SELECT /*+ use_concat index_desc(y cust_name_idx) */ ROWIDTOCHAR(rowid) rid, cust_name,… FROM cust_table y WHERE :v2 = 'PREV' 上一页 AND (cust_name < :v3 OR (cust_name = :v3 AND rowid < CHARTOROWID(:v4))) AND cust_name like :v1 || '%' AND rownum <= 25 ORDER BY cust_name, rid; 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 23. 1 341 2 321 3 301 4 281 … 8 201 9 181 每页 : 20行 10 161 11 141 12 121 13 101 14 81 … 18 1 每个set : 10页 • SQL解决方案 • 开始点 : 留言板编号(bbs_id) + ① 在进行SET移动时,需要查找页的列表和开始点 留言日期(cre_dt) + 留言编号(num) ② 查找具有特定开始点的页 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 24. 处理目录列表的SQL 处理特定页的SQL SELECT rnum, bbs_id, cre_dt, num FROM ( SELECT /*+ USE_CONCAT INDEX_DESC(a bbs_idx1) */ SELECT /*+ USE_CONCAT INDEX_DESC(a bbs_idx1) */ ROWNUM rnum, bbs_id, cre_dt, num …………… (a) bbs_id, cre_dt, num, c_text FROM BILLBOARD a FROM BILLBOARD a WHERE :sw = 'NEXT' WHERE bbs_id = :bbs AND bbs_id = :v_bbs AND ( cre_dt < :v_init_dt AND ( cre_dt < :v_init_dt OR ( cre_dt = :v_init_dt OR ( cre_dt = :init_dt AND num <= :v_num) ) AND num <= :v_num) ) AND ROWNUM <= 201 AND ROWNUM <= 20; UNION ALL SELECT /*+ USE_CONCAT INDEX_ASC(a bbs_idx1) */ ((20*10)+2 - ROWNUM) rnum,bbs_id,cre_dt,num …… (b) FROM BILLBOARD a WHERE :sw = 'PREV' AND bbs_id = :v_bbs AND (cre_dt > :v_init_dt OR (cre_dt = :v_init_dt AND num >= :v_num ) ) AND ROWNUM <= 201 ) WHERE rnum IN (1, 21, 41, 61, 81, 101,121, 141, 161, 181, 201)…… (c) ORDER BY rnum ; 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 26. Declare Cursor Fetch Cursor IF SELECT SELECT INSERT SELECT UPDATE 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 27. Cursor SQL 优化方案 Declare Cursor 改变表连接方式 : Hash, NL Join, … 改变表连接顺序 Fetch Cursor 改变读取方式 : Full Scan, Index Scan, … 使用并行处理方式 IF SELECT SELECT Loop SQL 优化方案 INSERT SELECT 对个别SQL进行优化 :修改和追加索引 应用Array Process UPDATE 将LOOP循环中的SQL语句向Cursor SQL合并 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 28. FLD1 NUM1 FLD2 NUM2 TABLE2.ROWID NUM1 NUM2 DATA1 100 O X ROWID3 300 100 ..... ......... DATA2 200 O X ..... S ......... ROWID4 70 200 ........ ... ... ..... ......... DATA3 300 O O DATA3 100 ..... O ......... ROWIDn ... ... DATA4 70 O O DATA4 200 ..... ......... ..... R ......... NULL 100 ……….. …. ………. ……….. …. ..... ......... NULL 200 ..... T ......... DATAn 600 O O DATAn 900 ........ ... ... ..... ......... ... ... NULL TABLE1 TABLE2 BUFFER 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 29. #define ARRAY_SIZE 100 … EXEC SQL DECLARE C1 CURSOR FOR SELECT a.num1, a.fld1, b.rowid FROM TABLE1 a, TABLE2 b WHERE a.fld1 = b.fld2(+) ORDER BY B.ROWID ; … EXEC SQL OPEN c1; while (1) { EXEC SQL FETCH c1 INTO :v_num1,:v_fld1,:v_rowid,:i_rowid; loop = sqlca.sqlerrd[2] - num_ret; num_ret = sqlca.sqlerrd[2]; /* Reset the number */ /* rowid is null at the fist row fetched */ if ( i_rowid[0] == -1 ) { process_up_ins(0); /* INSERT ONLY */ } else { /* rowid is null at the last row fetched */ if ( i_rowid[loop - 1] == -1 ) { process_up_ins(1); /* UPDATE AND INSERT BOTH */ } else { process_up_ins(2); /* UPDATE ONLY */ } } EXEC SQL COMMIT WORK; if (sqlca.sqlcode == 1403) break; } EXEC SQL CLOSE c1; EXEC SQL COMMIT WORK RELEASE; } process_up_ins(int proc_flag ) { if (proc_flag == 2) { EXEC SQL FOR :loop UPDATE TABLE2 SET num2 = num2 + :v_num1 WHERE ROWID = :v_rowid; } else if (proc_flag == 1) { EXEC SQL FOR :loop INSERT INTO TABLE2 SELECT :v_fld1, :v_num1 FROM dual WHERE :v_rowid IS NULL; EXEC SQL FOR :loop UPDATE TABLE2 SET num2 = num2 + :v_num1 WHERE :v_rowid IS NOT NULL AND ROWID = :v_rowid; } else { EXEC SQL FOR :loop INSERT INTO TABLE2 VALUES ( :v_fld1, :v_num1 );} } 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 30. DECLARE CURSOR C1 IS DECLARE CURSOR C1 IS SELECT A.PLYNO , A.AW_PYDT, B.AV_YYMM, A.INCM_PRM_CR_SEQNO, SELECT /*+ ORDERED USE_HASH(BJ CR) PARALLEL(BJ 5) PARALLEL(CR 5) */ A.AW_CR_SEQNO, A.AW_BEN_STFNO, B.BZ_ATRCD BJ.AW_CR_SEQNO, BJ.AW_BEN_STFNO FROM SAM_CSCL_AW_PY_BJ_STF A, SAM_AW_CC_ACHV_STF B , BJ.BZ_ATRCD, BJ.AW_PYAMT, BJ.PRPN_AW_FLGCD, CR.IKD_GRPCD WHERE A.AW_PYDT = '$$AW_PYDT' AND A.IKD_GRPCD IN ('LA', 'SA') , CR.INS_IMCD, CR.GDCD, CR.CE_STFNO, CR.DH_STFNO AND A.AW_BEN_STFNO = B.STFNO AND B.STF_FLGCD <> '01‘ ... ORDER BY AW_BEN_STFNO; FROM ( SELECT A.PLYNO , A.AW_PYDT, B.AV_YYMM, A.INCM_PRM_CR_SEQNO … , A.AW_CR_SEQNO, A.AW_BEN_STFNO, B.BZ_ATRCD FROM SAM_CSCL_AW_PY_BJ_STF A, SAM_AW_CC_ACHV_STF B OPEN C1; WHERE A.AW_PYDT = '$$AW_PYDT' AND A.IKD_GRPCD IN ('LA', 'SA') LOOP AND A.AW_BEN_STFNO = B.STFNO AND B.STF_FLGCD <> '01‘ FETCH C1 ) BJ, SAM_AW_CR CR INTO V_PLYNO, V_AW_PYDT, V_INCM_PRM_CR_SEQNO, …; WHERE BJ.PLYNO = CR.PLYNO AND BJ.INCM_PRM_CR_SEQNO = … CR.INCM_PRM_CR_SEQNO SELECT … INTO … AND BJ.AW_CR_SEQNO = CR.AW_CR_SEQNO FROM SAM_AW_CR CR ORDER BY BJ.AW_BEN_STFNO; WHERE CR.PLYNO = V_PLYNO … AND CR.INCM_PRM_CR_SEQNO = V_INCM_PRM_CR_SEQNO; LOOP FETCH C1 … INTO V_PLYNO, V_AW_PYDT, V_INCM_PRM_CR_SEQNO, …; SELECT COUNT(*) INTO V_CNT FROM SAM_AW CHR CR SELECT COUNT(*) INTO V_CNT WHERE CR.PLYNO = V_PLYNO FROM SAM_AW CHR CR AND CR.INCM_PRM_CR_SEQNO = V_INCM_PRM_CR_SEQNO + 1; WHERE CR.PLYNO = V_PLYNO AND CE.INCM_PRM_CR_SEQNO = V_INCM_PRM_CR_SEQNO + 1; IF(V_CNT > 0) UPDATE SAM_AW CHR SET … ; ELSE INSERT INTO SAM_AW CHR VALUES (…) ; IF(V_CNT > 0) UPDATE SAM_AW CHR SET … ; END IF; ELSE INSERT INTO SAM_AW CHR VALUES (…) ; … END IF; END LOOP; END LOOP; COMMIT; COMMIT; CLOSE C1; CLOSE C1; 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 31. DECLARE v_counter NUMBER := 2; v_exist NUMBER := 0; BEGIN INSERT INTO DC_TEST LOOP SELECT * INSERT INTO DC_TAB SELECT A.RNUM, A.RK, B.BILL_AMNT OLD_BILL_AMNT, A.DC_RATE, A.DC_AMNT, FROM DC_TEST (CASE WHEN A.DC_RATE IS NOT NULL THEN B.BILL_AMNT * (A.DC_RATE / 100) MODEL WHEN A.DC_AMNT IS NOT NULL DIMENSION BY (RNUM) THEN A.DC_AMNT END) RESULT_DC_AMNT, MEASURES (RK, BILL_AMNT, DC_RATE, DC_AMNT, -1 B.BILL_AMNT - START_AMNT, (CASE WHEN A.DC_RATE IS NOT NULL 0 DC, 0 DC_RESULT) THEN B.BILL_AMNT * (A.DC_RATE / 100) WHEN A.DC_AMNT IS NOT NULL RULES THEN A.DC_AMNT END) BILL_AMNT ( FROM HJH_TEST_00 A DC_RESULT[ANY] ORDER BY RNUM = , HJH_TEST_01 B (CASE WHEN DC_RATE[CV()] IS NOT NULL WHERE A.RNUM = v_counter THEN NVL(DC_RESULT[CV()-1], AND B.RNUM = v_counter /* A.RNUM – 1 */ AND B.BILL_AMNT > 0; BILL_AMNT[CV()]) - (NVL(DC_RESULT[CV()-1], BILL_AMNT[CV()]) * SELECT COUNT(*) DC_RATE[CV()]/100) INTO v_exist WHEN DC_AMNT[CV()] IS NOT NULL FROM DC_TAB WHERE RNUM = v_counter THEN NVL(DC_RESULT[CV()-1], AND ROWNUM = 1; BILL_AMNT[CV()]) - DC_AMNT[CV()] END), IF v_exist = 0 THEN DC[ANY] ORDER BY RNUM = NVL(DC_RESULT[CV()-1], EXIT; END IF; BILL_AMNT[CV()]) - DC_RESULT[CV()], v_counter := v_counter + 1; START_AMNT[ANY] ORDER BY RNUM = NVL(DC_RESULT[CV()-1] BILL_AMNT[CV()]) END LOOP; ) COMMIT; ORDER BY RNUM END; / 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 32. SP_1 SP_2 SP_3 SP_4 SP_5 SP_6 SP_12 SP_11 SP_10 SP_9 SP_8 SP_7 SP_ 2 SP_ SP_ Critical Path 3 4 SP_ SP_ SP_ SP_ SP_1 1 5 7 9 1 SP_ SP_ 8 6 SP_1 SP_1 0 2 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 35. LOOP Black Box Read Write SELECT "ZKNTYP" FROM "ZXSPZLB" WHERE "MANDT" = :A0 AND "ZKNTYP " = :A1 Join 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 36. SELECT /*+ FIRST_ROWS */ "ADDRNO" FROM "ZCMT0006" WHERE "MANDT" = :A0 AND "BUKRS" = :A1 AND "CITY" = :A2 AND "GU" = :A3 AND "DONG" = :A4 AND "ADDR1" = :A5 AND "ADDR2" = :A6 AND ROWNUM <= :A7 Rows Execution Plan --------- --------------------------------------------------- 74 COUNT (STOPKEY) 74 TABLE ACCESS (BY INDEX ROWID) OF 'ZCMT0006' 444110 INDEX (RANGE SCAN) OF 'ZCMT0006~0' (UNIQUE) 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 38. CE4CJ00~1 : MANDT+AKTBO+KNDNR+ARTNR+BUKRS+WERKS+VTWEG CE4CJ00~ENC2 : COPA_KOSTL+KMVKGR+KMVKBU+WW004+WW007 call count cpu elapsed disk query current rows call count cpu elapsed disk query current rows ----- ------ ------ ------- ------ ------- -------- ------ ------ ------ ------ ------- ------ ------ ------- ------ Parse 1 0.03 0.03 0 0 0 0 Parse 1 0.19 0.19 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 2 0.00 0.04 8 24 0 12 Fetch 2 7.29 18.28 8377 26389 0 12 ----- ------ ------ ------- ------ ------- -------- ------ ------ ------ ------ ------- ------ ------ ------- ------ total 4 0.03 0.07 8 24 0 12 total 4 7.48 18.47 8377 26389 0 12 Rows Execution Plan Rows Execution Plan ------ ------------------------------------------------- ------- ------------------------------------------------ 0 SELECT STATEMENT GOAL: CHOOSE 0 SELECT STATEMENT GOAL: CHOOSE 16 TABLE ACCESS (BY INDEX ROWID) OF 'CE4CJ00' 34010 TABLE ACCESS (BY INDEX ROWID) OF 'CE4CJ00' 24 INDEX (RANGE SCAN) OF 'CE4CJ00~ENC2'(NON- 34011 INDEX (RANGE SCAN) OF 'CE4CJ00~1' (NON-UNIQUE) UNIQUE) 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 39. SELECT * FROM "DBVM" WHERE "MANDT" = :A0 AND "MAFID" = :A1 AND "DISST" = :A2 AND "MATNR" > :A3 AND "BERID" = :A4 AND "MPSKZ" = :A5 AND ( "GSAEN" = :A6 OR "RHYTD" > :A7 AND "RHYTD" <= :A8) ORDER BY "MANDT" , "MAFID" , "DISST" , "MATNR" SELECT * FROM "DBVM" WHERE "MANDT" = :A0 AND "MAFID" = :A1 AND "DISST" = :A2 AND "MATNR" IN (SELECT “MATNR” FROM “MAWA” WHERE “MANDT” = :A0 AND “MATNR” > :A3 ) AND "BERID" = :A4 ………………… 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 42. SELECT …… FROM RQHD WHERE "MANDT" = :A0 AND "MATNR" = :A1 AND "PLWRK" = :A2 Execution Plan ------------------------------------------ SELECT STATEMENT GOAL: CHOOSE TABLE ACCESS (BY INDEX ROWID) OF ‘RQHD' INDEX (RANGE SCAN) OF 'RQHD~0' (UNIQUE) 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 43. SELECT … FROM STKO WHERE "MANDT" = '100' AND "STLTY" = 'M' I T A AND "STLNR" = '00001842' N D B AND "LOEKZ" = 'X' E L X E 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 44. SELECT /*+ ORDERED USE_HASH( T01 T3 ) FULL(T3) */ SELECT VKONT, GPART, OPBUK, ZAHLKOND T02.OPBUK, T02.VKONT, T02.GPART, T02.OPBEL, FROM FKKVKP T02.ZAHLKOND, T02.FAEDN, T02.STUDT, T3.TEXT WHERE EZAWE = 'D' FROM ( SELECT T01.OPBUK, T01.VKONT, T01.GPART, T01.OPBEL, … AND VKONT IN P_VKONT -- 입력값 FROM ( SELECT /*+ ORDERED USE_HASH( T00 T2 ) FULL(T2) */ LOOP AT I_FKKVK . ROWNUM,T00.VKONT, T00.GPART, T00.OPBUK, …… CONCATENATE I_FKKVK-VKONT I_FKKVK-GPART INTO LOOBJ1. T2.OPBEL||T2.OPUPW||T2.OPUPK||T2.OPUPZ LOOBJ1 SELECT SINGLE * FROM ( SELECT T0.VKONT, T0.GPART, T0.OPBUK, T0.ZAHLKOND FROM DFKKLOCKS FROM ( SELECT ROWNUM, VKONT||GPART VKONT_1 , …… WHERE LOOBJ1 = LOOBJ1 AND ……. FROM FKKVKP WHERE EZAWE='D') T0 CHECK SY-SUBRC <> 0 . WHERE T0.VKONT_1 IS NOT NULL SELECT * AND T0.VKONT_1 NOT IN (SELECT /*+ HASH_AJ */ T1.LOOBJ1 FROM DFKKOP FROM DFKKLOCKS T1 WHERE VKONT = I_FKKVK-VKONT AND ……. WHERE T1.LOTYP = '06' AND …… CONCATENATE DFKKOP-OPBEL DFKKOP-OPUPW …… INTO LOOBJ1. AND T1.LOOBJ1 IS NOT NULL ) SELECT SINGLE * ) T00, DFKKOP T2 FROM DFKKLOCKS WHERE T2.MANDT='100' WHERE LOOBJ1 = LOOBJ1 AND …… . AND T2.VKONT = T00.VKONT AND T2.AUGST = ' ' IF SY-SUBRC <> 0 . AND T2. …… ) T01 …… . WHERE T01.LOOBJ1 IS NOT NULL ENDLOOP /* END OF LOOP AT I_FKKVK*/ AND T01.LOOBJ1 NOT IN ( SELECT /*+ HASH_AJ */ LOOBJ1 FROM DFKKLOCKS T3 LOOP AT I_TAB . WHERE LOTYP = '02' SELECT SINGLE * AND …… FROM TE052T …… . AND T3.LOOBJ1 IS NOT NULL ) …… ) T02, TE052T T3 ENDLOOP . /* END OF LOOP AT I_TAB WHERE T3.MANDT='100' AND T3.SPRAS = '3' SORT ITAB BY OPBUK ZAHLKOND VKONT OPBEL. AND T3.ZAHLKOND = T02.ZAHLKOND …… RESULT WIRTE ORDER BY T02.OPBUK, T02.ZAHLKOND, T02.VKONT , T02.OPBEL 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 45. call count cpu elapsed disk query current rows ------- -------- -------- ---------- ---------- ---------- ---------- ---------- Parse 140564 244.16 317.85 11 428 2 0 Execute 10526260 1874.77 4142.31 269624 1200526 2093534 668250 Fetch 10082824 58678.25 120332.29 53229657 504289814 876338 25637960 ------- ------- -------- ---------- ---------- ---------- ---------- ---------- total 20749648 60797.18 124792.45 53499292 505490768 2969874 26306210 164520 user SQL statements in session. call count cpu elapsed disk query current rows ------- -------- -------- ---------- ---------- ---------- ---------- ---------- Parse 170436 282.42 311.26 0 0 0 0 Execute 4744591 1098.02 2787.62 143193 380570 2760825 1072739 Fetch 4330992 10981.92 28401.65 12803058 136858937 86515 10953876 ------- -------- -------- ---------- ---------- ---------- ---------- ---------- total 9246019 12362.36 31500.53 12946251 137239507 2847340 12026615 177815 user SQL statements in session. 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 48. SUMMARY TABLE SIMULATION (案例) 投保 费率 前加 保险 特约 年龄 加入 年龄 追加 法人 短期 有偿 共同 受理人 排气 扣除 混合 车辆 审查 加入 加入 项目 时间 公司 车型 用途 性别 人年 地区 变化 职业 车名 寿命 入公 单位 种类 费率 限制 阅历 区分 优惠 类型 率 运输 使用 身份 量 金额 编码 价格 次数 类型 金额 龄 时间 司 行数计算内容 行数 序号 100 800 15 57 2 5 2 3 4 5 47 166 13 6 14 4 5 5 8 85 10 200 10 5 5 9 17 4 3 17 15 28 1 2 3 4 100 * 145 * 4 58,000 29 1 2 3 4 100 * 64(公司专用车除外) * 5 32,000 30 1 2 3 4 100 * 64(업무용전차종중 승용차 제외) * 5 32,000 31 1 2 3 4 100 * 145/2(일반만 볼 경우로 상정) * 17 123,250 32 1 2 3 4 100 * 40(개인용4+업무용36:일반만 ) * 17 68,000 33 1 2 3 4 100 * 8(개인용 보종*차종) * 15 12,000 34 1 2 5 3 4 100*2(개인용)*3(연령한정)*47(연령)*2(성별) 56,400 35 1 2 5 3 4 100*6(개인용제외)*3*5(피보험자연령구분)*2 18,000 36 1 2 3 4 100 * 2(개인용) * 5(연령구분) * 85(직업) 85,000 37 1 2 3 4 100 * 2 * 5 * 127(차명) 127,000 38 1 2 3 4 5 100 *2(개인용) *4(차종) *2(용도) *2(특약) 3,200 39 1 2 3 4 5 100 * 1(일반만) * 4 * 2 * 2 * 47(연령) 75,200 40 1 2 3 145(개,업,영,이의 차종) * 166 24,070 41 1 2 3 145 * 14(단기율) 2,030 42 1 2 3 145 * 85(직업) 12,325 8(개인용차종)* 127(차명)* 3(한차량의 배기량 1 2 3 4 5 15,240 43 종류)* 5(혼합코드) 44 1 2 4 3 145 * 15 * 5 10,875 45 1 2 4 3 145 * 15 * 9 19,575 1 2 4 3 145 * 71(차종에 해당되는 지역 평균) * 5(연령) 51,475 46 47 1 2 3 4 145 * 71 * 2(유상운송 평균) 20,300 48 1 2 3 4 145 * 71 * 2(공동사용 평균) 20,300 1 2 3 4 73(일반만,145/2)*71*17(향후 특정 건수 고려) 87,508 49 50 1 2 3 3 4 8(개인용 차종) * 85(직업) * 127(차명) 86,360 51 1 2 4 6 5 3 8 * 85 * 2(용도) * 5(연령구분) * 2(성별) 13,600 52 1 2 5 4 6 3 8*127(차명) * 2(성별) * 2(용도) * 4(가입경력) 16,256 53 1 2 5 4 3 145 * 6(담보별) * 9(차량가액) * 10(차령) 78,300 54 1 2 3 4 7 5 6 8*2* 2(특약)*5(연령구분)*166(지역)*2(성별) 53,120 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 49. 以当前时点查询过去合计表(案例) 201103 140 50 …… 340000 201103 120 10 …… 340000 201103 120 ………. 1234000000 201103 130 ………. 2156000000 201103 140 ………. 2302100000 201103 120 …… 1234000000 201103 120 …… -340000 201103 140 …… +340000 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 50. ROLAP的QUERY Optimizing ... DEPTNO R Y E J YEAR G D E O JOB I E A B O P G REGION R N T E GENDER N N O D SALE_AMT E ... R 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 52. 灵活运用位图的数据模型和SQL 持续 增加 1 对合同底账中的属性进行管理 属性非常多 处理过程比较复杂 非常 之多! 2 对合同底账表进行1:1垂直分割 属性非常多 很难维持追加和修改 处理过程比较复杂. 在大量的知识信 息中,为了便于 处理而使用FLAG 3 对合同底账表进行1:1垂直分割(元数据管理) 属性个数减少,适应性增强 行的增加和条件处理比较困难 4 在一个列中以Byte为单位来组建Flag 全部作为一个属性来处理 追加和修改容易. 在有些情况下处理起来比较复杂 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 53. 灵活运用位图的数据模型和SQL FLAG Column Value 1 2 3 4 5 6 7 8 9 10 … 200 数据模型的类型 1 1 0 0 0 1 1 0 0 0 0 1 最初创建时将所有FLAG的 值都设置为默认值 ‘0’ Y 1 N 0 利用一个 可变长度 FLAG列替代 特定账户的 全部的与否列 FLAG值 FLAG META DATA 编号 列说明 列名 修改代码 值 1 압류및법적제한与否 LEGAL_LIMIT 1001 Y 2 통장증서분실도난与否 BOND_LOSS 1002 Y 逻辑关系 3 인감분실도난与否 SEAL_LOSS 1003 N 指定列的 4 현금카드분실도난与否 CARD_LOSS 1004 N 位置 5 전부지급정지与否 PAY_REFUSAL 1005 N 6 일부지급정지与否 PART_REFUSAL 1006 Y 7 입금금지与否 RECEIPT_REJECT 1009 Y 8 NET지급금지与否 NETPAY_REJECT 1008 N 利用属性管理时 9 경찰망연계与否 POLICE_CONNECT 1009 N 原来列的名称 10 당행질권설정与否 MORTGAGER_SW 1010 N 管理元数据信息中BIT的 位置和名称 …… ……………………… ………………… … 200 EDI계좌与否 EDI_ACCOUNT 1910 Y 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 54. 灵活运用位图的数据模型和SQL FLAG META DATA 帐号 FLAGs NO COLUMN COL CHG_CD DESCRIPTION 123-45-67 1000010100 1 압류및법적제한与否 LEGAL_LIMIT 1001 SELECT 2 통장증서분실도난与否 BOND_LOSS 1002 SELECT SUBSTR(FLAGS,3,1) SEAL_LOSS 3 인감분실도난与否 SEAL_LOSS 1003 FROM ACCOUNTS WHERE ACCT_NO = ‘123-45-67’ 4 현금카드분실도난与否 CARD_LOSS 1004 须要时可 SELECT SUBSTR(FLAGS,NO,1) SEAL_LOSS 5 전부지급정지与否 PAY_REFUSAL 1005 FROM ACCOUNTS a, FLAG_META b 以使用变量 6 일부지급정지与否 PART_REFUSAL 1006 WHERE ACCT_NO = ‘123-45-67’ AND COL = ‘SEAL_LOSS’ 7 입금금지与否 RECEIPT_REJECT 1009 8 NET지급금지与否 NETPAY_REJECT 1008 UPDATE (直接指定) 1003 경찰망연계与否 POLICE_CONNEC 1009 UPDATE ACCOUNTS 9 T SET FLAGS = SUBSTR(FLAGS,1,3-1)||'1'||SUBSTR(FLAGS,3+1) …… ……………………… ………………… WHERE ACCT_NO = '123-45-67' UPDATE (N个同时处理) BYPASS_UJVC提示 UPDATE /*+ bypass_ujvc */ 为了实现'Updatable Join View‘ ( SELECT ACCT_NO, FLAGS, SUBSTR(FLAGS,1,NO-1)||‘1’||SUBSTR(FLAGS,NO+1) DD, • 能够进行表连接的表是1:1关系或1:M关系 NO • 将Parent table的连接列设置为UK或PK FROM ACCOUNTS a, FLAG_META b WHERE ACCT_NO = '123-45-67' • 可以被Update的列的表是M边的集合 AND CHG_CD = '1009' Join View 如果无法满足该条件则会出现错误 ) SET FLAGS = DD; 2 个选择 使用提示可以避免该制约事项,且可以顺利执行UPDATE 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 55. A B C D E F G No Title A B C D E F G % 1 ABCDEFG 2 … % A B C D E F G … … A B C D E F G % 通过复制生成数据 No SubNo Sub Title A B C D E F G 1 1 ABCDEFG A B C D E F G 1 2 BCDEFG A B C D E F G 1 3 CDEFG 1 4 DEFG A B C D E F G 1 5 EFG 1 6 FG 1 7 G 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 57. Non Partition Table Partition Table SELECT 月, SUM (月销售额) SELECT 月, SUM (月销售额) FROM 销售 . FROM 销售 . WHERE 日期 LIKE ‘2010%’ . WHERE 日期 LIKE ‘2010%’ GROUP BY 月 GROUP BY 月 2007 2008 数据读 2008 取范围 2009 2009 使用 Range Partition 有效数据范围 2010 数据读取范围 2010 有效数据范围  虽然表中有10亿行数据,但只读取了其中的1亿行  读取10亿行数据后,由于满足日期为2010的数据仅为1亿行,  处理海量数据时,如使用索引则会发生大量随机读取,从而严重 所以扔掉了9亿行数据,效率非常低下(使用索引没有任何意义) 影响性能,因此使用全表扫描反倒比较有效。尤其在分区表使用全  使用索引反倒会影响性能 表扫描有利于提高性能。 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 58. Partition Exchange DUMMY_FACT 500万行 P_200704 500万行 P_200705 DUMMY_FACT (500万行) DUMMY_FACT 500万行 Partition P_200706 Exchange 修改对象为 300万行 … P_200706 DUMMY_FACT 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 59. 扩展UPDATE 语句应用(1) 扩展UPDATE 语句应用(2) – 防止空更新 TABLE4 TABLE3 TABLE2 # ORD_ID # DATE3 # ITEM QTY4 QTY3 COL2 COL4 COL3 FLD2 …… FLD3 …… …… UPDATE table1 x TABLE1 # PROD SET col1 = ( SELECT nvl(x.col1,0) + nvl(y.fld1,0) COL1 QTY1 FROM table2 y …… WHERE y.key = x.key ) UPDATE TABLE3 t3 SET WHERE …………………………. (COL3, FLD3, QTY3, ..........) = and exists ( select ‘ ‘ from table2 z (SELECT decode(COL2, '1', substr(COL4,1,4)), where z.key = x.key. ) nvl(FLD3,0) + nvl(QTY2,0)*100 / nvl(QRY4,1), decode(FLD4, '1', nvl(QTY2,0)*0.01, '2', nvl(QTY2,0)*0.05)-nvl(QTY3,0)) UPDATE table1 x FROM TABLE2 t2, TABLE4 t4 SET col1 = ( SELECT nvl(x.col1,0) + nvl(MIN(y.fld1),0) WHERE t2.ITEM = t3.ITEM FROM table2 and t4.ORD_ID = t3.ORD_ID ) WHERE ITEM IN ( SELECT ITEM WHERE y.key = x.key ) FROM TABLE2 WHERE ………………………….; WHERE PROD IN ( SELECT PROD FROM TABLE1 在连接成功的表中,必须只能对有键值的表进行修改 CONNECT BY PROD = PRIOR MPROD SELECT * FROM USER_UPDATABLE_COLUMNS START WITH MPROD = :PROD ) ) ; WHERE TABLE_NAME = ‘TABLE_V 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 60. 批处理优化核心技术及案例 – 扩展MERGE应用 优化前 EXEC SQL DECLARE C1 CURSOR FOR SELECT A.JONGCODE, A.CPRICE, B.ROWID FROM DPRICE_C A, DSUM_S B SQL语句只被执行一次 WHERE A.JONGCODE LIKE '45%' ( 总结果为3000万行) AND A.JONGCODE = B.JONGCODE(+) AND A.CDATE = B.CDATE(+); EXEC SQL OPEN C1; FOR (;;) { EXEC SQL FETCH C1 INTO :V_JONGCODE, :V_CPRICE, :V_DSUM_ROWID; IF (SQLCA.SQLCODE == 1403) BREAK; EXEC SQL 更新1000万行数据时 UPDATE DSUM_S SET CSUM = CSUM + :V_CPRICE, .. 反复处理3000万行数据 WHERE ROWID = :V_DSUM_ROWID; IF (SQLCA.SQLCODE == 1403) EXEC SQL 插入2000行数据时 INSERT INTO DSUM_S 反复处理2000万行数据 VALUES ( :V_JONGCODE, '19940829', :V_CPRICE); 反复处理3000万行数据 EXEC SQL COMMIT WORK; 消耗大量时间 } (消耗的时间最少为 8个小时) EXEC SQL CLOSE C1; EXEC SQL COMMIT WORK RELEASE; 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 61. 批处理优化核心技术及案例 – 扩展MERGE应用 优化后 MERGE /*+ USE_HASH(Y X) PARALLEL(Y 20) FULL(X) PARALLEL(X 20) */ INTO DSUM_S X USING DPRICE_C Y ON (Y.JONGCODE LIKE '45%‘ AND Y.JONGCODE = X.JONGCODE AND Y.CDATE = X.CDATE ) WHEN MATCHED THEN 该SQL语句只需要被执行一次, UPDATE 消耗时间得到了大量缩减 SET X. CSUM = Y.V_CPRICE, (最多消耗时间为30分) ... WHEN NOT MATCHED THEN INSERT VALUES (Y.JONGCODE, '19940829', Y._CPRICE); 使用MERGE的情况下,表‘DPRICE_C’中的数量较少,表‘DSUM_S’中的数据量较多,在使用索引容易增加成本 开销的情况下,使用HASH JOIN效果会比较明显 重要的是以表‘DPRICE_C’为基准与表‘DSUM_S’执行外连接 可以使用并行处理来进行更新 将前面的批处理程序中所嵌套的多个SQL语句合并为一个SQL语句 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办
  • 62. Web Server Web Server WAS Server WAS Server DB Server DB Server 数据库系统优化管理研讨沙龙-上海站 ITPUB ChinaUnix IXPUB主办