二维码

[性能] FOR ALL ENTRIES IN内表排序、排重对性能的影响

Twilight发表于 2014-07-23 15:31jiapengsan 最后回复于 2019-12-04 15:48 [复制链接] 23826 40

大家都知道for all entries in 关联内表时,要先判断内表不为空 否则会扫描全表,非常消耗服务器内存资源,那么内表关键字段的排序和排重对查询效率有没有影响呢?下面看一个例子
程序代码:
  1. DATA: it_mara TYPE STANDARD TABLE OF mara,
  2. wa_mara TYPE mara,
  3. it_makt TYPE STANDARD TABLE OF makt,
  4. wa_makt TYPE makt,
  5. it_temp_mara TYPE STANDARD TABLE OF mara,
  6. wa_temp_mara TYPE mara.
  7. * Get all the records from MARA
  8. SELECT *
  9. UP TO 100 ROWS
  10. FROM mara
  11. INTO TABLE it_temp_mara.
  12. IF sy-subrc = 0.
  13.   IF NOT it_temp_mara[] IS INITIAL.
  14. * 具有重复数据的内表
  15.     DO 1000 TIMES.
  16.       APPEND LINES OF it_temp_mara TO it_mara.
  17.     ENDDO.
  18.     IF NOT it_mara[] IS INITIAL.
  19. * Select MAKT
  20.       WRITE:/'内表中数据未经排序排重'.
  21.       PERFORM select_makt.
  22. * 排过序的内表
  23.       WRITE:/'内表中数据已排序未排重'.
  24.       SORT it_mara BY matnr.
  25.       PERFORM select_makt.
  26. * 删除了重复数据的内表
  27.       WRITE:/'内表中数据已排序并排重'.
  28.       DELETE ADJACENT DUPLICATES FROM it_mara COMPARING matnr.
  29.       PERFORM select_makt.
  30.     ENDIF.
  31.   ENDIF.
  32. ENDIF.
  33. *&---------------------------------------------------------------------*
  34. *& Form select_makt
  35. *&---------------------------------------------------------------------*
  36. * Select data friom MAKT
  37. *----------------------------------------------------------------------*
  38. FORM select_makt .
  39.   DATA: t1 TYPE i,
  40.   t2 TYPE i,
  41.   tmin TYPE i.
  42.   REFRESH it_makt[].
  43.   GET RUN TIME FIELD t1.
  44.   SELECT *
  45.   FROM makt
  46.   INTO TABLE it_makt
  47.   FOR ALL ENTRIES IN it_mara
  48.   WHERE matnr = it_mara-matnr.
  49.   GET RUN TIME FIELD t2.
  50.   tmin = t2 - t1.
  51.   tmin = tmin .
  52.   WRITE:/ ' Time(ms) = ', tmin.
  53. ENDFORM.                    "select_makt
复制代码

程序执行结果:
for all entries in.png
由上边的执行时间分析,可以得出以下结论:
游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

qshiou
leon大哥,用for all entries in 时不光是内表不能为空吧,我觉得应特别注明是内表中用于筛选的字段不能为空。我试过用内表的两个字段做筛选,有一个字段为空了,就会导致其他的选择条件都失效了。
回复 支持 反对

使用道具 举报

Twilight
qshiou 发表于 2015-7-22 09:40
leon大哥,用for all entries in 时不光是内表不能为空吧,我觉得应特别注明是内表中用于筛选的字段不能为 ...

for all entries in关联字段的值,如果都为空,就相当于内表为空,这样就相当没有这个限制,扫描全面,严重的话服务器会dump,这是一个严重的事故。
你可以使用ST05进行校验跟踪一下,论坛中有st05的使用方法
回复 支持 反对

使用道具 举报

qshiou
恩恩,leon大哥我以前出现过for all entries in关联字段的值如果有一个字段为空,好像就会不准确了,st05那个帖子好啊,以前对st05就不是特别懂 ,正在学习ing
回复 支持 反对

使用道具 举报

glb1197531
学习一下。
回复

使用道具 举报

晓月之影
感谢分享~~~~
回复

使用道具 举报

资明
f非常好,想看看
回复 支持 反对

使用道具 举报

cwyhhbx
感谢分享!学习学习!
回复 支持 反对

使用道具 举报

Anda
受教了,一般不会注意这种小细节
回复 支持 反对

使用道具 举报

yigerendelu

RE: FOR ALL ENTRIES IN内表排序、排重对性能的影响

谢谢大神,学习一下!
回复

使用道具 举报

SIMON

RE: FOR ALL ENTRIES IN内表排序、排重对性能的影响

感谢分享,谢谢楼主的分享
回复 支持 反对

使用道具 举报

XZ_P_0515

RE: FOR ALL ENTRIES IN内表排序、排重对性能的影响

结论是啥?
回复

使用道具 举报

teyun2222

感谢分享!学习了
回复

使用道具 举报

yeats2008
谢谢大神,学习一下!
回复

使用道具 举报

heqin
谢楼主分享
回复

使用道具 举报

一叶知秋

RE: FOR ALL ENTRIES IN内表排序、排重对性能的影响

看效果看效果
回复

使用道具 举报

h_ronin

RE: FOR ALL ENTRIES IN内表排序、排重对性能的影响

感谢大神分享,学习中
回复

使用道具 举报

wym3254228
Twilight 发表于 2014-7-23 15:31
大家都知道for all entries in 关联内表时,要先判断内表不为空 否则会扫描全表,非常消耗服务器内存资源, ...

挺好的能够学到东西
回复 支持 反对

使用道具 举报

wym3254228
Twilight 发表于 2014-7-23 15:31
大家都知道for all entries in 关联内表时,要先判断内表不为空 否则会扫描全表,非常消耗服务器内存资源, ...

结论是什么啊,怎么看不到啊?
回复 支持 反对

使用道具 举报

mas涓细流
谢谢分享,学习中
回复

使用道具 举报

123下一页

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表