慢速选择所有条目

时间:2019-04-22 09:25:15

标签: sap abap

下面的SELECT与内部表GIT_KUNNR_TAB一起运行,该表包含具有唯一客户端(kunnr)的2.291.000行,并且需要16分钟才能完成。

  select kunnr umsks umskz gjahr belnr buzei bschl shkzg dmbtr bldat
           zfbdt zbd1t zbd2t zbd3t rebzg rebzj rebzz rebzt
        into corresponding fields of table git_oi_tab
      from bsid
        for all entries in git_kunnr_tab
      where bukrs  =  p_bukrs
        and kunnr  =  git_kunnr_tab-kunnr 
        and umsks  = ' '
        and augdt  =   clear_augdt
        and budat  le  p_key 
        and blart  in  s_blart
        and xref3  in  s_xref3.

BSID总共包含20.000.000条记录,对于2.291.000个唯一客户端,它从BSID中获得445.000条记录。

大多数时候,GIT_KUNNR_TAB中的行数更多。

有更快的选择吗?

2 个答案:

答案 0 :(得分:2)

删除“所有条目”部分

其余的WHERE条件很可能具有足够的选择性。您可以获得比必要更多的记录,但是很多更快。

由于git_kunnr_tab是唯一的,因此您可以将其转换为HASHED表,并用应用程序服务器上的git_oi_tab进行过滤。

SELECT kunnr umsks umskz gjahr belnr buzei bschl shkzg dmbtr bldat
       zfbdt zbd1t zbd2t zbd3t rebzg rebzj rebzz rebzt
    INTO corresponding fields of table git_oi_tab
    FROM bsid
    WHERE bukrs = p_bukrs 
      AND umsks = ' ' 
      AND augdt = clear_augdt 
      AND budat le p_key 
      AND blart in s_blart 
      AND xref3 in s_xref3.

DATA: lt_kunnr_tab TYPE HASHED TABLE of <type of git_kunnr_tab>
          WITH UNIQE KEY kunnr.
lt_kunnr_tab = git_kunnr_tab.
LOOP AT git_oi_tab ASSIGNING FIELD-SYMBOL(<fs_oi>).
  READ TABLE lt_kunnr_tab TRANSPORTING NO FIELDS
      WITH KEY kunnr = <fs_oi>-kunnr.
    IF sy-subrc <> 0
      DELETE git_oi_tab.
    ENDIF.
  ENDIF.
ENDLOOP.
FREE lt_kunnr_tab.

这不是通用解决方案

如果FAE驱动程序表包含目标表行中的超过20%,则完全删除它对于提高速度最有利。
如果行数较少,则FAE是更好的解决方案。

删除FAE会大大增加生成的内部表的内存消耗。

对于所有条目vs范围表

您可以在互联网上看到很多地方,范围表比FAE快。确实是一些非常特殊的情况:

  • FAE驱动程序表中仅使用一个字段
  • 驱动程序表中的行多于FAE批量发送的行
    • 默认情况下,批处理大小在Oracle中为5,在DB2中为50,在HANA中为100
  • Range的行数不多,导致转储
    • 最大长度为1 048 576字节(注释1002491)

范围表可以比FAE更快,因为它可以在一个查询中发送所有过滤条件。当然,这是危险的根源,因为查询的大小受到限制。如果超过设置的限制,则会转储。

但是,使用提示 MAX_IN_BLOCKING_FACTORMAX_BLOCKING_FACTOR,您可以为FAE提供范围表的所有好处,而不会增加批量大小,因此没有缺点。

所以只能使用具有实际范围的范围表 ,例如A和C之间,或G和J之间。

答案 1 :(得分:-2)

通常对于使用范围的一个字段来说,速度要快得多。 因此,如果您通过内部表中的某个键选择数据,而只比较表中的一个字段,则将其转为范围,而不是FAE:

TYPES:
  tr_kunnr TYPE RANGE OF kunnr.

* or just do loop/append if you on the old system (>7.4)
DATA(lr_kunnr) = VALUE tr_kunnr(
  FOR <fs_oi> IN git_oi_tab
  (
    sign    = 'I'
    option  = 'EQ'
    low     = fs_oi-kunnr
  )
). 

 select kunnr umsks umskz gjahr belnr buzei bschl shkzg dmbtr bldat
           zfbdt zbd1t zbd2t zbd3t rebzg rebzj rebzz rebzt
        into corresponding fields of table @git_oi_tab
      from bsid
      where bukrs  =  @p_bukrs
        and kunnr  in @lr_kunnr...

我找不到文章,但进行了调查,一次比较的范围比FAE快得多。