Abap 对所有条目进行慢速选择

Abap 对所有条目进行慢速选择,abap,opensql,Abap,Opensql,下面的SELECT与内部表“GIT_KUNNR_”选项卡“/code>一起运行,该表包含2.291.000行具有唯一客户端(KUNNR)的行,需要16分钟才能完成 select kunnr umsks umskz gjahr belnr buzei bschl shkzg dmbtr bldat zfbdt zbd1t zbd2t zbd3t rebzg rebzj rebzz rebzt into corresponding fields of tab

下面的SELECT与内部表“
GIT_KUNNR_”选项卡“/code>一起运行,该表包含2.291.000行具有唯一客户端(KUNNR)的行,需要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获得445000条记录

大多数情况下,
GIT\u KUNNR\u选项卡中的行数甚至更多

是否有更快的选择?

删除“所有条目”部分 最有可能的情况是,其他条件具有足够的选择性。你得到的记录比需要的要多,但要快得多

由于
git_kunnr_选项卡
是唯一的,您可以将其转换为哈希表,并在应用程序服务器上过滤
git_oi_选项卡

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.
选择KUNR umsks umskz gjahr BENR buzei bschl shkzg dmbtr bldat
zfbdt ZBDT zbd1t zbd2t zbd3t rebzg rebzj rebzz rebzt
进入表git_oi_tab的相应字段
来自bsid
其中bukrs=p_bukrs
而umsks=“”
和augdt=清除
布达勒普基酒店
还有苏布拉特的布拉特
和s_xref3中的xref3。
数据:lt_kunnr_选项卡类型哈希表
与UNIQE KEY KUNR合作。
lt_kunnr_tab=git_kunnr_tab。
在git_oi_选项卡上循环分配字段-SYMBOL()。
读取表lt_kunnr_tab,无字段
使用键kunnr=-kunnr。
如果sy subrc 0
删除git_oi_选项卡。
恩迪夫。
恩迪夫。
结束循环。
免费lt_kunnr_标签。
这不是一个普遍的解决办法 如果FAE驱动程序表包含目标表中超过20%的行,则完全删除它对提高速度最为有利。
如果行数较少,则FAE是更好的解决方案

但是,请小心,删除FAE会显著增加生成的内部表的内存消耗

对于所有条目vs范围表 你可以在互联网上看到许多地方的射程表比FAE快。在一些非常特殊的情况下,这是事实:

  • FAE驱动程序表1中仅使用了一个字段
  • 驱动程序表中的行数多于FAE在一批中发送的行数
  • 默认情况下,批处理大小在Oracle中为5,在DB2中为50,在HANA中为100
  • 范围thable中没有太多行导致转储
  • 最大长度为1048576字节(注1002491)
范围表可以比FAE更快,因为它在一个查询中发送所有筛选条件。这当然是危险的,因为查询的大小是有限的。如果超过设定的限制,您将得到转储

但是,使用提示
MAX_IN_BLOCKING_FACTOR
MAX_BLOCKING_FACTOR
可以为FAE提供范围表的所有好处,而不会增加批量大小

因此,仅使用实际范围的范围表,如A和C之间的
,或G和J之间的


  • 这不是关于速度,而是关于功能正确性。范围表独立处理字段,而FAE处理行

  • 通常只有一个字段使用范围要快得多。 因此,如果您通过某个键从内部表中选择数据,只比较表中的一个字段,请将其转换为范围,而不是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...
    
    类型:
    tr_kunnr类型kunnr的范围。
    *如果您使用的是旧系统(>7.4),则只需执行循环/追加
    数据(lr_kunnr)=值tr_kunnr(
    用于git_oi_选项卡中的
    (
    符号='I'
    选项='EQ'
    低=fs_oi-kunnr
    )
    ). 
    选择KUNR umsks umskz gjahr belnr buzei bschl shkzg dmbtr bldat
    zfbdt ZBDT zbd1t zbd2t zbd3t rebzg rebzj rebzz rebzt
    进入表@git_oi_tab的相应字段
    来自bsid
    其中bukrs=@p_bukrs
    和在@lr_kunnr中的kunnr。。。
    

    我找不到这篇文章,但进行了调查,在一个字段比较的情况下,范围比FAE快得多。

    对于任何性能问题,您最好附上
    执行计划(ST05),它告诉数据库如何优化读取。这是每个系统特有的。请注意,这是一个ABAP构造,它通过将
    GIT_KUNNR_TAB
    拆分为5行(profile parameters
    rsdb/max_[in_]blocking_factor
    或hint
    max_[in_]blocking_factor
    )将SELECT拆分为多个SELECT。SandraRossi 5的值仅适用于Oracle,默认为50,HANA上的和100。@András该值甚至可能因数据库、SAP版本和WHERE(根据位置而定,为50或100)的不同而有所不同@SandraRossi,我知道,但我不想在针对当前案例的评论中列出所有案例和例外,但是如果
    git_kunnr_选项卡
    中的行数太少,可能会适得其反。Andras感谢您的回答。我明天会实施,我会让你知道结果。我还试图找到一种在abap并行处理中实现这种选择的方法。你的,我认为很好。对不起,安德拉斯,我必须解决一些生产问题,我没有做什么。也许明天。我会让你知道一切的。谢谢。@Suncatcher语句的最大长度是1MB(1 048 576字节)@Suncatcher不是直接的。您将行数乘以宽度,它必须符合1MB这是一个神话,因为
    对于itab中的所有条目,其中column=itab column
    在运行时转换为多个
    SELECT
    ,每个都执行
    WHERE column in('a','B')
    (参见注释)。因此,显式地这样做没有区别,区别在于从DB传输到AS的数据包的大小不同。在以后的版本中,这可能有所改变,但这是其余版本中的主要原因。通常(没有提示)它会将SELECT转换为一组子请求。我可以给这篇伟大的文章提供一个链接,对这个案件进行深入的调查,但它是用俄语写的。在常见场景中,使用提示是一种不好的做法,因为它会覆盖基本设置,并且系统无法轻松扩展