ABAP SELECT 数据库提示,语法正确
ABAP SELECT database hints, correct syntax
ABAP SELECT 语句允许提供数据库提示。它们以关键字 %_HINTS 开头。现在我想知道 SELECT 包含提示的语句的正确语法:提示可以出现在哪些地方?我查看了 ABAP 关键字文档,但似乎没有提到它们。
你能给我指点一些描述数据库提示如何适应 ABAP 语法的文档吗?
关于我的问题的更多信息:我们构建了一个工具(在 Java 中),可以自动将 ABAP 代码转换为不同的 ABAP 代码。应用于 SELECT 语句,它可能会添加或删除子句。因此,提示的位置可能会因转换而改变。所以,我的问题是 where hints are allowed, not how correct hints like.
官方文档在 note 129385 中(但很遗憾,没有帐户无法访问)。
DB6数据库的两个例子,因为注释中没有包含:
- 在 VBAP 和 VBEP 之间使用嵌套循环连接而不是散列连接
%_HINTS DB6 '<NLJOIN><IXSCAN TABLE=''VBAP'' />' DB6 '<IXSCAN TABLE=''VBEP'' /></NLJOIN>'
- 为 VBEP 使用自定义索引 ZI0
%_HINTS DB6 '<IXSCAN TABLE=''VBEP'' INDEX=''"VBEP~ZI0"'' />'
编辑:提示是 select 块中的最后一条语句。
SELECT *
INTO TABLE lt_table
FROM dbtable
WHERE x = 1
%HINTS "first hint
%HINTS "second hint
. "<<< end of select statement
只是不要使用它。如果有一天您迁移到 HANA,此提示将破坏您的代码,您将不得不将其一一删除。我以前尝试过这个提示,但并没有显着提高性能。
但如果您仍想使用它,这些是特定于数据库的,这里是 Oracle 的语法
... %_HINTS <DB type> 'one or more hints'
在ABAP documentation中有描述:
<DB type>
表示提示适用的数据库类型:
- 甲骨文
- 组屋
- 阿达巴斯
- MSSQLNT
- DB6
- DB2
- 等等
有两类提示(您可以将它们混合在同一个字符串中):
- 打开SQL个提示
- 数据库提示
Open SQL 提示由 SAP 数据库接口在运行时进行解释,并且具有符号之间的语法(其中一些在注释 48230 - Parameters for the SELECT ... FOR ALL ENTRIES statement 中进行了描述),因此它们的语法是已知的 (但你必须阅读 SAP 注释):
- &替换文字&
- &prefer_in_itab_opt 1&
- 等等
数据库提示是所有其他不在&符号之间的提示。它们被直接发送到相关的数据库,由其进行解释。如果一些提示无效,它们将被数据库忽略。注释 129385 - Database hints in Open SQL 中提供了简短的概述,但您必须阅读数据库系统的官方文档才能获得 up-to-date 信息。
请注意,可能会为多个数据库提供提示,但在运行时仅使用当前 SAP 数据库之一(如果有):
SELECT ... %_HINTS ORACLE 'INDEX...'
HDB 'INDEX...'
MSSQLNT 'INDEX...'.
SELECT
、UPDATE
和 DELETE
允许提示,因为至少 ABAP 版本 4.5。
编译器可能会在严格模式下尽可能检查提示。
提示取决于系统。所有地方的提示都不会出现,但你可以在系统 - >状态中获得它。在弹出窗口的右下角,您可以看到 DB System ###.
通常有一个 DB6,你可以使用这样的东西:
select a~opbel
b~xblnr
b~betrw
b~kursf
a~waers
a~awkey
from dfkkmko as a
inner join dfkkmop as b
on a~opbel eq b~opbel
into table lt_dfkkmko_p
WHERE a~awkey IN lr_awkey
AND a~awtyp EQ 'VBRK'.
bypassing buffer
where a~awtyp eq 'VBRK'
and a~awkey in lr_awkey
%_hints db6 '&prefer_join 0&'.
ABAP SELECT 语句允许提供数据库提示。它们以关键字 %_HINTS 开头。现在我想知道 SELECT 包含提示的语句的正确语法:提示可以出现在哪些地方?我查看了 ABAP 关键字文档,但似乎没有提到它们。
你能给我指点一些描述数据库提示如何适应 ABAP 语法的文档吗?
关于我的问题的更多信息:我们构建了一个工具(在 Java 中),可以自动将 ABAP 代码转换为不同的 ABAP 代码。应用于 SELECT 语句,它可能会添加或删除子句。因此,提示的位置可能会因转换而改变。所以,我的问题是 where hints are allowed, not how correct hints like.
官方文档在 note 129385 中(但很遗憾,没有帐户无法访问)。
DB6数据库的两个例子,因为注释中没有包含:
- 在 VBAP 和 VBEP 之间使用嵌套循环连接而不是散列连接
%_HINTS DB6 '<NLJOIN><IXSCAN TABLE=''VBAP'' />' DB6 '<IXSCAN TABLE=''VBEP'' /></NLJOIN>'
- 为 VBEP 使用自定义索引 ZI0
%_HINTS DB6 '<IXSCAN TABLE=''VBEP'' INDEX=''"VBEP~ZI0"'' />'
编辑:提示是 select 块中的最后一条语句。
SELECT *
INTO TABLE lt_table
FROM dbtable
WHERE x = 1
%HINTS "first hint
%HINTS "second hint
. "<<< end of select statement
只是不要使用它。如果有一天您迁移到 HANA,此提示将破坏您的代码,您将不得不将其一一删除。我以前尝试过这个提示,但并没有显着提高性能。
但如果您仍想使用它,这些是特定于数据库的,这里是 Oracle 的语法
... %_HINTS <DB type> 'one or more hints'
在ABAP documentation中有描述:
<DB type>
表示提示适用的数据库类型:
- 甲骨文
- 组屋
- 阿达巴斯
- MSSQLNT
- DB6
- DB2
- 等等
有两类提示(您可以将它们混合在同一个字符串中):
- 打开SQL个提示
- 数据库提示
Open SQL 提示由 SAP 数据库接口在运行时进行解释,并且具有符号之间的语法(其中一些在注释 48230 - Parameters for the SELECT ... FOR ALL ENTRIES statement 中进行了描述),因此它们的语法是已知的 (但你必须阅读 SAP 注释):
- &替换文字&
- &prefer_in_itab_opt 1&
- 等等
数据库提示是所有其他不在&符号之间的提示。它们被直接发送到相关的数据库,由其进行解释。如果一些提示无效,它们将被数据库忽略。注释 129385 - Database hints in Open SQL 中提供了简短的概述,但您必须阅读数据库系统的官方文档才能获得 up-to-date 信息。
请注意,可能会为多个数据库提供提示,但在运行时仅使用当前 SAP 数据库之一(如果有):
SELECT ... %_HINTS ORACLE 'INDEX...'
HDB 'INDEX...'
MSSQLNT 'INDEX...'.
SELECT
、UPDATE
和 DELETE
允许提示,因为至少 ABAP 版本 4.5。
编译器可能会在严格模式下尽可能检查提示。
提示取决于系统。所有地方的提示都不会出现,但你可以在系统 - >状态中获得它。在弹出窗口的右下角,您可以看到 DB System ###.
通常有一个 DB6,你可以使用这样的东西:
select a~opbel
b~xblnr
b~betrw
b~kursf
a~waers
a~awkey
from dfkkmko as a
inner join dfkkmop as b
on a~opbel eq b~opbel
into table lt_dfkkmko_p
WHERE a~awkey IN lr_awkey
AND a~awtyp EQ 'VBRK'.
bypassing buffer
where a~awtyp eq 'VBRK'
and a~awkey in lr_awkey
%_hints db6 '&prefer_join 0&'.