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主办
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主办
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主办
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主办
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主办
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主办
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主办
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主办
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主办
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主办