当前位置:高校自动化网 >> sql >> 浏览文章

利用SQL分区表处理数据

文章来源:本站原创 作者:佚名


该文章讲述了利用SQL分区表处理数据.

SQL分区表应该是处理海量数据一个最好的方法。

分区表的依据列最好就是主键。比如用户表,UserId是自动增长的标识列,主键,又以之作为划分分区的依据,每50万一个分区。

在这里,主键与分区依据列完美结合,护发去头皮。但有时候主键不一定是分区依据列。比如说,用户设置表。用户表与用户设置表是一对多的关系,一个用户有好多设置,即每个用户会有若干条设置记录。

这种情况,UserId应该是分区依据列,但显然不能是主键,因为不唯一。

通常情况下,主键默认是聚集索引。而聚集索引是数据的一部分,就是说,聚集索引和表数据肯定是同一个文件组。

如果主键不是分区依据列,又是聚集索引,这个表还怎么分区?我就试过,辛辛苦苦将一个巨大表分好区,此时尚未建主键,后来将主键建到一个独立的文件组,发现表数据也全部挪到该独立文件组,之前的分区努力化为泡影。我的感觉是,这种情况下,主键不能定为聚集索引,应该做成非聚集索引。除了依据列,全部索引不要建立在这个分区上(即所谓对齐),全部指定独立文件组。否则,系统会偷偷给你搭售依据列。

对聚集索引进行分区对聚集索引进行分区时,聚集键必须包含分区依据列。对非唯一的聚集索引进行分区时,如果未在聚集键中明确指定分区依据列,默认情况下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

 

相关文章:
上一篇:删除SQL2010日志的办法
下一篇:如何修改sql表的字段名
最近更新