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秒)
    • 该表总是按日期顺序排序,这是非常完美的,因为我们正在处理时间序列数据,并且我们希望使用游标或批量下载来检索数据

如果你想让我发布我使用过的代码,请在这个帖子上发布问题与我联系。

Microsoft SQL Server 2008 R2中的水平分区

我无法从你的问题措辞中判断你是否可以在代码中使用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();

最后,如果您试图分区的表已经存在,那么您将不得不构建函数、方案和另一个看起来与之相似的表,然后将数据移到新表中。