几种内表更新方式的性能比较
*@---------------------------------------------------------------------*
*@ Report? ZTESTXUE23 幾種內表更新的性能比較
*@ T-code
*@---------------------------------------------------------------------*
*@? Created by Xavery Hsueh(薛現軍) on2013-06-29
*@
*@ Lasted Edited date:
*@---------------------------------------------------------------------*
REPORT? zcor016 NO STANDARD PAGE HEADING.
************************************************************************
**? 聲明數據庫表 Declaration ofdatabase?????????????????????????????**
************************************************************************
TABLES:coep,
??????coss.??? "
************************************************************************
**? 定義結構類型 Define the structure'stype?????????????????????????**
************************************************************************
TYPES:BEGIN OF typ_result,
???????vbeln TYPE vbeln,
???????posnr TYPE posnr,
???????matnr TYPE matnr,
???????menge TYPE menge_d,
???????dmbtr TYPE dmbtr,
?????END OF typ_result.
************************************************************************
**? 定義變量與內表 Define the variants and Internaltables???????????**
************************************************************************
DATA:gt_result TYPE TABLE OF typ_result WITH HEADER LINE.
FIELD-SYMBOLS: TYPE typ_result.
DATA:g_index TYPE sy-index.
************************************************************************
**? 宏定義 Define themacro??????????????????????????????????????????**
************************************************************************
DEFINE mcr_range.
? clear &1.
? &1-sign = 'I'.
? &1-option = &2.
? &1-low = &3.
? &1-high = &4.
? append &1.
END-OF-DEFINITION.
************************************************************************
**? 選擇屏幕 Customize theselection-screen??????????????????????????**
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLEtext-001.
PARAMETERS: p_box TYPE c.
SELECTION-SCREEN END OF BLOCK xavery.
************************************************************************
**? 執行程序事件 Executing the program'sevents??????????????????????**
************************************************************************
INITIALIZATION.
? PERFORM sub_init_cond.
START-OF-SELECTION.
? PERFORM sub_process_cond.
? PERFORM sub_test_fieldsymbol.
? PERFORM sub_test_index.
? PERFORM sub_test_table.
END-OF-SELECTION.
*@---------------------------------------------------------------------*
*@?????Form? SUB_INIT_COND
*@---------------------------------------------------------------------*
*??????初始化選擇條件
*----------------------------------------------------------------------*
FORM sub_init_cond .
ENDFORM.???????????????????" SUB_INIT_COND
*&---------------------------------------------------------------------*
*&?????Form? SUB_PROCESS_COND
*&---------------------------------------------------------------------*
*??????給測試內表添加數據
*----------------------------------------------------------------------*
FORM sub_process_cond .
? DO 200000 TIMES.
???gt_result-vbeln = sy-index.
???gt_result-posnr = '000010'.
??? APPENDgt_result.
? ENDDO.
ENDFORM.???????????????????" SUB_PROCESS_COND
*&---------------------------------------------------------------------*
*&?????Form? SUB_TEST_FIELDSYMBOL
*&---------------------------------------------------------------------*
*??????測試字段符的性能
*----------------------------------------------------------------------*
FORM sub_test_fieldsymbol .
? CHECK p_box = '1'.
? LOOP AT gt_result ASSIGNING .
??? -menge ='2000.000'.
??? -dmbtr ='1234.56'.
? ENDLOOP.
? WRITE:'測試完成'.
ENDFORM.???????????????????" SUB_TEST_FIELDSYMBOL
*&---------------------------------------------------------------------*
*&?????Form? SUB_TEST_INDEX
*&---------------------------------------------------------------------*
*??????測試索引的性能
*----------------------------------------------------------------------*
FORM sub_test_index .
? CHECK p_box = '2'.
? LOOP AT gt_result.
??? g_index =sy-tabix.
???gt_result-menge = '2000.000'.
???gt_result-dmbtr = '1234.56'.
??? MODIFYgt_result INDEX g_index.
? ENDLOOP.
? WRITE:'測試完成'.
ENDFORM.???????????????????" SUB_TEST_INDEX
*&---------------------------------------------------------------------*
*&?????Form? SUB_TEST_TABLE
*&---------------------------------------------------------------------*
*??????測試一般的更新性能
*----------------------------------------------------------------------*
FORM sub_test_table .
? CHECK p_box = '3'.
? LOOP AT gt_result.
???gt_result-menge = '2000.000'.
???gt_result-dmbtr = '1234.56'.
??? MODIFYgt_result.
? ENDLOOP.
? WRITE:'測試完成'.
ENDFORM.???????????????????" SUB_TEST_TABLE
上篇中的程序代碼的測度結果如何呢?為了保證準確性,本程序在周六大部分不工作的情況下,在DEV開發系統上進行了測試。測試結果如下:
?
第一組
Symbol-fields:
?
index
?
general
?
?
?
第二組
Symbol-fields:
?
index
?
general
?
?
第三組
Symbol-fields:
?
index
?
general
測試結果在我的意料之中,但可能在一部分人的意料之外。為什么使用索引反而不如不使用索引的情況下快呢?
?
先說第一種情況使用字段符。大家都知道,字段符相當于C語言的指針,相當于循環的過程中直接更改的內表內容,比通過更改工作區再更改內表的情況簡便了許多。所以性能比后面兩種情況快了許多。
?
為什么使用索引反而不發直接更新呢?這兒其實有一個理解誤區,就是一部分人認為更改內表的時候也是從內表的第一行開始逐一對比的。而實際情況并不如此,實際情況是循環過程中內表有一個字段sy-tabix,這個字段記錄了循環過程中的記錄索引數,直接更新內表時實際上已經使用了索引。我們人為地在更新內表時去指定索引,相當于畫蛇添足!
?
因此,在循環內表并更新內表數據時,大家切記:考慮性能的話就使用字段符,否則就直接更新記錄,千萬不要自做聰明地使用索引。使用索引相當于在程序中做了無用功,反而影響了程序的性能。
總結
以上是生活随笔為你收集整理的几种内表更新方式的性能比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更新自定义表时的通用锁对象
- 下一篇: SAP配置webdynpro完全手册