暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL执行计划-访问谓词确定

askTom 2017-06-20
323

问题描述

你好,汤姆,

我知道汤姆已经退休了。但很高兴Oracle的一组专业知识有助于保持AskTom的运作。这确实很有帮助。

我在SAP/Oracle环境中面临SQL计划问题。SQL是:

SELECT
  DISTINCT "MATNR","VKORG","VTWEG","MTPOS"
FROM
  "MVKE"
WHERE
  "MANDT"=:A0 AND (("MATNR" IN (:A1,:A2,:A3) AND "VKORG"=:A4 AND "VTWEG"=:A5) OR ("MATNR" IN
  (:A1,:A2,:A3) AND "VKORG"=:A9 AND "VTWEG"=:A10) OR ("MATNR" IN (:A1,:A2,:A3) AND "VKORG"=:A14 AND
  "VTWEG"=:A15) OR ("MATNR" IN (:A1,:A2,:A3) AND "VKORG"=:A19 AND "VTWEG"=:A20) OR ("MATNR" IN
  (:A1,:A2,:A3) AND "VKORG"=:A24 AND "VTWEG"=:A25))


MVKE有一个主索引-MVKE ~ 0,它由MANDT、MATNR、VKORG、VTWEG等表字段组成。oracle执行计划是Oracle按预期使用MVKE〜0索引范围扫描,where-子句中的所有其他字段都用作 “过滤器谓词”。但是访问谓词只有一个字段的MANDT。问题是,mandt是SAP世界中只有1个不同值的 “客户端” 字段,但mantnr字段具有成百上千个值,这是该索引中最具选择性的字段。这导致了我们的性能问题。现在,ERP Oracle团队对某些Oracle静态参数进行了更改,例如SGA大小,已解决了该问题。是什么导致了我们最初的问题?哪些Oracle静态参数对 “访问谓词” 的权重更高?我用谷歌搜索了互联网,但我的问题仍然存在。

非常感谢。

以下是使用适当的访问谓词的新计划 (使用 “mandt” 作为访问谓词的旧计划只有两个步骤)

SQL Statement
----------------------------------------------------------------------------------------------------------------------
SELECT
  DISTINCT "MATNR","VKORG","VTWEG","MTPOS"
FROM
  "MVKE"
WHERE
  "MANDT"=:A0 AND (("MATNR" IN (:A1,:A2,:A3) AND "VKORG"=:A4 AND "VTWEG"=:A5) OR ("MATNR" IN
  (:A1,:A2,:A3) AND "VKORG"=:A9 AND "VTWEG"=:A10) OR ("MATNR" IN (:A1,:A2,:A3) AND "VKORG"=:A14 AND
  "VTWEG"=:A15) OR ("MATNR" IN (:A1,:A2,:A3) AND "VKORG"=:A19 AND "VTWEG"=:A20) OR ("MATNR" IN
  (:A1,:A2,:A3) AND "VKORG"=:A24 AND "VTWEG"=:A25))


Execution Plan

----------------------------------------------------------------------------------------------------------------------
Explain from v$sql_plan not possible -> Explain from PLAN_TABLE is displayed !
No values in v$sql_plan for Address: 00000006860DF8F0 Hash_value:  1957305630 Child_number:  0 Instance_ID: 1
Sql_id:

System: F6R
Plan hash value: 1827367495

----------------------------------------------------------------------------------------
| Id  | Operation                     | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |        |     5 |   180 |     8  (13)| 00:00:01 |
|   1 |  CONCATENATION                |        |       |       |            |          |
|   2 |   INLIST ITERATOR             |        |       |       |            |          |
|   3 |    TABLE ACCESS BY INDEX ROWID| MVKE   |     1 |    36 |     1   (0)| 00:00:01 |
|*  4 |     INDEX UNIQUE SCAN         | MVKE~0 |     1 |       |     1   (0)| 00:00:01 |
|   5 |   INLIST ITERATOR             |        |       |       |            |          |
|   6 |    TABLE ACCESS BY INDEX ROWID| MVKE   |     1 |    36 |     1   (0)| 00:00:01 |
|*  7 |     INDEX UNIQUE SCAN         | MVKE~0 |     1 |       |     1   (0)| 00:00:01 |
|   8 |   INLIST ITERATOR             |        |       |       |            |          |
|   9 |    TABLE ACCESS BY INDEX ROWID| MVKE   |     1 |    36 |     1   (0)| 00:00:01 |
|* 10 |     INDEX UNIQUE SCAN         | MVKE~0 |     1 |       |     1   (0)| 00:00:01 |
|  11 |   INLIST ITERATOR             |        |       |       |            |          |
|  12 |    TABLE ACCESS BY INDEX ROWID| MVKE   |     1 |    36 |     1   (0)| 00:00:01 |
|* 13 |     INDEX UNIQUE SCAN         | MVKE~0 |     1 |       |     1   (0)| 00:00:01 |
|  14 |   INLIST ITERATOR             |        |       |       |            |          |
|  15 |    TABLE ACCESS BY INDEX ROWID| MVKE   |     1 |    36 |     1   (0)| 00:00:01 |
|* 16 |     INDEX UNIQUE SCAN         | MVKE~0 |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   3 - SEL$1_1 / MVKE@SEL$1
   4 - SEL$1_1 / MVKE@SEL$1
   6 - SEL$1_2 / MVKE@SEL$1_2
   7 - SEL$1_2 / MVKE@SEL$1_2
   9 - SEL$1_3 / MVKE@SEL$1_3
  10 - SEL$1_3 / MVKE@SEL$1_3
  12 - SEL$1_4 / MVKE@SEL$1_4
  13 - SEL$1_4 / MVKE@SEL$1_4
  15 - SEL$1_5 / MVKE@SEL$1_5
  16 - SEL$1_5 / MVKE@SEL$1_5

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("MANDT"=:A0 AND ("MATNR"=:A1 OR "MATNR"=:A2 OR "MATNR"=:A3) AND
              "VKORG"=:A24 AND "VTWEG"=:A25)
   7 - access("MANDT"=:A0 AND ("MATNR"=:A1 OR "MATNR"=:A2 OR "MATNR"=:A3) AND
              "VKORG"=:A19 AND "VTWEG"=:A20)
       filter(LNNVL("VKORG"=:A24) OR LNNVL("VTWEG"=:A25) OR LNNVL("MATNR"=:A1)
              AND LNNVL("MATNR"=:A2) AND LNNVL("MATNR"=:A3))
  10 - access("MANDT"=:A0 AND ("MATNR"=:A1 OR "MATNR"=:A2 OR "MATNR"=:A3) AND
              "VKORG"=:A14 AND "VTWEG"=:A15)
       filter((LNNVL("VKORG"=:A19) OR LNNVL("VTWEG"=:A20) OR LNNVL("MATNR"=:A1)
              AND LNNVL("MATNR"=:A2) AND LNNVL("MATNR"=:A3)) AND (LNNVL("VKORG"=:A24) OR
              LNNVL("VTWEG"=:A25) OR LNNVL("MATNR"=:A1) AND LNNVL("MATNR"=:A2) AND
              LNNVL("MATNR"=:A3)))
  13 - access("MANDT"=:A0 AND ("MATNR"=:A1 OR "MATNR"=:A2 OR "MATNR"=:A3) AND
              "VKORG"=:A9 AND "VTWEG"=:A10)
       filter((LNNVL("VKORG"=:A14) OR LNNVL("VTWEG"=:A15) OR LNNVL("MATNR"=:A1)
              AND LNNVL("MATNR"=:A2) AND LNNVL("MATNR"=:A3)) AND (LNNVL("VKORG"=:A19) OR
              LNNVL("VTWEG"=:A20) OR LNNVL("MATNR"=:A1) AND LNNVL("MATNR"=:A2) AND
              LNNVL("MATNR"=:A3)) AND (LNNVL("VKORG"=:A24) OR LNNVL("VTWEG"=:A25) OR
              LNNVL("MATNR"=:A1) AND LNNVL("MATNR"=:A2) AND LNNVL("MATNR"=:A3)))
  16 - access("MANDT"=:A0 AND ("MATNR"=:A1 OR "MATNR"=:A2 OR "MATNR"=:A3) AND
              "VKORG"=:A4 AND "VTWEG"=:A5)
       filter((LNNVL("VKORG"=:A9) OR LNNVL("VTWEG"=:A10) OR LNNVL("MATNR"=:A1)
              AND LNNVL("MATNR"=:A2) AND LNNVL("MATNR"=:A3)) AND (LNNVL("VKORG"=:A14) OR
              LNNVL("VTWEG"=:A15) OR LNNVL("MATNR"=:A1) AND LNNVL("MATNR"=:A2) AND
              LNNVL("MATNR"=:A3)) AND (LNNVL("VKORG"=:A19) OR LNNVL("VTWEG"=:A20) OR
              LNNVL("MATNR"=:A1) AND LNNVL("MATNR"=:A2) AND LNNVL("MATNR"=:A3)) AND
              (LNNVL("VKORG"=:A24) OR LNNVL("VTWEG"=:A25) OR LNNVL("MATNR"=:A1) AND
              LNNVL("MATNR"=:A2) AND LNNVL("MATNR"=:A3)))





专家解答

嗨,埃里克,

你能分享更多关于你的问题的信息吗?

您可以发送原始执行计划和更改的初始化参数列表吗?
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论