`

分区表主键如何使用分区索引

阅读更多
原文连接: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 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) ...

    oracel 分区表索引失效的问题

    为了修复索引,可以使用以下命令重建受影响的分区索引: ```sql ALTER INDEX I_T_RANGE2_DATE REBUILD PARTITION P_T_2 /*PARALLEL 4*/ NOLOGGING; ``` - **结论:** 当分区表使用局部索引,并且进行了分区...

    oracle普通表转化为分区表的方法

    当表的大小超过2GB时,官方推荐使用分区表,因为它们在处理大量数据时具有显著优势。本文将详细介绍如何通过在线重定义(DBMS_REDEFINITION)将普通表转换为分区表,这是官方给出的四种方法之一,且对系统的影响最小...

    [三思笔记]全面学习分区表及分区索引

    ### 分区表与分区索引详解 在数据库设计与优化领域,分区技术是提升查询性能、简化管理操作的重要手段之一。本文将深入探讨分区表(Partitioned Tables)和分区索引(Partitioned Indexes),旨在为数据库管理员和...

    导入导出 Oracle 分区表数据

    3. **创建索引**:为分区表创建一个唯一索引`tb_pt_ind1`。 4. **生成数据**:使用`INSERT`语句为分区表添加数据。 ```sql INSERT INTO tb_pt SELECT TRUNC(SYSDATE) + ROWNUM, DBMS_RANDOM.RANDOM, ROWNUM FROM...

    sqlserver分区表制作实例.doc

    创建了分区表后,我们需要创建一个聚集分区索引,该索引将根据 OrderDate 列将数据分布到不同的分区中。 ```sql create clustered index IXC_Orders_OrderDate on dbo.Orders(OrderDate) go ``` 五、设置主键 设置...

    ORACLE19c中的混合分区表的使用.pdf

    此外,可以将现有的内部分区表转换为混合分区表,也可以在内部分区上创建全局部分非唯一索引。还可以将混合分区表转变为仅包含内部分区的表,或者将内部分区转换为外部非分区表。 6. **测试案例** 测试通常涉及...

    SQL语句查询数据表主键和所有字段

    这个查询将返回`SPF_Users`表中的主键列名以及它们在主键中的顺序(`key_ordinal`)和分区顺序(`partition_ordinal`)。注意,`is_primary_key`属性用来标识该索引是否为主键。 ### SQL查询数据表的所有字段 除了...

    PostgreSQL分区表(partitioning)应用实例详解

    在PostgreSQL中,可以使用`DROP TABLE`命令安全地删除不再需要的分区,同时保持整个分区表结构的完整性。 总结 PostgreSQL的分区表功能允许开发者将大数据集分散到多个物理表中,以提高查询效率、简化数据管理并...

    分区表使用+笔记+笔记

    ### Oracle 数据库管理:表空间、分区表与索引详解 #### 表空间管理与优化 在Oracle数据库中,表空间是数据文件的容器,它为数据库中的对象提供存储空间。当遇到表空间如`UNDOTBS01.DBF`过大等问题时,可采取以下...

    MySQL 5.5.8 分区表性能测试

    2. **性能提升**:MySQL 5.5.8对查询优化器进行了改进,使得在处理分区表时能更好地利用索引,提高查询速度。特别是在执行涉及多个分区的DML(数据操作语言)操作时,如INSERT、UPDATE和DELETE,这些操作可以并行...

    Sql Server分区表,清空单个分区的快捷方法.pdf

    1. 创建一个与原始分区表结构完全一致的普通表`fqb0`,包括相同的字段、数据类型、主键以及聚集索引。注意,这个新表不能是分区表,并且必须为空。 ```sql CREATE TABLE [fqb0]([ID] [bigint] NOT NULL,-- Identity...

    SQL_SERVER_2005表分区的使用

    使用`CREATE TABLE`语句创建分区表,其中`ON [PartScheme] (ID)`指定了根据`ID`列的值来应用分区方案。这里可能有一个误解,因为示例中的`ON [PartScheme] (ID)`应该是`ON [PartScheme] (date)`,以便根据`date`列...

    ORACLE大表分区

    -- 注意:如果在分区化改造过程中数据回迁之前抛出异常,则手动数据回迁前注意检查分区表有无主键索引。 3.分区维护主过程:AGGRE_PM_PARTITIONM.SQL, 意思是PARTITION MANAGEMENT; 4.创建分区维护JOB -- 对在分区...

    mysql 数据库表分区

    - 索引是提升查询速度的关键,但在分区表中,索引的设计更为复杂。每个分区可以有自己的索引,但全局索引跨越所有分区。 - 选择合适的索引策略可以进一步优化分区查询,例如,为经常查询的分区字段创建索引。 5. ...

    通过实例学习MySQL分区表原理及常用操作

    MySQL分区表是一种数据库管理策略,它将一个大表的数据分散到多个物理存储单元,从而提高数据管理和查询性能。本文将深入探讨分区表的概念、优点、限制以及常见的分区类型。 首先,分区表的基本概念是根据特定的...

    MySQL分区字段列有必要再单独建索引吗?

    然而,问题在于,如果一个表已经基于分区字段和其他字段建立了复合主键,是否还需要为分区字段单独创建索引? 首先,我们要理解分区和索引的作用。分区通过将数据分割到不同的物理存储块上,减少了查询需要扫描的...

    oracle索引使用样例

    分区索引能够提高对大型表的查询性能。例如,下面的代码演示了如何创建一个分区索引: ```sql CREATE INDEX IX_GD_YX_ZYTDYH_DEMO2 ON GD_YX_ZYTDYH (ZRBM, ZZSJ) LOCAL NOLOGGING PARALLEL 4; ``` - **`LOCAL`**:...

    PostgreSQL 创建表分区

    虽然不是必需的,但在分区表上创建索引可以进一步提升查询性能。在本例中,为`uid`字段创建了索引,这样可以更快地查找特定的用户ID。 ```sql CREATE INDEX users_0_uidindex ON users_0(uid); CREATE INDEX ...

    oracle分区操作文档

    - 在分区表上创建唯一索引或主键时,必须包含分区键。 - 如果频繁删除分区且数据更新频繁,则应避免使用全局索引。 #### 四、增加分区 1. **增加分区命令**: - 若要添加新的分区,可以使用以下命令: ```sql ...

Global site tag (gtag.js) - Google Analytics