近来做的程序数据都有几十万,上百万条记录。性能问题是一个难题,如何优化?

前一段时间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 )
 
可以试 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
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.
 
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 等也测试。找到问题点去修改。
posted on 2010-09-16 09:57  vibratea  阅读(410)  评论(0编辑  收藏  举报