%_hints oracle-忽略索引

2020-09-12 02:50发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我有同一条SQL语句的两个副本,唯一的区别是where条件。

但这两个语句的行为完全不同,我可以在解释计划中看到,执行不佳的语句是应使用的忽略索引。

我一直在尝试使用提示来尝试强制其执行效果更好的版本,但似乎只是忽略了我的提示

选择一个〜matnr,
             一个〜satnr,
             a〜bflme,
             a〜matkl,
             w〜wladg,
             a〜tragr,
             a〜meins,"基本UOM
             Coalesce(u2〜umrez,u1〜umrez)as umrez,"订单单位分子
             Coalesce(u2〜umren,u1〜umren)as umren,"订单单位分母
             Coalesce(u2〜meinh,u1〜meinh)as meinh,"订购UOM
             s1〜deink为xs_deink,
             s2〜deink为xdc_deink
       来自mara
         内部连接maw1 as w
           在a〜matnr = w〜matnr
         内部加入marm为u1
           在a〜matnr = u1〜matnr上
           和a〜meins = u1〜meinh
         以u2身份加入marm
           在w〜matnr = u2〜matnr
           w〜wausm = u2〜meinh
         左加入t141作为s1
           在a〜mstae = s1〜mmsta上
         左连接t141作为s2
           在a〜mstav = s2〜mmsta
        @it_satnr中的一个〜satnr
         和a〜bflme = @ me-> gc_logvar_purch
        %_hints oracle'INDEX(" MARA"" MARA〜ZLV")'
                 oracle'INDEX(" MAW1"" MAW1〜0")'
                 oracle'INDEX(" MARM"" MARM〜0")'
                 oracle'INDEX(" T141"" T141〜0")'
       到表@et_mara中。
 

我唯一能想到的是我在联接中使用表别名,但是提示我使用的是逻辑名,应该在提示中使用别名吗?

例如:

%_ hints oracle'INDEX(" a"" MARA〜ZLV")'

如果是,我假设我在同一个表中两次使用了不同的别名,我应该将两者都添加到提示中吗?

最后,我假设在提示中写入" MARA〜0"将迫使其使用主键,因为这是在解释计划中显示的方式,尽管该索引不能被视为DDIC中的索引。

非常感谢,

戴夫

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我有同一条SQL语句的两个副本,唯一的区别是where条件。

但这两个语句的行为完全不同,我可以在解释计划中看到,执行不佳的语句是应使用的忽略索引。

我一直在尝试使用提示来尝试强制其执行效果更好的版本,但似乎只是忽略了我的提示

选择一个〜matnr,
             一个〜satnr,
             a〜bflme,
             a〜matkl,
             w〜wladg,
             a〜tragr,
             a〜meins,"基本UOM
             Coalesce(u2〜umrez,u1〜umrez)as umrez,"订单单位分子
             Coalesce(u2〜umren,u1〜umren)as umren,"订单单位分母
             Coalesce(u2〜meinh,u1〜meinh)as meinh,"订购UOM
             s1〜deink为xs_deink,
             s2〜deink为xdc_deink
       来自mara
         内部连接maw1 as w
           在a〜matnr = w〜matnr
         内部加入marm为u1
           在a〜matnr = u1〜matnr上
           和a〜meins = u1〜meinh
         以u2身份加入marm
           在w〜matnr = u2〜matnr
           w〜wausm = u2〜meinh
         左加入t141作为s1
           在a〜mstae = s1〜mmsta上
         左连接t141作为s2
           在a〜mstav = s2〜mmsta
        @it_satnr中的一个〜satnr
         和a〜bflme = @ me-> gc_logvar_purch
        %_hints oracle'INDEX(" MARA"" MARA〜ZLV")'
                 oracle'INDEX(" MAW1"" MAW1〜0")'
                 oracle'INDEX(" MARM"" MARM〜0")'
                 oracle'INDEX(" T141"" T141〜0")'
       到表@et_mara中。
 

我唯一能想到的是我在联接中使用表别名,但是提示我使用的是逻辑名,应该在提示中使用别名吗?

例如:

%_ hints oracle'INDEX(" a"" MARA〜ZLV")'

如果是,我假设我在同一个表中两次使用了不同的别名,我应该将两者都添加到提示中吗?

最后,我假设在提示中写入" MARA〜0"将迫使其使用主键,因为这是在解释计划中显示的方式,尽管该索引不能被视为DDIC中的索引。

非常感谢,

戴夫

付费偷看设置
发送
2条回答
能不能别闹
1楼 · 2020-09-12 02:58.采纳回答

我已经通过反复试验回答了自己的问题。

供参考:

  • 提示必须使用表别名
  • 如果表多次使用别名,则每个别名都需要提示
  • 尽管在DDIC中看不到" MARA〜0",但实际上" MARA〜0"确实强制其使用主键

下面的更正代码可以完全按照我希望优化器使其工作的方式工作:

选择一个〜matnr,
             一个〜satnr,
             a〜bflme,
             a〜matkl,
             w〜wladg,
             a〜tragr,
             a〜meins,"基本UOM
             Coalesce(u2〜umrez,u1〜umrez)as umrez,"订单单位分子
             Coalesce(u2〜umren,u1〜umren)as umren,"订单单位分母
             Coalesce(u2〜meinh,u1〜meinh)as meinh,"订购UOM
             s1〜deink为xs_deink,
             s2〜deink为xdc_deink
       来自mara
         内部连接maw1 as w
           在a〜matnr = w〜matnr
         内部加入marm为u1
           在a〜matnr = u1〜matnr上
           和a〜meins = u1〜meinh
         以u2身份加入marm
           在w〜matnr = u2〜matnr
           w〜wausm = u2〜meinh
         左加入t141作为s1
           在a〜mstae = s1〜mmsta上
         左连接t141作为s2
           在a〜mstav = s2〜mmsta
        @it_satnr中的一个〜satnr
         和a〜bflme = @ me-> gc_logvar_purch
        %_hints oracle'INDEX(" A"" MARA〜ZLV")'
                 oracle'INDEX(" W"" MAW1〜0")'
                 oracle'INDEX(" U1"" MARM〜0")'
                 oracle'INDEX(" U2"" MARM〜0")'
                 oracle'INDEX(" S1"" T141〜0")'
                 oracle'INDEX(" S2"" T141〜0")'
       到表@et_mara中。
 
亦是此间程序员
2楼-- · 2020-09-12 03:16

我要回答,但需要检查笔记。 有一个事务,您可以以解释的形式输入SQL,并添加提示等。我忘记了它的位置(也许是DB04?),但这对于正确使用语法非常有用。

一周热门 更多>

点击此处---> EasySAP.com 一起学习S4 HANA ...

相关问答