下面的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
中的行数更多。
有更快的选择吗?
答案 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会大大增加生成的内部表的内存消耗。
您可以在互联网上看到很多地方,范围表比FAE快。确实是一些非常特殊的情况:
范围表可以比FAE更快,因为它可以在一个查询中发送所有过滤条件。当然,这是危险的根源,因为查询的大小受到限制。如果超过设置的限制,则会转储。
但是,使用提示 MAX_IN_BLOCKING_FACTOR
和MAX_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快得多。