`
totoxian
  • 浏览: 1080150 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

SQL SERVER 表及索引分区

阅读更多

表分区应该是处理海量数据一个最好的方法。名义上一个表,但分散存储于不同的物理文件上,这跟小表并没有多大区别。


不过,分区表的主键如何处理却不得不谨慎。


分区表的依据列最好就是主键。比如用户表,UserId是自动增长的标识列,主键,又以之作为划分分区的依据,每50万一个分区。在这里,主键与分区依据列完美结合,护发去头皮。
但有时候主键不一定是分区依据列。比如说,用户设置表。用户表与用户设置表是一对多的关系,一个用户有好多设置,即每个用户会有若干条设置记录。这种情况,UserId应该是分区依据列,但显然不能是主键,因为不唯一。


通常情况下,主键默认是聚集索引。而聚集索引是数据的一部分,就是说,聚集索引和表数据肯定是同一个文件组。如果主键不是分区依据列,又是聚集索引,这个表还怎么分区?我就试过,辛辛苦苦将一个巨大表分好区,此时尚未建主键,后来将主键建到一个独立的文件组,发现表数据也全部挪到该独立文件组,之前的分区努力化为泡影。


我的感觉是,这种情况下,主键不能定为聚集索引,应该做成非聚集索引。


除了依据列,其他索引不要建立在这个分区上(即所谓对齐),全部指定独立文件组,甚至自己分区。否则,系统会偷偷给你搭售依据列。

---------------------------------------------------------------------------------------
(以下内容抄自SQL SERVER 2008 联机帮助)
对聚集索引进行分区
对聚集索引进行分区时,聚集键必须包含分区依据列。对非唯一的聚集索引进行分区时,如果未在聚集键中明确指定分区依据列,默认情况下 SQL Server 将在聚集索引键列表中添加分区依据列。如果聚集索引是唯一的,则必须明确指定聚集索引键包含分区依据列。


对非聚集索引进行分区
对唯一的非聚集索引进行分区时,索引键必须包含分区依据列。对非唯一的非聚集索引进行分区时,默认情况下 SQL Server 将分区依据列添加为索引的非键(包含性)列,以确保索引与基表对齐。如果索引中已经存在分区依据列,SQL Server 将不会向索引中添加分区依据列。

---------------------------------------------------------------------------------------


CREATE TABLE [dbo].[User_News_Log](
[LogId] [int] IDENTITY(1,1) NOT NULL,
[WebUserId] [int] NOT NULL,
[Code] [varchar](20) NOT NULL,
[Content] [varchar](700) NOT NULL,
[CreateDate] [smalldatetime] NOT NULL,
--非聚集索引主键
CONSTRAINT [PK_user_news] PRIMARY KEY NonCLUSTERED
(
[LogId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [UserNewsIndex]
)
--分区表
ON UserNewsSCM(CreateDate)
--页级压缩
WITH
(
DATA_COMPRESSION = PAGE ON PARTITIONS (1 TO 5)
);
GO

也由此可知,想将现有未分区表转为分区表,有个方法就是将聚集索引建到分区上。运行完毕,你会欣喜地发现,表已经分区了。

附:一个现有巨大表分区、压缩、主键再分区的例子

use [Compare]
go

-------------------------------------------------------------------
-- 数据
-------------------------------------------------------------------

--文件组
ALTER DATABASE [Compare] ADD FILEGROUP [Compare0]
GO
ALTER DATABASE [Compare] ADD FILEGROUP [Compare1]
GO
ALTER DATABASE [Compare] ADD FILEGROUP [Compare2]
GO

-- 文件
ALTER DATABASE [Compare]
ADD FILE
(NAME = N'Compare0',FILENAME = N'C:\Compare\Compare0.ndf',SIZE = 3MB,FILEGROWTH = 1MB)
TO FILEGROUP [Compare0]
GO

ALTER DATABASE [Compare]
ADD FILE
(NAME = N'Compare1',FILENAME = N'C:\Compare\Compare1.ndf',SIZE = 3MB,FILEGROWTH = 1MB)
TO FILEGROUP [Compare1]
GO

ALTER DATABASE [Compare]
ADD FILE
(NAME = N'Compare2',FILENAME = N'C:\Compare\Compare2.ndf',SIZE = 3MB,FILEGROWTH = 1MB)
TO FILEGROUP [Compare2]
GO

-- 分区函数
CREATE PARTITION FUNCTION ComparePFN(INT) AS RANGE LEFT FOR VALUES (50000,100000);
GO

--分区方案
CREATE PARTITION SCHEME CompareSCM
AS PARTITION ComparePFN
TO (
[Compare0]
,[Compare1]
,[Compare2]
);
GO

--将聚集索引建到分区方案,数据自动跟着转移
CREATE CLUSTERED INDEX [cix_cp_wk] ON [dbo].[CatchMirror]
(
[WebSiteKeyWordId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ON CompareSCM(WebSiteKeyWordId)
GO

-----------------------------------------------------------------
-- 行压缩
-----------------------------------------------------------------

ALTER TABLE [CatchMirror]
REBUILD PARTITION = ALL
WITH
(
DATA_COMPRESSION = ROW ON PARTITIONS(1 TO 3)
);
GO

-------------------------------------------------------------------
-- 分区索引(主键)
-------------------------------------------------------------------

ALTER DATABASE [Compare] ADD FILEGROUP [CompareIndex0]
GO
ALTER DATABASE [Compare] ADD FILEGROUP [CompareIndex1]
GO
ALTER DATABASE [Compare] ADD FILEGROUP [CompareIndex2]
GO

ALTER DATABASE [Compare]
ADD FILE
(NAME = N'CompareIndex0',FILENAME = N'C:\Compare\CompareIndex0.ndf',SIZE = 3MB,FILEGROWTH = 1MB)
TO FILEGROUP [CompareIndex0]
GO

ALTER DATABASE [Compare]
ADD FILE
(NAME = N'CompareIndex1',FILENAME = N'C:\Compare\CompareIndex1.ndf',SIZE = 3MB,FILEGROWTH = 1MB)
TO FILEGROUP [CompareIndex1]
GO

ALTER DATABASE [Compare]
ADD FILE
(NAME = N'CompareIndex2',FILENAME = N'C:\Compare\CompareIndex2.ndf',SIZE = 3MB,FILEGROWTH = 1MB)
TO FILEGROUP [CompareIndex2]
GO

CREATE PARTITION FUNCTION CompareIndexPFN(INT) AS RANGE LEFT FOR VALUES (200000000,400000000);
GO

CREATE PARTITION SCHEME CompareIndexSCM
AS PARTITION CompareIndexPFN
TO (
[CompareIndex0]
,[CompareIndex1]
,[CompareIndex2]
);
GO

--主键,非聚集,分区,并启用行压缩
ALTER TABLE [dbo].[CatchMirror] ADD CONSTRAINT [PK_CatchMirror] PRIMARY KEY NONCLUSTERED
(
[CatchMirrorId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,DATA_COMPRESSION = ROW ) ON CompareIndexSCM(CatchMirrorId)
GO

后记:

应用分区对性能的改善是显著的。未分区和压缩前,服务器硬盘队列达到30以上;分区和压缩后,硬盘队列10以下,足足改善了3倍。


补充一句:如果表已经应用了页级压缩,聚集索引就不要再应用行压缩,否则整个表又变成行压缩。

2、拆分分区:

拆分分区,除非分区方案里 有多余的文件组,否则要先添加文件组,然后修改分区方案,再修改分区函数。

ALTER PARTITION SCHEME UserSCM NEXT USED [user5];

ALTER PARTITION FUNCTION UserPFN() SPLIT RANGE('5')

3、分区依据列为字符型

-- 分区函数
CREATE PARTITION FUNCTION UserPFN(VARCHAR(50)) AS RANGE LEFT FOR VALUES (
'1','4','7','a','c','e','h','k','o','r','u','x','z');
GO

4、分区依据列为日期型

-- 分区函数
CREATE PARTITION FUNCTION UserPFN(SMALLDATETIME) AS RANGE LEFT FOR VALUES ('2008-01-01','2009-01-01','2010-01-01','2011-01-01','2012-01-01');
GO

分享到:
评论
1 楼 gaoyun_66 2012-03-21  
扯淡,都错的.不要误导别人.主键建在分区字段上,不会报错么?(主键是唯一的,分区列不唯一,如果是唯一还怎么分区).所以一定报重复值 错误.你在分区表CatchMirror(CatchMirrorId)上根本建不了主键.

相关推荐

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

    ### MS SQL Server 分区表、分区索引详解 #### 一、分区表简介 使用分区表的主要目的是为了改善大型表及具有多种访问模式的表的可伸缩性和可管理性。这里的“大型表”指的是数据量巨大的表,“访问模式”是指因不同...

    SQL Server 2005 中的分区表和索引

    ### SQL Server 2005 中的分区表和索引:深入解析 #### 分区的由来与演变 分区的概念在SQL Server的历史中占据着重要地位。从早期的SQL Server版本开始,数据库管理员就意识到,面对不断增长的数据量,传统的单一...

    查看sqlserver表分区数据分布

    ### 查看SQL Server表分区数据分布 在SQL Server中,为了提高大型数据库的管理效率与查询性能,常常会采用表分区技术。通过合理地将一个表的数据分散到多个物理文件或文件组上,可以显著提升数据处理的速度。本文将...

    sqlserver2005 创建分区表 分区索引 注意事宜 分区索引

    【SQL Server 2005 创建分区表与分区索引详解】 分区表和分区索引是SQL Server 2005为企业级数据管理和性能优化提供的重要特性,尤其适用于处理大量数据的大型表。分区能够将数据划分为独立的、易于管理的块,这有...

    详解SQL Server表和索引存储结构

    ### 详解SQL Server表和索引存储结构 #### 一、引言 SQL Server作为一款广泛使用的数据库管理系统,其内部的存储结构对于优化查询性能、提高数据管理效率至关重要。本文将详细探讨SQL Server中表和索引的存储原理...

    SQL Server 2005 中的分区表和索引.doc

    SQL Server 2005 中的分区表和索引 SQL Server 2005 中的分区表和索引是改善大型表和具有各种访问模式的表的可伸缩性和可管理性的重要工具。分区可以将大型表分为更小、更容易管理的部分,提供一定的帮助。创建分区...

    sqlserver 2008创建表分区

    在SQL Server 2008中,创建表分区是一种优化大型数据库性能的技术。它通过将一个大表的数据分成多个逻辑部分,或者称为“分区”,来提高查询效率和管理大规模数据的便捷性。以下是对这个主题的详细解释: 一、表...

    SQLServer2005中的表分区功能和索引

    在SQL Server 2005中,表分区和索引是两种重要的数据库管理技术,它们对于提高查询性能、优化数据存储以及简化大规模数据管理起着关键作用。下面将详细阐述这两种概念及其应用。 1. 表分区(Table Partitioning) ...

    sqlserver2005表分区

    【SQL Server 2005 表分区】 分区表是SQL Server 2005提供的一种高级数据管理技术,主要用于优化大规模数据表的性能。当你的数据库中存在数据量巨大且查询频繁的表时,分区表能够显著提升查询效率,降低维护成本。...

    SQLServer创建表分区脚本

    在SQL Server中,表分区是一种优化数据库性能的技术,它允许将大表的数据分布在多个物理存储上,以便于管理和查询。这种技术尤其适用于处理海量数据,因为它可以提高数据的读写速度,减少I/O操作,并简化维护任务。...

    SQL Server 2000 分区方案

    它允许将一个大表或索引分成多个逻辑部分,每个部分称为一个分区,存储在不同的物理位置。这样可以提高查询效率,因为查询通常只需要访问特定的分区,而不是整个表。 分区的基本概念包括以下几点: 1. **分区函数*...

    SQL SERVER 2008分区表快速创建.doc

    SQL Server 2008 分区表快速创建 SQL Server 2008 分区表快速创建是指在 SQL Server 2008 环境中快速创建分区表的过程。分区表是指将大型表分割成多个小表,以提高查询性能和数据管理效率。下面是快速创建分区表的...

    SQLServer2005中的分区表和索引

    可以通过查询系统视图`sys.partitions`来获取有关表或索引分区的信息。 **示例查询**: ```sql SELECT * FROM sys.partitions WHERE object_id = OBJECT_ID('Sales.SalesOrderHeader'); ``` 这将返回关于`Sales....

    sql server 表分区资料

    在SQL Server中,表分区是一种优化大数据管理的技术,它允许将大表的数据分布在多个物理存储上,从而提高查询性能和管理效率。以下是对SQL Server表分区的详细解释: 1. **分区概念**: - 表分区是将一个大表逻辑...

    SQLServer2005分区表

    - **早期版本(SQL Server 6.5及之前)**:分区功能需要通过手动创建多个表,并使用视图或存储过程来实现数据的统一管理。这种方式不仅繁琐,而且难以维护。 - **SQL Server 7.0**:引入了分区视图的概念,虽然仍需...

    SQL Server2005中的表分区功能和索引

    在SQL Server 2005中,可以为分区表创建分区化的索引,这意味着索引也会根据相同的分区方案进行分割。这进一步提升了查询性能,因为索引和数据都在同一分区中,减少了I/O操作。 6. **维护和管理** 分区操作包括...

    MS SQL SERVER 分区表

    【MS SQL SERVER 分区表】 分区表是MS SQL SERVER中的一种高级存储技术,设计用于管理和优化大规模数据存储。它的主要目标是提升大型表(数据量巨大,如2000万条记录或2GB容量)的可伸缩性和可管理性,以及针对不同...

    MSSQLServer:分区表、分区索引详解[归类].pdf

    在SQL Server中,分区表和分区索引是针对大型数据表的管理和性能优化策略。当面对数据量庞大的表时,使用分区能够提高数据处理效率,增强系统的可管理性。本文将详细讲解如何在MSSQL Server中实现分区表和分区索引的...

Global site tag (gtag.js) - Google Analytics