这两天一直在研究2005 中如何对表进行分区,但是参考了多数资料都是说新建表后再将原表中数据插入到新表中,这样有些不方便.
? ? 最后找到了在已有表上做分区表的方法.见代码.
??? 我们有个表现在已经到了1千万的数据,之前仅仅是优化索引和索引试图来在真实的环境中查看到底sql2005单表能负载多大的量。 ???? 最后得出结论,在我们公司现有的硬件条件下,sql2005中,单表的量最多不能超过250w数据。(这个数据会根据硬件的不同而会有所不同.)
---select * from t200705
--1.先根据表数据的量大小,来拆分每一个分区,保证每一个分区表的记录尽量在250w条记录左右.
--分区函数
?
CREATE PARTITION FUNCTION MonthDateRange(datetime) ?AS RANGE LEFT FOR VALUES ( '20070131 23:59:59.997', '20070531 23:59:59.997', '20071231 23:59:59.997' )
--2然后我们需要添加相应的文件组 .我使用的是主文件组. ALTER DATABASE T1 ADD FILEGROUP [PRIMARY] ALTER DATABASE T1 ADD FILEGROUP [PRIMARY] ALTER DATABASE T1 ADD FILEGROUP [PRIMARY]
--3.我们需要在服务器上建立出单独的文件(涉及到的朋友可能知道,我们如果把文件分布在不同的磁盘上,可以最大限度的提高磁头的读写能力;另:这里微软建议数据库服务器最好--作Raid0 + Raid1).我由于是做测试,所以就放在了一个硬盘上了.
?
ALTER DATABASE T1 ADD FILE (NAME = N'View200701',FILENAME = N'D:"View200701.ndf',SIZE = 5MB,MAXSIZE = 100MB,FILEGROWTH = 5MB) TO FILEGROUP [PRIMARY]
ALTER DATABASE T1 ADD FILE (NAME = N'View200702',FILENAME = N'D:"View200702.ndf',FILEGROWTH = 5MB) TO FILEGROUP [PRIMARY]
ALTER DATABASE T1 ADD FILE (NAME = N'View200703',FILENAME = N'D:"View200703.ndf',FILEGROWTH = 5MB) TO FILEGROUP [PRIMARY]
--4.创建关联
--分区架构
?
CREATE PARTITION SCHEME MonthDateRangeScheme AS PARTITION MonthDateRange ALL TO ([PRIMARY])
---5.创建表和索引(我这里只列出如何创建表) --- /*5. CREATE TABLE 表 { 列 } ON MonthDateRangeScheme (日期列) GO */ --6. --对已经存在的表进行分区设置
--切换到分区表
ALTER TABLE t200705
ADD
PRIMARY KEY NONCLUSTERED(rownumber,starttime)
ON MonthDateRangeScheme(starttime)
GO
/*
-- 切换到分区表
ALTER TABLE dbo.t200705 DROP CONSTRAINT rownumber,starttime WITH(
MOVE TO PS_MonthDateRangeScheme(starttime)
)
*/
---如果大家希望查询此表中的相关数据,可以使用如下语句
SELECT *,$PARTITION.MonthDateRange(starttime) AS T2007 FROM t200705
where starttime>'20070603'
---7删除
-- 删除测试 --DROP TABLE dbo.t200705 --DROP PARTITION SCHEME MonthDateRangeScheme ---DROP PARTITION FUNCTION MonthDateRange
?
然后将创建表部分替换成 alter table myTb drop constraint PK_myTb--删除现有表的主键(对有全文索引的只能再管理器中去除主键) ALTER TABLE [dbo].[fabu] WITH NOCHECK ADD CONSTRAINT [PK_fabu] PRIMARY KEY CLUSTERED ( [id]--注意ID这里是你原来的那些主键组成的列 ) ON [ps_Product_Scheme_mTb]([id])--将主键创建到ps_Product_Scheme_mTb分区函数上 用下面这条语句看看分区是不是已经改变了? SELECT *,$PARTITION.pf_Product_fabu(ID) AS PF FROM myTb
这样的好处在于不用新建表.这样就像本人那种表的ID在多个表中作为参考的从新建表其他信息将无用..弊端-这样对有全文索引的表必须从新建立全文索引..
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|