原文连接:
http://blog.sina.com.cn/s/blog_4be7cab90100awz2.html
分区表主键如何使用分区索引?
主键索引失效,rebuild太慢了,
打算建立分区索引时才意识到以前没做过这样的工作,
建表时,在添加primary key时会自动生成索引,这个索引并不会进行随着表分区而分区。
于是查资料,找到这篇文章
文章中心就一句话:现在需要建立主键的列上创建一个分区索引,然后添加主键,oracle会自动选用这个索引作为主键的索引。
PURPOSE
This article gives examples of how to create primary key partitioned
indexes.
SCOPE & APPLICATION
For users trying to create primary key partitioned indexes.
How To Create Primary Key Partitioned Indexes:
==============================================
Example:
SQL> -- Create partitioned table TEST_A
SQL>
SQL> CREATE TABLE test_a (col1 number, col2 number, col3 varchar2(20))
2 PARTITION BY RANGE (col1, col2)
3 (partition part_test_a_1 values less than (10, 100),
4 partition part_test_a_2 values less than (20, 200),
5 partition part_test_a_3 values less than (30, 300),
6 partition part_test_a_4 values less than (40, 400));
Table created.
SQL> -- Create partitioned table TEST_B
SQL>
SQL> CREATE TABLE test_b (col1 number, col2 number, col3 varchar2(20))
2 PARTITION BY RANGE (col1, col2)
3 (partition part_test_b_1 values less than (10, 100),
4 partition part_test_b_2 values less than (20, 200),
5 partition part_test_b_3 values less than (30, 300),
6 partition part_test_b_4 values less than (40, 400));
Table created.
SQL> -- Create a non-unique local partitioned index, IX_TEST_A,
SQL> -- on TEST_A
SQL>
SQL> CREATE INDEX ix_test_a ON test_a(col1, col2)
2 LOCAL
3 (partition ix_test_a_1,
4 partition ix_test_a_2,
5 partition ix_test_a_3,
6 partition ix_test_a_4);
Index created.
SQL> -- Create a unique global partitioned index, IX_TEST_B,
SQL> -- on TEST_B
SQL>
SQL> CREATE UNIQUE INDEX ix_test_b1 ON test_b(col1, col2)
2 GLOBAL PARTITION BY RANGE (col1, col2)
3 (partition ix_test_b1_1 values less than (20, 200),
4 partition ix_test_b1_2 values less than (maxvalue, maxvalue));
Index created.
SQL> -- Add a primary key constraint, PK_TEST_A, to TEST_A
SQL>
SQL> ALTER TABLE test_a ADD CONSTRAINT pk_test_a
2 PRIMARY KEY (col2, col1);
Table altered.
SQL> -- Attempt to drop index IX_TEST_A; note the following error...
SQL>
SQL> DROP INDEX ix_test_a;
drop index ix_test_a
*
ERROR at line 1:
ORA-02429: cannot drop index used for enforcement of unique/primary key
SQL> -- Attempt to create a second index, IX_TEST_B2 on TEST_B
SQL> -- using the same columns used to partition IX_TEST_B1.
SQL> -- Note the following error...
SQL>
SQL> CREATE INDEX ix_test_b2 ON test_b(col1, col2)
2 LOCAL;
create index ix_test_b2 on test_b(col1, col2)
*
ERROR at line 1:
ORA-01408: such column list already indexed
SQL> -- Add a primary key constraint, PK_TEST_B, to TEST_B
SQL>
SQL> ALTER TABLE test_b ADD CONSTRAINT pk_test_b
2 PRIMARY KEY (col1, col2);
Table altered.
SQL> -- Attempt to drop index IX_TEST_B1; note the following error...
SQL>
SQL> DROP INDEX ix_test_b1;
drop index ix_test_b1
*
ERROR at line 1:
ORA-02429: cannot drop index used for enforcement of unique/primary key
SQL> -- A listing of the indexes and their associated partitions.
SQL>
SQL> SELECT index_name, partition_name, status
2 FROM user_ind_partitions
3 ORDER BY index_name, partition_name;
INDEX_NAME PARTITION_NAME STATUS
----------- --------------- --------
IX_TEST_A IX_TEST_A_1 USABLE
IX_TEST_A IX_TEST_A_2 USABLE
IX_TEST_A IX_TEST_A_3 USABLE
IX_TEST_A IX_TEST_A_4 USABLE
IX_TEST_B1 IX_TEST_B1_1 USABLE
IX_TEST_B1 IX_TEST_B1_2 USABLE
6 rows selected.
SQL> -- Drop the primary key constraint from TEST_A
SQL>
SQL> ALTER TABLE test_a DROP CONSTRAINT pk_test_a;
Table altered.
SQL> -- Drop the primary key constraint from TEST_B
SQL>
SQL> ALTER TABLE test_b DROP CONSTRAINT pk_test_b;
Table altered.
SQL> -- A listing of the indexes and their associated partitions.
SQL> -- Note that while IX_TEST_A, the non-unique local partitioned
SQL> -- index, remains and has a status of USABLE.
SQL> -- IX_TEST_B, the unique global partitioned index, has been
SQL> -- dropped.
SQL>
SQL> SELECT index_name, partition_name, status
2 FROM user_ind_partitions
3 ORDER BY index_name, partition_name;
INDEX_NAME PARTITION_NAME STATUS
--------------- -------------- --------
IX_TEST_A IX_TEST_A_1 USABLE
IX_TEST_A IX_TEST_A_2 USABLE
IX_TEST_A IX_TEST_A_3 USABLE
IX_TEST_A IX_TEST_A_4 USABLE
The primary key uses the underlying index if the index is built using
the same columns as defined in the primary key. This is consistent
without regard to whether the index was created as a unique or non-unique
index, or if it is a global or local partioned index. It is important
to note that while in the example a primary key was established on a
non-unique index, this will only occur if the values within the index
are in fact unique. Attempting to enable a primary key constraint when
duplicate values are present within the index will result in the
following error:
"ORA-02437: cannot enable (STEELY.PK_TEST_B) - primary key violated."
Two indexes cannot be created using the same ordered columns. This was
demonstrated above when attempting to create a second index on table
TEST_B. This resulted in the following error:
"ORA-01408: such column list already indexed."
However, changing the order of the columns will permit the creation of
additional indexes using the same columns.
Contrary to the previous note, the column order for index IX_TEST_A and
the definition for the primary key PK_TEST_A were reversed. Yet the
primary key still used IX_TEST_A as the underlying index.
When dropping a primary key constraint from a table, the corresponding
index is also dropped if the index was created as a UNIQUE index. This
behavior is consistent for both LOCAL as well as GLOBAL partitioned
indexes.
To receive the full benefits of partitioning, users/DBA must use the
STORAGE clause when creating partitioned tables/indices.
---------------------------------------------------------------
如果表已经分完区了,并且数据量比较大的话,不方便重建表的话,可以直接删除主键,
然后利用上边的语句,进行主键索引的分区,分区列字段要包含分区键。
1) alter table 表 drop constraint 主键 cascade;
2) ALTER TABLE 表 ADD CONSTRAINT 主键名称 PRIMARY KEY (主键,分区键) USING INDEX LOCAL
分享到:
相关推荐
Oracle 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) ...
为了修复索引,可以使用以下命令重建受影响的分区索引: ```sql ALTER INDEX I_T_RANGE2_DATE REBUILD PARTITION P_T_2 /*PARALLEL 4*/ NOLOGGING; ``` - **结论:** 当分区表使用局部索引,并且进行了分区...
当表的大小超过2GB时,官方推荐使用分区表,因为它们在处理大量数据时具有显著优势。本文将详细介绍如何通过在线重定义(DBMS_REDEFINITION)将普通表转换为分区表,这是官方给出的四种方法之一,且对系统的影响最小...
### 分区表与分区索引详解 在数据库设计与优化领域,分区技术是提升查询性能、简化管理操作的重要手段之一。本文将深入探讨分区表(Partitioned Tables)和分区索引(Partitioned Indexes),旨在为数据库管理员和...
3. **创建索引**:为分区表创建一个唯一索引`tb_pt_ind1`。 4. **生成数据**:使用`INSERT`语句为分区表添加数据。 ```sql INSERT INTO tb_pt SELECT TRUNC(SYSDATE) + ROWNUM, DBMS_RANDOM.RANDOM, ROWNUM FROM...
创建了分区表后,我们需要创建一个聚集分区索引,该索引将根据 OrderDate 列将数据分布到不同的分区中。 ```sql create clustered index IXC_Orders_OrderDate on dbo.Orders(OrderDate) go ``` 五、设置主键 设置...
此外,可以将现有的内部分区表转换为混合分区表,也可以在内部分区上创建全局部分非唯一索引。还可以将混合分区表转变为仅包含内部分区的表,或者将内部分区转换为外部非分区表。 6. **测试案例** 测试通常涉及...
这个查询将返回`SPF_Users`表中的主键列名以及它们在主键中的顺序(`key_ordinal`)和分区顺序(`partition_ordinal`)。注意,`is_primary_key`属性用来标识该索引是否为主键。 ### SQL查询数据表的所有字段 除了...
在PostgreSQL中,可以使用`DROP TABLE`命令安全地删除不再需要的分区,同时保持整个分区表结构的完整性。 总结 PostgreSQL的分区表功能允许开发者将大数据集分散到多个物理表中,以提高查询效率、简化数据管理并...
### Oracle 数据库管理:表空间、分区表与索引详解 #### 表空间管理与优化 在Oracle数据库中,表空间是数据文件的容器,它为数据库中的对象提供存储空间。当遇到表空间如`UNDOTBS01.DBF`过大等问题时,可采取以下...
2. **性能提升**:MySQL 5.5.8对查询优化器进行了改进,使得在处理分区表时能更好地利用索引,提高查询速度。特别是在执行涉及多个分区的DML(数据操作语言)操作时,如INSERT、UPDATE和DELETE,这些操作可以并行...
1. 创建一个与原始分区表结构完全一致的普通表`fqb0`,包括相同的字段、数据类型、主键以及聚集索引。注意,这个新表不能是分区表,并且必须为空。 ```sql CREATE TABLE [fqb0]([ID] [bigint] NOT NULL,-- Identity...
使用`CREATE TABLE`语句创建分区表,其中`ON [PartScheme] (ID)`指定了根据`ID`列的值来应用分区方案。这里可能有一个误解,因为示例中的`ON [PartScheme] (ID)`应该是`ON [PartScheme] (date)`,以便根据`date`列...
-- 注意:如果在分区化改造过程中数据回迁之前抛出异常,则手动数据回迁前注意检查分区表有无主键索引。 3.分区维护主过程:AGGRE_PM_PARTITIONM.SQL, 意思是PARTITION MANAGEMENT; 4.创建分区维护JOB -- 对在分区...
- 索引是提升查询速度的关键,但在分区表中,索引的设计更为复杂。每个分区可以有自己的索引,但全局索引跨越所有分区。 - 选择合适的索引策略可以进一步优化分区查询,例如,为经常查询的分区字段创建索引。 5. ...
MySQL分区表是一种数据库管理策略,它将一个大表的数据分散到多个物理存储单元,从而提高数据管理和查询性能。本文将深入探讨分区表的概念、优点、限制以及常见的分区类型。 首先,分区表的基本概念是根据特定的...
然而,问题在于,如果一个表已经基于分区字段和其他字段建立了复合主键,是否还需要为分区字段单独创建索引? 首先,我们要理解分区和索引的作用。分区通过将数据分割到不同的物理存储块上,减少了查询需要扫描的...
分区索引能够提高对大型表的查询性能。例如,下面的代码演示了如何创建一个分区索引: ```sql CREATE INDEX IX_GD_YX_ZYTDYH_DEMO2 ON GD_YX_ZYTDYH (ZRBM, ZZSJ) LOCAL NOLOGGING PARALLEL 4; ``` - **`LOCAL`**:...
虽然不是必需的,但在分区表上创建索引可以进一步提升查询性能。在本例中,为`uid`字段创建了索引,这样可以更快地查找特定的用户ID。 ```sql CREATE INDEX users_0_uidindex ON users_0(uid); CREATE INDEX ...
- 在分区表上创建唯一索引或主键时,必须包含分区键。 - 如果频繁删除分区且数据更新频繁,则应避免使用全局索引。 #### 四、增加分区 1. **增加分区命令**: - 若要添加新的分区,可以使用以下命令: ```sql ...