近来做的程序数据都有几十万,上百万条记录。性能问题是一个难题,如何优化?
前一段时间ACCENTURE 的老师讲了一天关于优化的问题受益不小。
从近来开发的程序来看优化主要有以下几个方面。1.数据库查询 2.数据处理。
1.数据库查询:
当查询的最终数据比较少,而表内的数据比较多的时候,应该想办法把最能缩小范围的条件
放在前面查询。这样在后面的查询记录会少很多
对尽更能用关键字查询,有时可能用一个关键字和几个关键字查询的快慢会不一样,有一个同
事在查询一个有一百多万的数据是。用了几个关键字反而非常慢。减少了关键字还会快一些。可以
用ST05 里面的"一个SQL要求的说明"这个功能去测试用什么条件会更好。
SELECT
T_00 . "TPLNR" , T_00 . "TPLMA" , T_02 . "ANLAGE"
FROM
"IFLOT" T_00 INNER JOIN "EVBS" T_01 ON T_01 . "MANDT" = :A0 AND T_01 . "HAUS"
= T_00 . "TPLNR" INNER JOIN "EANL" T_02 ON T_02 . "MANDT" = :A1 AND T_02 . "VS
TELLE" = T_01 . "VSTELLE"
WHERE
T_00 . "MANDT" = :A2 AND T_02 . "ANLAGE" IN ( :A3 , :A4 , :A5 , :A6 , :A7 )
T_00 . "TPLNR" , T_00 . "TPLMA" , T_02 . "ANLAGE"
FROM
"IFLOT" T_00 INNER JOIN "EVBS" T_01 ON T_01 . "MANDT" = :A0 AND T_01 . "HAUS"
= T_00 . "TPLNR" INNER JOIN "EANL" T_02 ON T_02 . "MANDT" = :A1 AND T_02 . "VS
TELLE" = T_01 . "VSTELLE"
WHERE
T_00 . "MANDT" = :A2 AND T_02 . "ANLAGE" IN ( :A3 , :A4 , :A5 , :A6 , :A7 )
可以试 A2 A3 A4。。。。看看那样更快
2.数据处理
LOOP 中不要用SELECT 和 NEXT LOOP 。
若必须NEXT LOOP 最好能把要LOOP 的内表数据减到最小。如
LOOP A1
LOOP A2 WHERE X1 = A1-X AND X2 <> ''.
ENDLOOP
ENDLOOP.
这样可以把A2 的减小。如
DATA LI_A2 LIKE A2.
LI_A2 = A2.
DELETE LI_Z2 WHERE X2 = ''. 这样就减小了一部分数据。
在SE30 里的小提示与技巧中用到一个办法。如下:但前提是两个LOOP的内表都要按同一个字段进行排序,下面用的是K 这个字段。
* Entries: 100 (ITAB1), 1000 (ITAB2)
* Line width: 100
* Both tables sorted by key K
* Line width: 100
* Both tables sorted by key K
I = 1.
LOOP AT ITAB1 INTO WA1.
LOOP AT ITAB2 INTO WA2 FROM I.
IF WA2-K <> WA1-K.
I = SY-TABIX.
EXIT.
ENDIF.
" ...
ENDLOOP.
ENDLOOP.
LOOP AT ITAB1 INTO WA1.
LOOP AT ITAB2 INTO WA2 FROM I.
IF WA2-K <> WA1-K.
I = SY-TABIX.
EXIT.
ENDIF.
" ...
ENDLOOP.
ENDLOOP.
READ TABLE 当只查询一条记录用read table 不用要LOOP,而且用
BINARY SEARCH 。注意用
BINARY SEARCH 的时候一定要先按照
read table 后面的条件进行排序,不然得到就是错误的数据。
read table a1 with key x1 = 11 x2 = 33
BINARY SEARCH .
在上面这一句话着一定要做排序 sort a1 by x1 x2.
常用性能优化工具如SE30 ST05 ST12 等也测试。找到问题点去修改。