Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Abap 带有嵌套选择的非常慢的itab循环_Abap_Opensql_Internal Tables - Fatal编程技术网

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,我想做的,我在下面解释。好吧,让我告诉你。在选择中,我选择了一个月的最长日期的特定字段。然后我选择了记录中的所有字段和最长时间,因为有很大的可能有多条记录