SQL-сервер 2008, Настраивающийся с большими транзакциями (700k + строки/транзакция)

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

База данных в основном должна быть обновлена один раз в месяц. Основная таблица должна быть очищена и затем снова наполнена прочь файла CSV. Проблема состоит в том, что SQL-сервер генерирует журнал для него, который является МЕГА большой. Я был успешен в заполнении его однажды, но хотел протестировать целый процесс путем чистки его и затем пополнения его.

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

Я ограничил, это - рост на уровне 256 МБ, увеличивающих на 16 МБ, который является, почему это перестало работать, но в действительности мне не нужен он для входа чего-либо вообще. Существует ли путь только к полностью обходу, входящему в систему какой-либо запрос, выполняемый против базы данных?

Спасибо за любые ответы заранее!

Править: На предложения @mattmc3 я реализовал SqlBulkCopy для целой процедуры. Это работает УДИВИТЕЛЬНОЕ, кроме, мой цикл так или иначе отказывает на самом последнем остающемся блоке, который должен быть вставлен. Я не слишком уверен, где я иду не так, как надо, heck я даже не знаю, является ли это надлежащим циклом, таким образом, я ценил бы некоторую справку на нем.

Я действительно знаю, что проблема с самым последним GetDataTable или SetSqlBulkCopy звонит. Я пытаюсь вставить 788 189 строк, 788000 входят, и оставление 189 отказывают...

string[] Rows;

using (StreamReader Reader = new StreamReader("C:/?.csv")) {
    Rows = Reader.ReadToEnd().TrimEnd().Split(new char[1] {
        '\n'
     }, StringSplitOptions.RemoveEmptyEntries);
};

int RowsInserted = 0;

using (SqlConnection Connection = new SqlConnection("")) {
    Connection.Open();

    DataTable Table = null;

    while ((RowsInserted < Rows.Length) && ((Rows.Length - RowsInserted) >= 1000)) {
        Table = GetDataTable(Rows.Skip(RowsInserted).Take(1000).ToArray());

        SetSqlBulkCopy(Table, Connection);

        RowsInserted += 1000;
    };

    Table = GetDataTable(Rows.Skip(RowsInserted).ToArray());

    SetSqlBulkCopy(Table, Connection);

    Connection.Close();
};

static DataTable GetDataTable(
    string[] Rows) {
    using (DataTable Table = new DataTable()) {
        Table.Columns.Add(new DataColumn("A"));
        Table.Columns.Add(new DataColumn("B"));
        Table.Columns.Add(new DataColumn("C"));
        Table.Columns.Add(new DataColumn("D"));

        for (short a = 0, b = (short)Rows.Length; a < b; a++) {
            string[] Columns = Rows[a].Split(new char[1] {
                ','
            }, StringSplitOptions.RemoveEmptyEntries);

            DataRow Row = Table.NewRow();

            Row["A"] = Columns[0];
            Row["B"] = Columns[1];
            Row["C"] = Columns[2];
            Row["D"] = Columns[3];

            Table.Rows.Add(Row);
        };

        return (Table);
    };
}

static void SetSqlBulkCopy(
    DataTable Table,
    SqlConnection Connection) {
    using (SqlBulkCopy SqlBulkCopy = new SqlBulkCopy(Connection)) {
        SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("A", "A"));
        SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("B", "B"));
        SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("C", "C"));
        SqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("D", "D"));

        SqlBulkCopy.BatchSize = Table.Rows.Count;
        SqlBulkCopy.DestinationTableName = "E";
        SqlBulkCopy.WriteToServer(Table);
    };
}

КОД РЕДАКТИРОВАНИЯ/ФИНАЛА: Таким образом, приложение теперь закончено и УДИВИТЕЛЬНЫЕ работы, и довольно быстрые! @mattmc3, спасибо за всю справку! Вот заключительный код для любого, кто может найти это полезным:

List<string> Rows = new List<string>();

using (StreamReader Reader = new StreamReader(@"?.csv")) {
    string Line = string.Empty;

    while (!String.IsNullOrWhiteSpace(Line = Reader.ReadLine())) {
        Rows.Add(Line);
    };
};

if (Rows.Count > 0) {
    int RowsInserted = 0;

    DataTable Table = new DataTable();

    Table.Columns.Add(new DataColumn("Id"));
    Table.Columns.Add(new DataColumn("A"));

    while ((RowsInserted < Rows.Count) && ((Rows.Count - RowsInserted) >= 1000)) {
        Table = GetDataTable(Rows.Skip(RowsInserted).Take(1000).ToList(), Table);

        PerformSqlBulkCopy(Table);

        RowsInserted += 1000;

        Table.Clear();
    };

    Table = GetDataTable(Rows.Skip(RowsInserted).ToList(), Table);

    PerformSqlBulkCopy(Table);
};

static DataTable GetDataTable(
    List<string> Rows,
    DataTable Table) {
    for (short a = 0, b = (short)Rows.Count; a < b; a++) {
        string[] Columns = Rows[a].Split(new char[1] {
            ','
        }, StringSplitOptions.RemoveEmptyEntries);

        DataRow Row = Table.NewRow();

        Row["A"] = "";

        Table.Rows.Add(Row);
    };

    return (Table);
}

static void PerformSqlBulkCopy(
    DataTable Table) {
    using (SqlBulkCopy SqlBulkCopy = new SqlBulkCopy(@"", SqlBulkCopyOptions.TableLock)) {
        SqlBulkCopy.BatchSize = Table.Rows.Count;
        SqlBulkCopy.DestinationTableName = "";
        SqlBulkCopy.WriteToServer(Table);
    };
}
5
задан Gup3rSuR4c 30 July 2010 в 00:47
поделиться