分区表的操作对索引的影响

一直知道对分区表的DDL 操作可能导致索引失效,但是还没做过总结,今天稍微总结下。

  • 增加分区对所有索引都没影响
  • Truncate 分区会导致全局索引,主键失效。分区索引不受影响
  • Truncate update global indexes 索引不受影响
  • Move 分区导致全局索引和分区所在的本地索引失效。
  • Move update global indexes 全局索引没影响,分区所在的本地索引失效.
  • Drop 分区导致全局索引失效,分区索引不受影响
  • Drop upgrade global indexes 分区所有索引都不受影响

以上结论看出,分区表操作较为复杂,每次操作完都应该检查验证索引是否失效。

SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE STATUS=‘UNUSABLE‘;

SELECT INDEX_NAME,PARTITION_NAME,STATUS FROM USER_IND_PARTITIONS WHERE STATUS=‘UNUSABLE‘;

1.建表

create table test_part
(
  ID NUMBER(20) not null,
  REMARK VARCHAR2(1000),
  create_time DATE
)
PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, ‘year‘))
(partition part_t01 values less than(to_date(‘2018-11-01‘, ‘yyyy-mm-dd‘)));

--创建主键
alter table test_part add constraint INDEX_PK primary key (ID) using INDEX;
--创建全局索引
create index INDEX_1 on TEST_PART (REMARK);
--创建本地索引
create index INDEX_2 on TEST_PART (create_time) LOCAL; 

2.增加分区对索引的影响

INSERT INTO test_part VALUES(1,‘1‘,TO_DATE(‘20181001‘,‘YYYYMMDD‘));
INSERT INTO test_part VALUES(2,‘2‘,TO_DATE(‘20181101‘,‘YYYYMMDD‘));
INSERT INTO test_part VALUES(3,‘3‘,TO_DATE(‘20181201‘,‘YYYYMMDD‘));
INSERT INTO test_part VALUES(4,‘4‘,TO_DATE(‘20191201‘,‘YYYYMMDD‘));

COL HIGH_VALUE FOR A100
SELECT PARTITION_NAME,HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME=‘TEST_PART‘;

PARTITION_NAME       HIGH_VALUE
-------------------- ----------------------------------------------------------------------------------------------------
PART_T01             TO_DATE(‘ 2018-11-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
SYS_P52              TO_DATE(‘ 2019-11-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
SYS_P53              TO_DATE(‘ 2020-11-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA

SQL> SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       VALID
INDEX_1                        VALID
INDEX_2                        N/A

SQL> SELECT INDEX_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME=‘INDEX_2‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_2                        USABLE
INDEX_2                        USABLE
INDEX_2                        USABLE   

可见,增加分区对所有索引都没影响

3.Truncate分区对索引的影响

SQL> alter table TEST_PART truncate partition PART_T01;

Table truncated.

SQL> SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       UNUSABLE
INDEX_1                        UNUSABLE
INDEX_2                        N/A

SQL> SELECT INDEX_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME=‘INDEX_2‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_2                        USABLE
INDEX_2                        USABLE
INDEX_2                        USABLE

Truncate 分区会导致全局索引,主键失效。分区索引不受影响

4.Truncate update global indexes

SQL> alter index INDEX_PK rebuild online;

Index altered.

SQL> alter index INDEX_1 rebuild online;

Index altered.

SQL> SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       VALID
INDEX_1                        VALID
INDEX_2                        N/A

SQL> alter table TEST_PART truncate partition SYS_P52 update global indexes;

Table truncated.

SQL> SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       VALID
INDEX_1                        VALID
INDEX_2                        N/A

Truncate update global indexes 对索引无影响

5. Move 分区对索引的影响

INSERT INTO test_part VALUES(1,‘1‘,TO_DATE(‘20181001‘,‘YYYYMMDD‘));
INSERT INTO test_part VALUES(2,‘2‘,TO_DATE(‘20181101‘,‘YYYYMMDD‘));
INSERT INTO test_part VALUES(3,‘3‘,TO_DATE(‘20181201‘,‘YYYYMMDD‘));

SQL> ALTER TABLE TEST_PART MOVE PARTITION PART_T01;

Table altered.

SQL>  SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       UNUSABLE
INDEX_1                        UNUSABLE
INDEX_2                        N/A

SQL> SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       UNUSABLE
INDEX_1                        UNUSABLE
INDEX_2                        N/A

SQL> SELECT INDEX_NAME,PARTITION_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME=‘INDEX_2‘;

INDEX_NAME                     PARTITION_NAME       STATUS
------------------------------ -------------------- --------
INDEX_2                        PART_T01             UNUSABLE
INDEX_2                        SYS_P52              USABLE
INDEX_2                        SYS_P53              USABLE

move 分区会导致全局索引和分区所在的本地索引失效。

6.Move update global indexes对索引的影响

1.修复:
==================
alter index INDEX_PK rebuild online;
alter index INDEX_1 rebuild online;
alter index INDEX_2 rebuild partition PART_T01 online;

SQL> SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       VALID
INDEX_1                        VALID
INDEX_2                        N/A

SQL>  SELECT INDEX_NAME,PARTITION_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME=‘INDEX_2‘;

INDEX_NAME                     PARTITION_NAME       STATUS
------------------------------ -------------------- --------
INDEX_2                        PART_T01             USABLE
INDEX_2                        SYS_P52              USABLE
INDEX_2                        SYS_P53              USABLE

2.Move 分区
==================
SQL> ALTER TABLE TEST_PART MOVE PARTITION PART_T01 update global indexes;

Table altered.

SQL> SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       VALID
INDEX_1                        VALID
INDEX_2                        N/A

SQL>  SELECT INDEX_NAME,PARTITION_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME=‘INDEX_2‘;

INDEX_NAME                     PARTITION_NAME       STATUS
------------------------------ -------------------- --------
INDEX_2                        PART_T01             UNUSABLE
INDEX_2                        SYS_P52              USABLE
INDEX_2                        SYS_P53              USABLE

Move update global indexes 全局索引没影响,分区索引部分失效.

7. Move Compress 分区对索引的影响

ALTER INDEX INDEX_2 REBUILD PARTITION PART_T01 ONLINE;
ALTER TABLE TEST_PART COMPRESS PARTITION PART_T01;
ALTER TABLE TEST_PART MOVE PARTITION PART_T01 COMPRESS FOR OLTP;

结果同 5. move 分区

8. Drop 分区对索引的影响

alter index INDEX_PK rebuild online;
alter index INDEX_1 rebuild online;
alter index INDEX_2 rebuild partition PART_T01 online;
SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;
SELECT INDEX_NAME,PARTITION_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME=‘INDEX_2‘;

SQL> ALTER TABLE TEST_PART DROP PARTITION PART_T01;
ALTER TABLE TEST_PART DROP PARTITION PART_T01
                                     *
ERROR at line 1:
ORA-14758: Last partition in the range section cannot be dropped

SQL> COL HIGH_VALUE FOR A100
SQL> SELECT PARTITION_NAME,HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME=‘TEST_PART‘;

PARTITION_NAME       HIGH_VALUE
-------------------- ----------------------------------------------------------------------------------------------------
PART_T01             TO_DATE(‘ 2018-11-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
SYS_P52              TO_DATE(‘ 2019-11-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA
SYS_P53              TO_DATE(‘ 2020-11-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIA

第一个分区不能被删除

ALTER TABLE TEST_PART DROP PARTITION SYS_P53;

SQL> SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       UNUSABLE
INDEX_1                        UNUSABLE
INDEX_2                        N/A

SQL> SELECT INDEX_NAME,PARTITION_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME=‘INDEX_2‘;

INDEX_NAME                     PARTITION_NAME       STATUS
------------------------------ -------------------- --------
INDEX_2                        PART_T01             USABLE
INDEX_2                        SYS_P52              USABLE

Drop 分区导致全局索引失效,分区索引不受影响

9. Drop update global indexes 分区对索引的影响

alter index INDEX_PK rebuild online;
alter index INDEX_1 rebuild online;
alter index INDEX_2 rebuild partition PART_T01 online;
SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;
SELECT INDEX_NAME,PARTITION_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME=‘INDEX_2‘;

ALTER TABLE TEST_PART DROP PARTITION SYS_P52 UPDATE GLOBAL INDEXES;

SQL> SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME=‘TEST_PART‘;

INDEX_NAME                     STATUS
------------------------------ --------
INDEX_PK                       VALID
INDEX_1                        VALID
INDEX_2                        N/A

SQL> SELECT INDEX_NAME,PARTITION_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME=‘INDEX_2‘;

INDEX_NAME                     PARTITION_NAME       STATUS
------------------------------ -------------------- --------
INDEX_2                        PART_T01             USABLE

Drop upgrade global indexes 分区所有索引都不受影响

原文地址:https://www.cnblogs.com/plluoye/p/12217132.html

时间: 2024-10-14 02:42:26

分区表的操作对索引的影响的相关文章

Sql Server之旅——第十站 看看DML操作对索引的影响

我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,我们也知道建索引是需要维护成本的,这个维护也就在于DML操作了, 下面我们具体看看到底DML对索引都有哪些内幕.... 一:delete操作 现在我们已经知道,索引都是以B树的形式存在的,既然是B树,我们就要看看他们的叶子节点和分支结点,先准备点测试数据,如下图: CREATE TABLE Person(ID INT,NAME CHAR(200)) CREATE INDEX idx_Name ON Person(NAME) DECLAR

DML操作对索引的影响

一:delete操作 现在我们已经知道,索引都是以B树的形式存在的,既然是B树,我们就要看看他们的叶子节点和分支结点,先准备点测试数据,如下图: 按 Ctrl+C 复制代码 按 Ctrl+C 复制代码 <1> 叶子结点的变化 从上面的图中大概可以看到,当我插入完毕后,现在有4个索引数据页,其中PID=200的为分支数据页,其他三个为叶子节点数据页,分别 为175,201,202号数据页,然后我就挑选第二个叶子节点数据页201号,看看里面的数据是啥样的. 从数据页中可以看到在201号数据页中有1

Atitit.分区对索引的影响&#160;分区索引和全局索引&#160;attilax总结

Atitit.分区对索引的影响 分区索引和全局索引 attilax总结 1. 分区的好处1 2. 分区键:2 3. 分区的建议:2 4. 分区索引和全局索引:2 5. 全局索引就是在全表上创建索引, 3 6. 总结4 7. refer4 1. 分区的好处 在一个表的数据超过过2000万条或占用2G空间时,建议建立分区表 分区使得数据管理操作如数据装载.索引建立和重建.备份和恢复等在分区级别上完成,这比在表级完成操作要明显的节省时间: 分区可以提高性能,在很多情况下,查询可以通过扫描某个分区来完成

alter table新增字段操作究竟有何影响?(上篇)

很久以前就有个疑问,见过一些表设计时会留出几个reverse的字段,目的是为了以后扩展,但此时设计的字段类型.长度等都是预计的,未来是否可用,不好说,那为什么会这么做呢?可能的原因是:"我现在设定好字段,需要的时候直接用就行了,不需要新增字段的操作". 那么,问题就是,新增字段的操作究竟有什么影响?增加表字段的时候,是否会锁表?对DML.DDL有什么影响?如果搞清楚这些,才能对上面的问题给出科学的答案. 为了证明增加字段的操作究竟做了什么,有什么影响,打算使用10046事件来看看. S

Mysql之表的操作与索引操作

表的操作: 1.表的创建: create table if not exists table_name(字段定义); 例子: create table if not exists user(id int auto_increment, uname varchar(20), address varchar(200), updateTime datetime, primary key(id)); // 设置主键 2.表(show tables;)定义查看: show create table tab

使用solrj操作solr索引库

(solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有那么麻烦,solr配套有好多的客户端用于操作索引库,下面我们来讲如何用solrj去操作solr索引库. 一.认识solrj solrj是solr的java客户端,用于访问solr索引库.它提供了添加.删除.查询.优化等功能. 二.下载 百度.google以下solrj下载,你会发现根本就没有,那么我们该到哪儿

Oracle11g:分区表数据操作出现ORA-14400异常处理

Oracle11g:分区表数据操作出现ORA-14400异常处理 问题: 当对已分区的表数据进行操作(例如新增,修改),出现异常提示: ORA-14400: 插入的分区关键字未映射到任何分区 分析: 意思说的是插入的数据没有相对应的分区来存储,但是奇怪的是这些表建立时都是以间隔分区(INTERVAL)分区的方式建立的,按理说新的数据进来时会自动创建新的分区来存储数据,不应该再有14400错误. 看了下建表语句,发现建立分区时partition by range(col_name)下面并没有INT

转 关于oracle 分区表 表空间以及索引的总结

关于oracle的表空间,分区表,以及索引的总结关键字: oracle, 表空间, 分区表, 索引 上周第一次做数据库测试碰到了很多问题特此总结: 表空间: Oracle的UNDOTBS01.DBF文件太大的解决办法 1..禁止undo tablespace自动增长 alter   database   datafile   'full_path\undotbs01.dbf'   autoextend   off; 2.-- 创建一个新的小空间的undo tablespace create un

聚焦-聚集索引对非聚集索引的影响(四)

前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没有任何意义,学习的过程必须同时也是一个思考的过程,无论是独立思考也好还是查资料也罢都是思考而非走马观花,要不然过一段时间又会健忘.简短的内容,深入的理解. 话题 非聚集索引定义:非聚集索引也是一个B树结构,与聚集索引不同的是,B树的叶子节点存的是指向堆或聚集索引的指针.你真的理解了吗??你能举出例子吗?