分区表索引不起作用

时间:2015-03-26 14:00:37

标签: sql oracle indexing oracle11g database-partitioning

我有一张如下表:

CREATE TABLE MYTAB_TEST
(
  COBDATE                  NUMBER(9)            DEFAULT 0,
  SYSTEM                   VARCHAR2(3 BYTE)     DEFAULT ' ',
  BATCH_ID                 VARCHAR2(4 BYTE)     DEFAULT ' ',
  BATCH_TYPE               VARCHAR2(3 BYTE)     DEFAULT ' ',
  LOAD_TYPE                VARCHAR2(3 BYTE)     DEFAULT ' '
  )
  PARTITION BY RANGE (COBDATE)
    SUBPARTITION BY RANGE (COBDATE)
(  
  PARTITION P_POS_2014 VALUES LESS THAN (20150101)
  )
                )
  ( SUBPARTITION P_2014_JAN_01 VALUES LESS THAN (20140102)      TABLESPACE FOOTC_DATA,
    SUBPARTITION P_2014_JAN_02 VALUES LESS THAN (20140103)      TABLESPACE FOOTC_DATA,
    SUBPARTITION P_2014_JAN_03 VALUES LESS THAN (20140104)      TABLESPACE FOOTC_DATA,
    SUBPARTITION P_2014_JAN_04 VALUES LESS THAN (20140105)      TABLESPACE FOOTC_DATA,
    SUBPARTITION P_2014_JAN_05 VALUES LESS THAN (20140106)      TABLESPACE FOOTC_DATA,
    SUBPARTITION P_2014_JAN_06 VALUES LESS THAN (20140107)      TABLESPACE FOOTC_DATA,
    SUBPARTITION P_2014_JAN_07 VALUES LESS THAN (20140108)      TABLESPACE FOOTC_DATA,
    ---
    ---
    --
    so on ..

)

此表每天分区。

我已经创建了相同的本地索引,这个表每天有100万行的负载。 由于我们正在为特定日期运行表的删除,因此需要花费大量时间来完成状态 并且还检查了我的删除查询未使用带解释计划的索引。

在MYTAB_TEST上创建本地索引H_POS_LOCAL_IDX(COBDATE,SYSTEM,BATCH_ID,LOAD_TYPE)

我的删除查询:

delete from MYTAB_TEST where cobdate =20150306 and system ='M' and batch_id='N1' and batch_type='S' and load_type='S ;

PLAN TABLE OUTPUT:

Plan hash value: 822252374

---------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name       | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT      |            |  1880K|    23M|  1533   (1)| 00:00:19 |       |       |        |      |            |
|   1 |  DELETE               | MYTAB_TEST |       |       |            |          |       |       |        |      |            |
|   2 |   PX COORDINATOR      |            |       |       |            |          |       |       |        |      |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000   |  1880K|    23M|  1533   (1)| 00:00:19 |       |       |  Q1,00 | P->S | QC (RAND)  |
|   4 |     PX BLOCK ITERATOR |            |  1880K|    23M|  1533   (1)| 00:00:19 |    66 |    66 |  Q1,00 | PCWC |            |
|*  5 |      TABLE ACCESS FULL| MYTAB_TEST |  1880K|    23M|  1533   (1)| 00:00:19 |   432 |   432 |  Q1,00 | PCWP |            |
---------------------------------------------------------------------------------------------------------------------------------

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

   5 - filter("COBDATE"=20150306 AND "SYSTEM"='M' AND "BATCH_ID"='N1' AND "LOAD_TYPE"='L')

为什么这不使用索引?我应该在表上实现全局分区索引吗? 是因为我使用密钥分区列作为索引列?不确定

2 个答案:

答案 0 :(得分:0)

您的开始分区和结束分区是相同的(423)。因此,分区修剪发生了。 "FULL TABLE SCAN"超过单个分区可能是最佳解决方案。

您从该分区删除了多少行(百分比)? 怎么样:

delete from MYTAB_TEST subpartition(yyyy)
where cobdate =20150306 and system ='M' 
   and batch_id='N1' and batch_type='S' and load_type='S ;

明确声明应该影响哪个分区?执行计划会改变吗?

已编辑:partition_extension_clause fixed

答案 1 :(得分:0)

所以你要删除大约2百万行,并且正如@ ibre5041所说,我说,oracle不会使用索引。您可以使用分区交换:

我,你像往常一样装了你的桌子,没关系

ii,而不是从所需的较小数据集创建“临时”表 /将create table作为select,或者使用append hint插入,当然在/

中并行

iii,之后您可以将子分区与临时表交换,子分区仅包含“正确”数据

所以删除了删除