Горизонтальное разбиение в Microsoft SQL Server 2008 R2? - PullRequest
0 голосов
/ 22 июня 2011

Мне интересно, возможно ли автоматически настроить горизонтальное разбиение таблицы, используя класс C # .NET?

Я уверен, что этого можно достичь с помощью объектов управления сервером (SMO) или собственного T-SQL.

Горизонтальное разбиение будет по дате, с одним месяцем на файл.

Обновление

Эта схема работает на удивление хорошо. Мое приложение .NET работает отлично:

  • 90000 строк / сек скорость вставки на стандартном оборудовании.
  • 330 миллионов строк, 52 ГБ данных. Никакого замедления для вставок, даже если база данных настолько велика.
  • Каждая строка довольно сложная, с 30 столбцами.
  • Кластерный индекс (неуникальный) для столбца даты, который имеет два преимущества:
    • Выбор выполняется намного быстрее (2 секунды против 120 секунд для конкретной даты).
    • Таблица всегда сортируется в порядке дат, что идеально, поскольку мы имеем дело с данными временных рядов и хотим получать данные с помощью курсоров или массовой загрузки.

Если вы хотите, чтобы я опубликовал код, который я использовал, свяжитесь со мной, задав вопрос в этой теме.

1 Ответ

2 голосов
/ 22 июня 2011

Я не могу судить по тому, как вы сформулировали свой вопрос, нормально ли вы используете 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();

И, наконец,если таблица, которую вы пытаетесь разделить, уже существует, то вам нужно будет построить функцию, схему и другую таблицу, которая выглядит точно так же, а затем переместить ваши данные в новую таблицу.

...