Oracle 使用索引优化运行时

Oracle 使用索引优化运行时,oracle,oracle19c,Oracle,Oracle19c,我有一个分层查询,目前大约以1.1秒的速度执行200万行。 如您所见,它由日期分隔。 带索引 SELECT * from ( SELECT * FROM zhr_struct_jmk4 WHERE id >= 9000000 AND ID <= 100000000 AND SBEGD <= :iv_begda AND sendd >= :iv_endda ) a start wit

我有一个分层查询,目前大约以1.1秒的速度执行200万行。 如您所见,它由日期分隔。 带索引

     SELECT *
      from ( SELECT * FROM zhr_struct_jmk4
      WHERE
       id >= 9000000 AND ID <= 100000000
       AND SBEGD <= :iv_begda
        AND sendd >= :iv_endda ) a

      start with objid = '72002506'
      connect BY prior a.id = a.sobid
数据是一个组织层次结构,职位和人员均以日期分隔。因此,日期范围。我正试图根据给定的日期构建层次结构

以下是两个执行计划,包括和不包括拟定索引。实际上,现在使用索引时,它的运行速度变慢了

SQL Statement
----------------------------------------------------------------------------------------------------------------------
SELECT
  *
FROM
  ( SELECT * FROM zhr_struct_jmk4 WHERE id >= 9000000 AND ID <= 100000000 AND SBEGD <= :A0  AND send
  d >= :A1  ) a start with objid = '72002506' connect BY prior a.id = a.sobid


Execution Plan

----------------------------------------------------------------------------------------------------------------------
System: HEV
Plan hash value: 1950817222

--------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                    |     5 |  1375 |    26  (12)| 00:00:01 |
|*  1 |  CONNECT BY NO FILTERING WITH START-WITH|                    |       |       |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED   | ZHR_STRUCT_JMK4    |  2736 |   665K|    24   (5)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN                     | ZHR_STRUCT_JMK4~ZZ |     1 |       |    24   (5)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------

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

   1 - SEL$1
   2 - SEL$E029B2FF / ZHR_STRUCT_JMK4@SEL$5
   3 - SEL$E029B2FF / ZHR_STRUCT_JMK4@SEL$5

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

   1 - access("ZHR_STRUCT_JMK4"."SOBID"=PRIOR "ZHR_STRUCT_JMK4"."ID")
       filter("ZHR_STRUCT_JMK4"."OBJID"='72002506')
   3 - access("SENDD">=:A1 AND "ID">=9000000 AND "SBEGD"<=:A0 AND "ID"<=100000000)
       filter("ID">=9000000 AND "ID"<=100000000 AND "SENDD">=:A1)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "ZHR_STRUCT_JMK4"."MANDT"[VARCHAR2,9], "ZHR_STRUCT_JMK4"."ID"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."SBEGD"[VARCHAR2,24], "ZHR_STRUCT_JMK4"."SENDD"[VARCHAR2,24],
       "ZHR_STRUCT_JMK4"."SEQNR"[NUMBER,22], "ZHR_STRUCT_JMK4"."SLEVEL"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."OTYPE"[VARCHAR2,6], "ZHR_STRUCT_JMK4"."OBJID"[VARCHAR2,135],
       "ZHR_STRUCT_JMK4"."PDOWN"[NUMBER,22], "ZHR_STRUCT_JMK4"."PNEXT"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."PUP"[NUMBER,22], "ZHR_STRUCT_JMK4"."PPREV"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."VRSIGN"[VARCHAR2,3], "ZHR_STRUCT_JMK4"."VRELAT"[VARCHAR2,9],
       "ZHR_STRUCT_JMK4"."VBEGDA"[VARCHAR2,24], "ZHR_STRUCT_JMK4"."VENDDA"[VARCHAR2,24],
       "ZHR_STRUCT_JMK4"."SOBID"[NUMBER,22], "ZHR_STRUCT_JMK4"."SOBID"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."ID"[NUMBER,22], PRIOR NULL[22], LEVEL[4]
   2 - "ZHR_STRUCT_JMK4".ROWID[ROWID,10], "ZHR_STRUCT_JMK4"."MANDT"[VARCHAR2,9], "ID"[NUMBER,22],
       "SBEGD"[VARCHAR2,24], "SENDD"[VARCHAR2,24], "ZHR_STRUCT_JMK4"."SEQNR"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."SLEVEL"[NUMBER,22], "ZHR_STRUCT_JMK4"."OTYPE"[VARCHAR2,6],
       "ZHR_STRUCT_JMK4"."OBJID"[VARCHAR2,135], "ZHR_STRUCT_JMK4"."PDOWN"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."PNEXT"[NUMBER,22], "ZHR_STRUCT_JMK4"."PUP"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."PPREV"[NUMBER,22], "ZHR_STRUCT_JMK4"."VRSIGN"[VARCHAR2,3],
       "ZHR_STRUCT_JMK4"."VRELAT"[VARCHAR2,9], "ZHR_STRUCT_JMK4"."VBEGDA"[VARCHAR2,24],
       "ZHR_STRUCT_JMK4"."VENDDA"[VARCHAR2,24], "ZHR_STRUCT_JMK4"."SOBID"[NUMBER,22]
   3 - "ZHR_STRUCT_JMK4".ROWID[ROWID,10], "SBEGD"[VARCHAR2,24], "SENDD"[VARCHAR2,24],
       "ID"[NUMBER,22], "ZHR_STRUCT_JMK4"."SOBID"[NUMBER,22]

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
无索引:

SQL Statement
----------------------------------------------------------------------------------------------------------------------
SELECT
  *
FROM
  ( SELECT * FROM zhr_struct_jmk4 WHERE id >= 9000000 AND ID <= 100000000 AND SBEGD <= :A0  AND send
  d >= :A1  ) a start with objid = '72002506' connect BY prior a.id = a.sobid


Execution Plan

----------------------------------------------------------------------------------------------------------------------
System: HEV
Plan hash value: 3515252885

-----------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                 |     5 |  1375 |  4421  (12)| 00:00:01 |
|*  1 |  CONNECT BY NO FILTERING WITH START-WITH|                 |       |       |            |          |
|*  2 |   TABLE ACCESS FULL                     | ZHR_STRUCT_JMK4 |  2736 |   665K|  4418  (11)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------

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

   1 - SEL$1
   2 - SEL$E029B2FF / ZHR_STRUCT_JMK4@SEL$5

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

   1 - access("ZHR_STRUCT_JMK4"."SOBID"=PRIOR "ZHR_STRUCT_JMK4"."ID")
       filter("ZHR_STRUCT_JMK4"."OBJID"='72002506')
   2 - filter("ID">=9000000 AND "ID"<=100000000 AND "SBEGD"<=:A0 AND "SENDD">=:A1)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "ZHR_STRUCT_JMK4"."MANDT"[VARCHAR2,9], "ZHR_STRUCT_JMK4"."ID"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."SBEGD"[VARCHAR2,24], "ZHR_STRUCT_JMK4"."SENDD"[VARCHAR2,24],
       "ZHR_STRUCT_JMK4"."SEQNR"[NUMBER,22], "ZHR_STRUCT_JMK4"."SLEVEL"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."OTYPE"[VARCHAR2,6], "ZHR_STRUCT_JMK4"."OBJID"[VARCHAR2,135],
       "ZHR_STRUCT_JMK4"."PDOWN"[NUMBER,22], "ZHR_STRUCT_JMK4"."PNEXT"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."PUP"[NUMBER,22], "ZHR_STRUCT_JMK4"."PPREV"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."VRSIGN"[VARCHAR2,3], "ZHR_STRUCT_JMK4"."VRELAT"[VARCHAR2,9],
       "ZHR_STRUCT_JMK4"."VBEGDA"[VARCHAR2,24], "ZHR_STRUCT_JMK4"."VENDDA"[VARCHAR2,24],
       "ZHR_STRUCT_JMK4"."SOBID"[NUMBER,22], "ZHR_STRUCT_JMK4"."SOBID"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."ID"[NUMBER,22], PRIOR NULL[22], LEVEL[4]
   2 - "ZHR_STRUCT_JMK4"."MANDT"[VARCHAR2,9], "ID"[NUMBER,22], "SBEGD"[VARCHAR2,24],
       "SENDD"[VARCHAR2,24], "ZHR_STRUCT_JMK4"."SEQNR"[NUMBER,22], "ZHR_STRUCT_JMK4"."SLEVEL"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."OTYPE"[VARCHAR2,6], "ZHR_STRUCT_JMK4"."OBJID"[VARCHAR2,135],
       "ZHR_STRUCT_JMK4"."PDOWN"[NUMBER,22], "ZHR_STRUCT_JMK4"."PNEXT"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."PUP"[NUMBER,22], "ZHR_STRUCT_JMK4"."PPREV"[NUMBER,22],
       "ZHR_STRUCT_JMK4"."VRSIGN"[VARCHAR2,3], "ZHR_STRUCT_JMK4"."VRELAT"[VARCHAR2,9],
       "ZHR_STRUCT_JMK4"."VBEGDA"[VARCHAR2,24], "ZHR_STRUCT_JMK4"."VENDDA"[VARCHAR2,24],
       "ZHR_STRUCT_JMK4"."SOBID"[NUMBER,22]

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

DB版本:Oracle 19.9

您应该在SBEGD、SENDD、OBJID和SOBID上有索引。然后收集该表的统计信息。

请共享您已经构建的索引和执行计划。不一定有一个索引可以帮助您将日期与=。索引最适合检索小部分数据,但基于范围的日期比较通常会返回大部分数据。如果您能分享有关数据和执行计划的信息,可能会对我们有所帮助。@ankit bajpai我编辑了上面的答案供您参考