分区表的索引

分区表的索引分为:分区对齐索引(Aligned Index)和非对齐索引。对齐索引是指索引结构的分区和基础表的分区相同,这意味着,在表的一个分区上创建的索引,索引结构也在同一个分区中。索引结构在每个分区中都是独立存储和维护的,如果索引结构和表结构在同一个分区(也就是在同一个文件组上),那么索引是与基础表对齐的索引。创建对齐索引,并不意味着必须使用相同名称的分区scheme,只要分区schem使用的分区边界和每个分区存储的文件组相同,这两个分区schem是等价的,使用等价的分区scheme创建的索引和基础表是对齐的。

索引对齐能够提升查询性能,能够实现分区的隔离和分区的切换(switch)操作,建议创建对齐索引。在分区表上创建对齐索引,分区列必须包含在聚集索引键,唯一索引键(唯一索引,主键约束,唯一约束)中;对于对齐的非聚集索引(不是唯一索引),分区列可以是包含列,也可以是索引键。

一,对齐的非聚集索引

创建分区函数,分区scheme,分区表和分区索引:

-- create parition function
CREATE PARTITION FUNCTION pf_int_Left (int)
AS
RANGE LEFT
FOR VALUES (10,20);

--create partition scheme
CREATE PARTITION SCHEME PS_int_Left
AS
PARTITION pf_int_Left
TO ([primary], [primary], [primary]);

-- create heap
create table dbo.dt_partition_index
(
ID int not null,
code int not null,
name varchar(10)
)
on PS_int_Left(ID);

1,分区列必须是聚集索引键的一列

创建聚集索引的目的是为了从物理上组织数据表的存储结构,由于,对表分区影响表的物理结构,使得表的数据按照物理存储顺序存储,因此,SQL Server内部强制分区列必须是聚集索引的一列。

-- create clustered index
create clustered index cix_dtpartition_id
on  dbo.dt_partition_index(ID)
on PS_int_Left(ID)

2,在分区表上创建非聚集索引

在分区表上创建非聚集索引,在默认情况下,创建的是对齐索引:

--create nonclustered index
create nonclustered index ix_dtpartition_Code
on dbo.dt_partition_index(Code)

在分区表上创建辅助索引(不是唯一索引和聚集索引)时,默认创建的是对齐索引。如果索引键中包含分区列,并且使用相同的分区scheme,那么创建的索引就是和基础表对齐的索引。如果没有显式指定分区scheme,或者索引键中没有包含分区列,SQL Server自动向辅助索引中添加分区列,作为包含列。

二,对齐的聚集索引

创建分区表,SQL Server保证分区列是聚集索引键。在创建聚集索引时,如果没有显式指定分区列为聚集索引键,那么SQL Server会自动添加分区列作为索引列,注意:聚集索引没有包含列。

-- create partition heap
create table dbo.dt_partition_CreateTable
(
ID int,
code int,
name varchar(10)
)
on PS_int_Left(ID)

在创建聚集索引的语句中,如果没有显式指定分区列和分区scheme,那么SQL Server 使用基础表上的分区列和分区scheme创建聚集索引,SQL Server自动把分区列添加到索引键中。

create clustered index cix_partition_CreateTable_code
on dbo.dt_partition_CreateTable(code)

三,对齐的唯一索引

在创建唯一索引(唯一索引和唯一约束)时,唯一索引键中必须显式包含分区列,SQL Server 强制每个分区上的索引列都是唯一的。这意味着,在创建对齐的唯一索引时,不管创建的是聚集索引还是非聚集索引,必须在唯一索引键中显式指定分区列。

--drop clustered index
drop index cix_partition_CreateTable_code
on dbo.dt_partition_CreateTable

--create unique clustered index
create unique clustered index cix_partition_CreateTable_code
on dbo.dt_partition_CreateTable(code)

--create unique nonclustered index
create unique nonclustered index ix_partition_CreateTable_code
on dbo.dt_partition_CreateTable(code)

由于唯一约束在底层使用唯一索引来保证唯一性,因此,在分区表上创建的唯一约束,必须显式包含分区列。

如果没有显式指定分区列,SQL Server会抛出错误消息:

  • Column ‘ID‘ is partitioning column of the index ‘cix_partition_CreateTable_code‘. Partition columns for a unique index must be a subset of the index key.
  • Column ‘ID‘ is partitioning column of the index ‘ix_partition_CreateTable_code‘. Partition columns for a unique index must be a subset of the index key.

四,对齐的主键约束

在SQL Server 内部,主键约束(Primary Key)自动创建唯一索引(unique index),只不过索引列必须是非空的(not null),因此,在创建主键约束时,不管创建的是聚集索引还是非聚集索引,主键必须显式包含分区列。

alter table dbo.dt_partition_CreateTable
alter column code int not null

-- create pk nonclustered index
alter table dbo.dt_partition_CreateTable
add constraint PK__partition_CreateTable_Code_nonclustered
primary key nonclustered (code)

-- create pk clustered index
alter table dbo.dt_partition_CreateTable
add constraint PK__partition_CreateTable_Code_clustered
primary key clustered (code)

如果没有显式指定分区列,SQL Server会抛出错误消息:

  • Column ‘ID‘ is partitioning column of the index ‘PK__partition_CreateTable_Code_nonclustered‘. Partition columns for a unique index must be a subset of the index key.
  • Column ‘ID‘ is partitioning column of the index ‘PK__partition_CreateTable_Code_clustered‘. Partition columns for a unique index must be a subset of the index key.

五,非对齐索引

也可以在分区表上创建非对齐索引,所谓非对齐索引,是指索引的分区scheme和基础表的分区scheme不同,其物理存储结构也不同。在默认情况下,SQL Server在分区表上创建的是对齐索引,因此,要创建非对齐索引,必须在CREATE INDEX命令中显式指定索引结构存储的数据空间,数据空间是文件组,或者跟基础表不同的分区scheme。

create nonclustered index ix_dtpartition_Code
on dbo.dt_partition_index(Code)
on file_group_name;

参考文档:

时间: 2024-11-10 11:08:08

分区表的索引的相关文章

Oracle 分区表中索引失效

当对分区表进行 一些操作时,会造成索引失效. 当有truncate/drop/exchange 操作分区  时全局索引 会失效. exchange 的临时表没有索引,或者有索引,没有用including indexes的关键字,会导致局部的索引失效,就是某个分区失效重建局部索引只能用alter index local_idx rebuild partition p1这样的方式 分区表SPLIT的时候,如果MAX区中已经有记录了,这个时候SPLIT就会导致有记录的新增分区的局部索引失效! 查寻某个

(转)Oracle分区表和索引的创建与管理

今天用到了Oracle表的分区,就顺便写几个例子把这个表的分区说一说: 一.创建分区表 1.范围分区 根据数据表字段值的范围进行分区 举个例子,根据学生的不同分数对分数表进行分区,创建一个分区表如下: create table range_fraction ( id number(8), name varchar2(20), fraction number(3), grade number(2) ) partition by range(fraction) ( partition fractio

深入学习Oracle分区表及分区索引

关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Hash(哈希)分区 •       List(列表)分区 •       以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定compress属性),只不过分区依赖列不能是lob,long之类数据类型,每个表的分区

分区表与分区索引

(一)什么是分区 所谓分区,就是将一张巨型表或巨型索引分成若干个独立的组成部分进行存储和管理,每一个相对小的,可独立管理的部分,称为分区. (二)分区的优势 提高数据可管理性.对表进行分区,数据的加载.索引的创建与重建.数据的备份与恢复等操作都可以在分区表上进行,而不必在表级别上进行,提高了数据的可管理性: 增强数据库的可用性.某个分区出现问题,只影响该分区,其它分区照常运作: 改善查询性能.将对整个表的查询转化为对某个分区表的查询,提高了查询速度: 提高数据库操作的并行性.可对分区表进行并行操

6.3、分区表、分区表索引--Oracle模式对象

分区: (1).一种分区技术,可以在创建表时应用分区技术,将数据以分区形式保存. (2).可以将巨型表或索引分割成相对较小的.可独立管理的部分. (3).表分区时必须为表中的每一条记录指定所属分区. 对表进行分区优点: 增强可用性: 维护方便: 均衡I/O: 改善查询性能. 创建分区表 分区方法:范围分区.散列分区.列表分区.组合范围散列分区和组合范围列表分区: 1.范围分区:是对数据表中某个值的范围,使用partition by range子句进行分区. 1 create table test

【转】分区表索引实践案例

今天对分区表的索引(包括本地分区索引.全局分区索引.非分区索引)进行试验测试.=================================================================================================                                                                 分区索引基础知识梳理=======================================

MS SQL Server:分区表、分区索引 详解

1. 分区表简介使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性. ?        大型表:数据量巨大的表.?        访问模式:因目的不同,需访问的不同的数据行集,每种目的的访问可以称之为一种访问模式. 分区一方面可以将数据分为更小.更易管理的部分,为提高性能起到一定的作用:另一方面,对于如果具有多个CPU的系统,分区可以是对表的操作通过并行的方式进行,这对于提升性能是非常有帮助的. 注意:只能在 SQL Server Enterprise Editi

sqlserver分区表索引

索引对于提高查询性能非常有效,因此,一般应该考虑应该考虑为分区表建立索引,为分区表建立索引与为普通表建立索引的语法一直,但是,其行为与普通索引有所差异. 默认情况下,分区表中创建的索引使用与分区表相同分区架构和分区列,这样,索引将于表对齐.将表与其索引对齐,可以使管理工作更容易进行,对于滑动窗口方案尤其如此.若要启动分区切换,表的所有索引都必须对齐. 尽管可以从已分区索引的基表中单独实现已分区索引,但通常的做法是 先设计一个已分区表,然后为该表创建索引.执行此操作时,SQL Server 将使用

分区表的查询

前一篇文章提到了在2014下分区表引起的奇葩问题,最近也在苦苦研究问题的原因.这篇文章主要讲述在分区表下,查询是怎么样的一个情况.由于2014的新功能“参数估计”下是如何运转的目前无从得知,所以只能分享下2008下的原理了... 在 SQL Server 2008 中,已分区表的内部表示形式已发生变化,即已分区表将作为一个多列索引呈现给查询处理器,其中 PartitionID是第一列.PartitionID 是一个隐藏的计算列,用于在内部表示包含特定行的分区的 ID.例如,假设一个定义为 T(a