【问题标题】:choose one partition but optimizer use partition list all选择一个分区但优化器使用分区列表全部
【发布时间】:2023-03-02 21:05:29
【问题描述】:

我有这样的查询:

select *   from P2P_TST2.kh4rqolog t  where t.kh4ldat472 between to_date('20170121120001', 'YYYYMMDDHH24MISS') and
   to_date('20170121130101', 'YYYYMMDDHH24MISS')

和表测试分区日复一日。我在查询中选择了一个分区,但优化器在执行计划中全部使用分区列表。为什么?

我的表定义:

create table KH4RQOLOG
(
   ...
  kh4stdat472     DATE,
  kh4ldat472      DATE,
  ...     
)
partition by range (KH4LDAT472)
subpartition by list (KH4DBINSTID000)
(
  partition SYS_P2898 values less than (TO_DATE(' 2016-12-06 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace KISHTBS
    pctfree 10
    initrans 1
    maxtrans 255
  (  ...    ),
.
.
  partition SYS_P5433 values less than (TO_DATE(' 2017-01-20 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace KISHTBS
  ... (   ...  ),
  partition SYS_P5509 values less than (TO_DATE(' 2017-01-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace KISHTBS
    ... (   ...  ),
  partition SYS_P5548 values less than (TO_DATE(' 2017-01-22 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace KISHTBS
    ... (   ...  ),
 . 
 . 
   partition SYS_P6556 values less than (TO_DATE(' 2017-02-07 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace KISHTBS
      ... (   ...  ),
);
-- Create/Recreate indexes 
create index ESH_KHCHID472 on KH4RQOLOG (KH4BTCHID472)
  local;
create index IDX_RQIN on KH4RQOLOG (KH4RECID470)
  local;
create index PK_KH4RQOLOG on KH4RQOLOG (KH4RECID472)
  local;

执行计划是:

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1161379669
--------------------------------------------------------------------------------
| Id  | Operation              | Name      | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |           | 75186 |    24M| 23967   (1)| 00:04:
|   1 |  PARTITION RANGE SINGLE|           | 75186 |    24M| 23967   (1)| 00:04:
|   2 |   PARTITION LIST ALL   |           | 75186 |    24M| 23967   (1)| 00:04:
|*  3 |    TABLE ACCESS FULL   | KH4RQOLOG | 75186 |    24M| 23967   (1)| 00:04:
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter("T"."KH4LDAT472">=TO_DATE(' 2017-01-21 12:00:01', 'syyyy-mm-dd hh2
              AND "T"."KH4LDAT472"<=TO_DATE(' 2017-01-21 13:01:01', 'syyyy-mm-dd
16 rows selected

【问题讨论】:

  • 听起来好像出了点问题,但如果没有更多信息,很难判断是什么。您能否添加您的表定义以及解释计划(使用explain plan for select ...;select * from table (dbms_xplan.display); 生成。
  • @JonHeller 我在我的问题中添加了信息。我不能使用 sql plus
  • 我的 PostgreSQL 分区有类似的问题,如果提供的条件不明确,它将搜索所有分区,例如 date = '2017-01-01'::date 将正常工作,但 date = date_trunc('month', '2017-01-27'::date)::date 不会。如果可能,我们通过使用声明的变量并分配我们在其中搜索的日期来解决这个问题。
  • @ŁukaszKamiński 我测试了你的解决方案,我的查询成本降低了,但仍然使用 partition all 。
  • @Mahsaehsani 您不需要 SQL*Plus,这些是可以从任何 SQL 程序运行的常规 SQL 命令。 (但如果您的意思是您无权运行任何命令,那将是一个问题,如果您无权访问,人们实际上无法期望您解决任何问题。)

标签: sql performance oracle11g sql-execution-plan


【解决方案1】:

您的执行计划看起来是正确的。您正在查找一天内的数据,因此您有一个 PARTITION RANGE SINGLE 运算符。由于您的子分区列上没有谓词,因此您有一个 PARTITION LIST ALL 运算符。

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多