Abap 对所有条目进行慢速选择
下面的SELECT与内部表“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
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 parametersrsdb/max_[in_]blocking_factor
或hintmax_[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转换为一组子请求。我可以给这篇伟大的文章提供一个链接,对这个案件进行深入的调查,但它是用俄语写的。在常见场景中,使用提示是一种不好的做法,因为它会覆盖基本设置,并且系统无法轻松扩展