下面的 SELECT 与内部表一起运行GIT_KUNNR_TAB
包含 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 获取 445,000 条记录。
大多数时候,线路甚至更多GIT_KUNNR_TAB
.
有没有更快的选择?
删除 FOR ALL ENTRIES 部分
很可能 WHERE 条件的其余部分具有足够的选择性。您取回的记录多于必要的记录,但是much更快。
As 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.
This is not通用解决方案
如果 FAE 驱动程序表包含超过20%目标表的行,完全删除它对速度最有利。
如果行数较少,FAE 是更好的解决方案。
但要小心,删除 FAE 可能会显著地增加生成的内表的内存消耗!
对于所有条目与范围表
你可以在互联网上看到很多地方范围表比 FAE 更快。在一些非常具体的情况下确实如此:
- Only one field is used from the FAE driver table1
- 驱动程序表中的行数多于 FAE 在一批中发送的行数
- 默认情况下,Oracle 中的批处理大小为 5,DB2 中的批处理大小为 50,HANA 中的批处理大小为 100
- Range 表中的行数不多,不会导致转储
- 最大长度为 1 048 576 字节(注 1002491)
范围表比 FAE 更快,因为它在一个查询中发送所有过滤条件。这当然是危险的,因为查询的大小是有限的。如果超过设定的限制,您将得到转储。
然而,使用hint MAX_IN_BLOCKING_FACTOR
and MAX_BLOCKING_FACTOR
您可以为 FAE 提供范围表的所有优点,而无需增加批量大小带来的缺点。
所以只能使用范围表与实际范围, like between A and C
, or not between G and J
.
- 这与速度无关,而是与功能正确性有关。范围表独立处理字段,而 FAE 处理行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)