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数据库的两个例子,因为注释中没有包含:

  1. 在 VBAP 和 VBEP 之间使用嵌套循环连接而不是散列连接

%_HINTS DB6 '<NLJOIN><IXSCAN TABLE=''VBAP'' />' DB6 '<IXSCAN TABLE=''VBEP'' /></NLJOIN>'

  1. 为 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 的语法

http://saptechnical.com/Tips/ABAP/SecondaryIndexes.htm

... %_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...'.

SELECTUPDATEDELETE 允许提示,因为至少 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&'.