当前位置:  开发笔记 > 数据库 > 正文

Sql Server 2008调整大事务(700k +行/事务)

如何解决《SqlServer2008调整大事务(700k+行/事务)》经验,为你挑选了1个好方法。

所以,我正在研究一个数据库,我将把它作为一个支持数据库添加到我未来的项目中,但我遇到了一些问题,特别是日志.

数据库基本上每月需要更新一次.必须清除主表,然后重新填充CSV文件.问题是Sql Server会为它生成一个MEGA大的日志.我成功填写了一次,但想通过清洗然后重新填充它来测试整个过程.

那是我收到日志文件填满的错误.它从88MB(通过维护计划收缩后)跳到248MB,然后完全停止该过程并且永远不会完成.

我把它的增长限制在256MB,增加了16MB,这就是它失败的原因,但实际上我根本不需要它来记录任何东西.有没有办法完全绕过对数据库运行的任何查询的日志记录?

感谢提前回复!

编辑:根据@ mattmc3的建议我已经为整个过程实现了SqlBulkCopy.它工作令人惊讶,除了我的循环以某种方式崩溃在最后剩下的需要插入的块上.我不太确定我哪里出错了,我甚至不知道这是不是一个合适的循环,所以我很感激它的一些帮助.

我知道它是最后一个GetDataTable或SetSqlBulkCopy调用的问题.我正在尝试插入788189行,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 Rows = new List();

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

mattmc3.. 5

如果你正在做一个大容量插入到SQL Server中,表这是你应如何做这个(BCP,Bulk Insert,Insert Into...Select,或在.NET中,SqlBulkCopy类),你可以使用恢复模型的"批量登录".我强烈建议您阅读有关恢复模型的MSDN文章:http://msdn.microsoft.com/en-us/library/ms189275.aspx



1> mattmc3..:

如果你正在做一个大容量插入到SQL Server中,表这是你应如何做这个(BCP,Bulk Insert,Insert Into...Select,或在.NET中,SqlBulkCopy类),你可以使用恢复模型的"批量登录".我强烈建议您阅读有关恢复模型的MSDN文章:http://msdn.microsoft.com/en-us/library/ms189275.aspx

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有