Microsoft SQL Server 2008 R2中的水平分区
本文关键字:水平 分区 R2 SQL Server 2008 Microsoft | 更新日期: 2023-09-27 18:00:02
我想知道是否可以使用C#.NET类在表上自动设置水平分区?
我确信这可以使用服务器管理对象(SMO)或本机T-SQL来实现。
水平分区将按日期进行,每个文件一个月。
更新
这个方案效果非常好。我的.NET应用程序运行良好:
- 商品硬件上90000行/秒的插入速度
- 3.3亿行,52GB的数据。即使数据库这么大,插入速度也不会减慢
- 每一行都相当复杂,有30列
- 日期列上的聚集索引(非唯一),它有两个好处:
- 选择要快得多(对于特定日期,2秒比120秒)
- 该表总是按日期顺序排序,这是非常完美的,因为我们正在处理时间序列数据,并且我们希望使用游标或批量下载来检索数据
如果你想让我发布我使用过的代码,请在这个帖子上发布问题与我联系。
我无法从你的问题措辞中判断你是否可以在代码中使用t-Sql,只是在寻找一个例子,或者你试图避免使用t-Sql。如果是前者,那么使用System.Data.SqlClient:会是这样的
SqlConnection cn = new SqlConnection("a connection string to your server");
SqlCommand cm = new SqlCommand("", cn);
cn.Open();
第一步是创建一个分区函数。这是分区的指南,告诉它每个分区的边界是什么。这个将日期时间分解为几个月的例子来自Books Online。
cm.CommandText = "CREATE PARTITION FUNCTION [myDateRangePF1] (datetime)
AS RANGE RIGHT FOR VALUES ('20110201', '20110301', '20110401',
'20110501', '20110601', '20110701', '20110801',
'20110901', '20111001', '20111101', '20111201')";
cm.ExecuteNonQuery();
下一步是创建一个方案。这会将您创建的函数映射到文件组,每个分区(即月)一个。文件组必须已经存在,因此请提前创建它们。
cm.CommandText = "CREATE PARTITION SCHEME myRangePS1
AS PARTITION myRangePF1 TO
(test1fg, test2fg, test3fg, test4fg, test5fg, test6fg,
test7fg, test8fg, test9fg, test10fg, test11fg, test12fg)";
cm.ExecuteNonQuery();
然后最后在文件组上创建一个表:
cm.CommandText = "CREATE TABLE PartitionTable (col1 int, col2 datetime)
ON myRangePS1 (col2)";
cm.ExecuteNonQuery();
cn.Close();
最后,如果您试图分区的表已经存在,那么您将不得不构建函数、方案和另一个看起来与之相似的表,然后将数据移到新表中。