2011-06-22 72 views
0

我想知道是否可以使用C#.NET類自動設置表上的水平分區?Microsoft SQL Server 2008 R2中的水平分區?

我確定這可以使用服務器管理對象(SMO)或本地T-SQL來實現。

水平分區將按日期進行,每個文件一個月。

更新

該方案工作得非常好。我的.NET應用程序工作正常:

  • 90,000行/秒在商品硬件上的插入速度。
  • 330萬行,52GB的數據。即使數據庫很大,插入也不會減慢。
  • 每行非常複雜,有30列。
  • 簇索引(非唯一)上的日期欄,它有兩個好處:
    • 選擇快得多(2秒與120秒的特定日期)。
    • 該表總是按照日期順序排序,這是完美的,因爲我們正在處理時間序列數據,我們希望使用遊標或批量下載來檢索數據。

如果你要我發表我使用的代碼,通過張貼在此線程問題與我聯繫。

回答

2

如果您在代碼中正確使用T-Sql,並且只是尋找示例,或者您正在嘗試避免T-Sql,那麼我無法從您提出問題的方式來判斷。如果是前者較之使用System.Data.SqlClient是這樣的:

SqlConnection cn = new SqlConnection("a connection string to your server"); 
SqlCommand cm = new SqlCommand("", cn); 

cn.Open(); 

的第一步是創建一個partition function。這是分區的指南,告訴它每個分區的邊界是什麼。將聯機叢書分成單個月份的這個例子是正確的。

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(); 

下一步是create a scheme。這將您創建的功能映射到您的文件組,每個分區(即月)都有一個映射。文件組必須已經存在,所以事先創建它們。

cm.CommandText = "CREATE TABLE PartitionTable (col1 int, col2 datetime) 
       ON myRangePS1 (col2)"; 
cm.ExecuteNonQuery(); 

cn.Close(); 

最後,如果你想已分區表存在,那麼你將要建立的功能:

cm.CommandText = "CREATE PARTITION SCHEME myRangePS1 
       AS PARTITION myRangePF1 TO 
       (test1fg, test2fg, test3fg, test4fg, test5fg, test6fg, 
       test7fg, test8fg, test9fg, test10fg, test11fg, test12fg)"; 
cm.ExecuteNonQuery(); 
文件組(S)

然後終於creating a table ,scheme和另一個看起來就像它的表,然後將數據移動到新表中。

+0

哇 - 謝謝你的好回答!我正在嘗試它。 – Contango

+0

我試過這個,但它導致了一個錯誤:「無效的對象名'test1fg'。」。我必須添加一個文件組嗎? – Contango

+1

是的,文件組必須已經存在。另外,你不必將它們命名爲test1fg等。檢查三個步驟中的每一步的鏈接,因爲在線書籍很好地說出了所有內容。 – RThomas