Abap 带有嵌套选择的非常慢的itab循环
我声明了一个内部表,如:Abap 带有嵌套选择的非常慢的itab循环,abap,opensql,internal-tables,Abap,Opensql,Internal Tables,我声明了一个内部表,如: DATA: wa_collectoraction TYPE zcollectoraction, it_collectoraction LIKE STANDARD TABLE OF zcollectoraction. 然后我在表格中填入: SELECT bukrs kunnr yearmonth MAX( dat ) AS dat FROM zcollectoraction INTO CORRESPONDING FIELDS OF TABLE it_collec
DATA: wa_collectoraction TYPE zcollectoraction,
it_collectoraction LIKE STANDARD TABLE OF zcollectoraction.
然后我在表格中填入:
SELECT bukrs kunnr yearmonth MAX( dat ) AS dat
FROM zcollectoraction
INTO CORRESPONDING FIELDS OF TABLE it_collectoraction
WHERE bukrs IN so_bukrs AND
kunnr IN so_kunnr AND
dat IN so_date
GROUP BY bukrs kunnr yearmonth.
最后我有下面的循环
LOOP AT it_collectoraction INTO wa_collectoraction.
PERFORM progress_bar USING 'Retrieving data...'(035)
sy-tabix
i_tab_lines.
"Get the MAX TIME for all lines in order to cover the case we have more than 1 line."
SELECT SINGLE * FROM zcollectoraction
INTO CORRESPONDING FIELDS OF wa_collectoraction
WHERE bukrs = wa_collectoraction-bukrs AND
kunnr = wa_collectoraction-kunnr AND
dat = wa_collectoraction-dat AND
time = ( SELECT MAX( time ) AS time
FROM zcollectoraction
WHERE bukrs = wa_collectoraction-bukrs AND
kunnr = wa_collectoraction-kunnr AND
dat = wa_collectoraction-dat ).
MODIFY it_collectoraction FROM wa_collectoraction.
ENDLOOP.
此循环对3000条记录执行5分钟。
有人能告诉我怎么做才能更快吗
提前感谢分析独立报告性能的最佳工具是ST12,因此如果有机会,请跟踪它。
如果没有痕迹,我们不得不猜测,最大的问题要么是选择子选择,要么是修改 1) 循环中的选择总是缓慢的 在这里,您实际上为
it\u collectoraction
中的每一行创建两个
尝试减少选择的数量
根据具有相同dat
的行数,将循环中的SELECT替换为循环外zcollectoraction
中的所有条目的SELECT,并在ABAP侧查找最大值(时间)可能会快得多
索引覆盖率
看起来很好
2) 修改标准表的速度很慢
你必须筛选整张表才能找到相关的行。如果将it\u collectoraction
定义为已排序,则速度会快得多。如果在循环中使用字段符号,则可以完全避免
编码
将您的循环替换为以下内容:
TYPES: BEGIN OF tty_coll_act,
bukrs TYPE burks,
kunnr TYPE kunnr,
dat TYPE dat,
time TYPE time,
END OF tty_coll_act.
DATA: lt_coll_act TYPE TABLE OF tty_coll_act,
ls_coll_act LIKE LINE OF lt_coll_act.
FIELD-SYMBOLS: <fs_collectoraction> LIKE LINE OF it_collectoraction.
SELECT bukrs kunnr dat time
INTO TABLE lt_coll_act
FROM zcollectoraction
FOR ALL ENTRIES IN it_collectoraction
WHERE bukrs = wa_collectoraction-bukrs AND
kunnr = wa_collectoraction-kunnr AND
dat = wa_collectoraction-dat.
SORT lt_coll_act BY bukrs kunnr dat time DESCENDING.
LOOP AT it_collectoraction ASSIGNING <fs_collectoraction>.
" the READ TABLE finds the first matching row,
" it will be MAX(TIME) as TIME is sorted descending
READ TABLE lt_coll_act INTO ls_coll_act
WITH KEY bukrs = <fs_collectoraction>-bukrs
kunnr = <fs_collectoraction>-kunnr
dat = <fs_collectoraction>-dat BINARY SEARCH.
<fs_collectoraction> = ls_coll_act.
ENDLOOP.
类型:tty_coll_行动开始,
bukrs型伯克斯,
KUNR型KUNR,
dat类型dat,
时间类型时间,
tty_coll_法案结束。
数据:tty\U coll\u act的lt\U coll\u act类型表,
L_coll_的行为就像L_coll_的行为一样。
字段符号:类似于集合操作的行。
选择bukrs KUNR dat时间
进入表lt\U coll\U act
从Zcollector操作
对于it\u collectoraction中的所有条目
其中bukrs=wa_collectoraction-bukrs和
kunnr=wa_collectoraction-kunnr和
dat=wa_collectoraction-dat。
按bukrs KUNR dat时间递减对lt_coll_act进行排序。
在它处循环\u collectoraction赋值。
“读取表查找第一个匹配行,
“随着时间按降序排序,它将是最大(时间)
将表lt\U coll\U act读入ls\U coll\U act
使用键bukrs=-bukrs
kunnr=-kunnr
dat=-dat二进制搜索。
=ls_coll_act。
结束循环。
不要在循环中添加选择查询,而是将所有数据放入一个内部表中,并在循环中使用read语句进行处理
在循环中添加select查询总是会降低应用程序的执行速度,因为应用程序必须为每个循环执行数据库查询。将所有必需的信息加载到内部表中,然后在应用程序内处理数据要快得多
如果您需要有关这方面的更多详细信息,请告诉我。首先,我要感谢您的帮助。 根据用户的选择数据,我使用一个包含dbtab中所有记录的内部表来更改select的逻辑。 因此,代码如下所示:
DATA: wa_collectoraction TYPE zcollectoraction,
it_collectoraction TYPE TABLE OF zcollectoraction,
itsort_collectoraction TYPE HASHED TABLE OF zcollectoraction
WITH UNIQUE KEY mandt bukrs kunnr yearmonth dat time.
FIELD-SYMBOLS: <fs_collectoraction> LIKE LINE OF it_collectoraction.
SELECT bukrs kunnr yearmonth MAX( dat ) AS dat
FROM zcollectoraction
INTO CORRESPONDING FIELDS OF TABLE it_collectoraction
WHERE bukrs IN so_bukrs AND
kunnr IN so_kunnr AND
dat IN so_date
GROUP BY bukrs kunnr yearmonth.
" Keep the total records which will be inserted.
i_tab_lines = sy-dbcnt.
SELECT * INTO TABLE itsort_collectoraction
FROM zcollectoraction
WHERE bukrs IN so_bukrs AND
kunnr IN so_kunnr AND
dat IN so_date.
SORT itsort_collectoraction
BY mandt bukrs kunnr yearmonth dat time DESCENDING.
LOOP AT it_collectoraction ASSIGNING <fs_collectoraction>.
PERFORM progress_bar USING 'Retrieving data...'(035)
sy-tabix
i_tab_lines.
READ TABLE itsort_collectoraction INTO wa_collectoraction
WITH KEY bukrs = <fs_collectoraction>-bukrs
kunnr = <fs_collectoraction>-kunnr
yearmonth = <fs_collectoraction>-yearmonth
dat = <fs_collectoraction>-dat.
<fs_collectoraction> = wa_collectoraction.
ENDLOOP.
数据:wa_collectoraction类型zcollectoraction,
它是zcollectoraction的collectoraction类型表,
zcollectoraction的itsort_collectoraction类型哈希表
具有唯一键mandt bukrs kunnr yearmonth dat time。
字段符号:类似于集合操作的行。
选择bukrs kunnr yearmonth MAX(dat)作为dat
从Zcollector操作
进入表it\U collectoraction的相应字段
布克在哪里
苏苏昆纳的昆纳和
苏苏日期
按bukrs kunnr一年一个月分组。
“保留将插入的总记录。
i_tab_line=sy dbcnt。
在表itsort\U collectoraction中选择*
从Zcollector操作
布克在哪里
苏苏昆纳的昆纳和
这是苏乌的日期。
排序它的排序集合操作
由mandt bukrs kunnr yearmonth dat时间递减。
在它处循环\u collectoraction赋值。
使用“检索数据…”执行进度条(035)
sy tabix
我用tab线。
将表itsort_collectoraction读入wa_collectoraction
使用键bukrs=-bukrs
kunnr=-kunnr
yearmonth=-yearmonth
dat=-dat。
=wa_集合动作。
结束循环。
此代码在1分钟内运行43000条记录。
唯一的问题是,在第一个10000到15000条记录之后,进程正在放缓。我不知道是否有任何命令来清除某些内容。我不知道要清除什么
再次感谢大家。
当做
埃利亚斯
另外,在前10秒内,it处理了14000条记录。
在1分钟的过程中38.500和
在1分50秒内完成了54.500条记录。
它给我的印象是,它完成了某件事情,从而减慢了过程。你有什么想法吗?我参加聚会有点晚,但我在你的第一篇帖子中看到的是,你只想从一张表中读取每个bukrs和kunnr的最新条目(max(date)和max(time)) 使用一个select获取表的内容。仅按键域或索引选择: 我假设日期不是关键字段,但bukrs和kunnr:
SELECT bukrs kunnr yearmonth dat time
FROM zcollectoraction
INTO CORRESPONDING FIELDS OF TABLE it_collectoraction
WHERE bukrs IN so_bukrs AND
kunnr IN so_kunnr
.
从itab中删除非关键字段:
DELETE it_collectoraction WHERE dat NOT IN so_date.
按日期和时间降序对itab进行排序,以便最新条目是bukrs和KUNR的第一个组合
SORT it_collectoraction BY bukrs kunnr date DESCENDING time DESCENDING.
DELETE ADJACENT DUPLICATES FROM it_collectoraction COMPARING bukrs kunnr.
删除每个bukrs和KUNR的所有相邻(=第一个之后有相同比较键的所有)条目
SORT it_collectoraction BY bukrs kunnr date DESCENDING time DESCENDING.
DELETE ADJACENT DUPLICATES FROM it_collectoraction COMPARING bukrs kunnr.
您运行的是哪个NetWeaver版本?您使用的是什么类型的数据库?组件版本:SAP ECC 6.0。数据库系统:DB6 SAP版本:700、710、701、702、711、720、730循环本身是正常的。但是您会产生什么样的怨恨呢你对你的数据库持反对态度,认为你想如此残忍地杀死它?;-)vwegert,我想做的,我在下面解释。好吧,让我告诉你。在选择中,我选择了一个月的最长日期的特定字段。然后我选择了记录中的所有字段和最长时间,因为有很大的可能有多条记录