我有一张如下表:
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')
为什么这不使用索引?我应该在表上实现全局分区索引吗? 是因为我使用密钥分区列作为索引列?不确定
答案 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 ;
明确声明应该影响哪个分区?执行计划会改变吗?
答案 1 :(得分:0)
所以你要删除大约2百万行,并且正如@ ibre5041所说,我说,oracle不会使用索引。您可以使用分区交换:
我,你像往常一样装了你的桌子,没关系
ii,而不是从所需的较小数据集创建“临时”表 /将create table作为select,或者使用append hint插入,当然在/
中并行iii,之后您可以将子分区与临时表交换,子分区仅包含“正确”数据
所以删除了删除