SQLSERVER如何实现表分区?

0
已邀请:
2

梁勇 - 天道酬勤、上善若水。爱好商业智能 2013-07-16 回答

首先说下分区步骤:
1、创建文件组
2、创建分区函数
3、创建分区方案
4、创建分区表,并引用对应的分区方案

可以参考以下代码:
/*
功能说明:分区函数分区功能实现 XTRZB表分区
修改说明:Created BY LY 2013-1-10
*/

/*
功能说明:创建文件组
修改说明:Created BY LY 2013-1-10
*/
ALTER DATABASE QD ADD FILEGROUP XTRZB_0

ALTER DATABASE QD ADD FILE ( NAME = 'F_XTRZB_0', FILENAME = 'D:\DB\DBTest\F_XTRZB_0.MDF', SIZE =5120KB, FILEGROWTH = 10% ) TO FILEGROUP XTRZB_0;

ALTER DATABASE QD ADD FILEGROUP XTRZB_1

ALTER DATABASE QD ADD FILE ( NAME = 'F_XTRZB_1', FILENAME = 'D:\DB\DBTest\F_XTRZB_1.MDF', SIZE =5120KB, FILEGROWTH = 10% ) TO FILEGROUP XTRZB_1;

ALTER DATABASE QD ADD FILEGROUP XTRZB_2

ALTER DATABASE QD ADD FILE ( NAME = 'F_XTRZB_2', FILENAME = 'D:\DB\DBTest\F_XTRZB_2.MDF', SIZE =5120KB, FILEGROWTH = 10% ) TO FILEGROUP XTRZB_2;

ALTER DATABASE QD ADD FILEGROUP XTRZB_3

ALTER DATABASE QD ADD FILE ( NAME = 'F_XTRZB_3', FILENAME = 'D:\DB\DBTest\F_XTRZB_3.MDF', SIZE =5120KB, FILEGROWTH = 10% ) TO FILEGROUP XTRZB_3;


/*
功能说明:创建分区函数
修改说明:Created BY LY 2013-1-10
*/
IF EXISTS (SELECT *
FROM sys.partition_functions
WHERE name = N'PF_XTRZB_FirstLetter')
DROP PARTITION FUNCTION PF_XTRZB_FirstLetter

CREATE PARTITION FUNCTION PF_XTRZB_FirstLetter(DATETIME) AS RANGE RIGHT FOR VALUES ('2011/01/01', '2012/01/01', '2013/01/01')

/*
功能说明:创建分区方案
修改说明:Created BY LY 2013-1-10
*/
IF EXISTS (SELECT *
FROM sys.partition_schemes
WHERE name = N'PS_XTRZB_FirstLetter')
DROP PARTITION SCHEME PS_XTRZB_FirstLetter

CREATE PARTITION SCHEME PS_XTRZB_FirstLetter AS PARTITION PF_XTRZB_FirstLetter TO ( XTRZB_0, XTRZB_1, XTRZB_2,XTRZB_3)


/*
功能说明:分区函数引用这个分区方案
修改说明:Created BY LY 2013-1-10
*/
--ALTER TABLE XTRZB
-- DROP CONSTRAINT PK_XTRZB
CREATE CLUSTERED INDEX CLUSTERED_DT_INDEX
ON XTRZB(DT)
ON PS_XTRZB_FirstLetter(DT)

0

TravyLee - 尼玛!这哪是下雨,分明就是有人在泼水! 2013-07-23 回答

扩展一下,关于分区表和单表的一些见解。内容是转载的,不赞同的可以说说意见:

个人觉得, 减少单表的数据量会比较重要, 从列的方面讲,尽量不要把数据都设计放在一个表中,可以按照应用需求,把同时使用的列放在一个表中,比如一条记录可能有 a, b, c, d, e 几个列, 如果 a,b,c 和 d, e 分别用在不同的场景, 那么通常是建议设计两张表
从行的方面讲,经常使用的数据和不经常使用的数据也应该放在不同的表中(虽然分区也可以达到这个效果),但物理拆表更占优势一些, 减少了SQL Server查询优化器的判断, 提升索引的维护开销(比如可以针对不同时期的数据提供适合它们的查询条件,这个分区是做不到的),减少数据量的同时,也可以使统计信息更精确,提供查询优化器对查询方案评估的准确性(前面 xiangcong 的大表处理有一定的适用性,但是,如果查询中会常用到循环和临时表,这个似乎有数据拆分不合理之嫌,通常拆数据不是硬性按时间,如果因为这个拆分,导致一个简单的查询,变成了多个步骤,这个可能产生一定的性能影响,应该考虑调整数据拆分策略)
另外,SQL Server数据库是事务性的,对于处理数据监测这类事务性要求不太高,容忍一定数据丢失的,可能SQL Server不是最佳选择,确定是放在SQL Server中的话,也应该考虑放在单独的数据库中,并且把数据库的恢复模型设置为Simple
最后,OLAP和OLTP这两个一定发分离,通常我们程序涉及的是OLTP,如果你要涉及大量的数据分析统计,还是使用专门针对这种场景的软件好了(比如可以考虑 SQL Server Analysis Services)
0

mints 2013-07-24 回答

SQLServer中创建分区和Oracle差别还是挺大阿,学习了

要回复问题请先登录注册