gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:58:42 24 4
gpt4 key购买 nike

所以,我正在开发一个数据库,我将把它作为一种支持数据库添加到我 future 的项目中,但我遇到了一些问题,尤其是日志。

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

那是当我收到日志文件已满的错误时。它从 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<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);
};
}

最佳答案

如果您正在 SQL Server 中对表进行批量插入,这就是您应该这样做的方式( BCPBulk InsertInsert Into...Select 或在 .NET 中的 SqlBulkCopy 类),您可以使用“批量记录”恢复模型。我强烈建议阅读有关恢复模型的 MSDN 文章:http://msdn.microsoft.com/en-us/library/ms189275.aspx

关于sql-server-2008 - Sql Server 2008 调整大事务(700k+ 行/事务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com