C# Microsoft SQL Server 2008 R2中的水平分区?

C# Microsoft SQL Server 2008 R2中的水平分区?,c#,.net,tsql,sql-server-2008,smo,C#,.net,Tsql,Sql Server 2008,Smo,我想知道是否可以使用C#.NET类在表上自动设置水平分区 我相信这可以通过使用服务器管理对象(SMO)或本机T-SQL来实现 水平分区将按日期进行,每个文件一个月 更新 这项计划非常有效。我的.NET应用程序工作正常: 商品硬件上90000行/秒的插入速度 3.3亿行,52GB数据。即使数据库如此大,插入也不会减慢速度 每行相当复杂,有30列 日期列上的聚集索引(非唯一),它有两个好处: 选择要快得多(对于特定日期,选择时间为2秒,而不是120秒) 该表总是按日期顺序排序,这非常完美,因为我

我想知道是否可以使用C#.NET类在表上自动设置水平分区

我相信这可以通过使用服务器管理对象(SMO)或本机T-SQL来实现

水平分区将按日期进行,每个文件一个月

更新

这项计划非常有效。我的.NET应用程序工作正常:

  • 商品硬件上90000行/秒的插入速度
  • 3.3亿行,52GB数据。即使数据库如此大,插入也不会减慢速度
  • 每行相当复杂,有30列
  • 日期列上的聚集索引(非唯一),它有两个好处:
    • 选择要快得多(对于特定日期,选择时间为2秒,而不是120秒)
    • 该表总是按日期顺序排序,这非常完美,因为我们正在处理时间序列数据,并且希望使用游标或批量下载检索数据

如果您想让我发布我使用的代码,请通过在此线程上发布问题与我联系。

我无法从您对问题的措辞判断您是否可以在代码中使用t-Sql,只是在寻找一个示例,或者您试图避免使用t-Sql。如果是前者,则使用以下方法:

第一步是创建一个。这是分区的指南,告诉它每个分区的边界是什么。这个将日期时间分解为单个月份的例子来自在线图书

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();
最后,在文件组上:


最后,如果您试图划分的表已经存在,那么您必须构建与之类似的函数、方案和另一个表,然后将数据移动到新表。

我尝试了此操作,但结果是出现错误:“无效的对象名'test1fg'。是否必须添加文件组?是的,文件组必须已经存在。此外,您不必将它们命名为test1fg等。。检查三个步骤中的每一个步骤的链接,因为在线图书可以很好地将其全部讲出来。谢谢,我会看看是否可以让它工作。顺便说一句,很好的说明。这是像我这样的数据库专家喜欢听的。。。很高兴它能像您希望的那样工作。如果您需要为20111201之后的新数据增加分区数,并保留旧分区,那么如何更新分区函数?我需要实现类似的功能,但在我的例子中,在创建分区之后,新数据将不断添加到表中。
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();