【发布时间】:2021-01-27 21:01:19
【问题描述】:
我们正在删除一个数据库(例如 FirstDB)中的几个表,并将大约 93,357 行(一次一行)插入到另一个数据库(例如 SecondDB)的一个日志表中。
数据库恢复模型已满。
每行包含 6 列数据
[DeleteTime] [datetime] NULL,
[FilePath] [varchar](255) NOT NULL,
[DocumentID] [int] NULL,
[AnotherCol] [varchar](50) NULL,
[AnotherCol2] [varchar](50) NULL,
[AnotherCol3] [varchar](50) NULL,
在之前的插入中,当我们插入 153,000 行时,我们收到错误“数据库 'SecondDB' 的事务日志由于 'LOG_BACKUP' 而已满
避免在事务日志中占用大量空间的最佳方法是什么?
我应该为数据库 SecondDB 的每 1000 次插入提交事务吗?
这是从 FirstDb 中删除并插入 SecondDB 的代码
using (SqlConnection con = new SqlConnection(connectionString))
{
try
{
con.Open();
SqlDataAdapter da = new SqlDataAdapter("spGetDocuments", con);
DataSet ds = new DataSet();
da.Fill(ds);
foreach (DataRow aRow in ds.Tables[0].Rows)
{
try
{
//Code to insert into FirstDB
//Code to insert into SecondDB
cmdSecondDB = new SqlCommand("spUpdateDeleteDocsLog", con);
cmdSecondDB.CommandType = CommandType.StoredProcedure;
cmdSecondDB.Parameters.Add(new SqlParameter("FilePath", sDocumentPath));
cmdSecondDB.Parameters.Add(new SqlParameter("DocumentID", aRow["DocumentID"]));
:
iRow = cmdSecondDB.ExecuteNonQuery();
cmdSecondDB.Dispose();
cmdSecondDB = null;
}
}
ds.Dispose();
ds = null;
da.Dispose();
da = null;
con.Close();
}
}
另外,有没有办法计算出上述6行数据中的93357行会占用多少事务日志?
谢谢
【问题讨论】:
-
您将交易保持打开的时间过长,所以是的,您需要对其进行批处理。但是使用
SqlBulkCopy和SqlBulkCopyOptions.TableLock会快得多。并设置您的参数类型和大小Parameters.Add("FilePath", SqlDbType.VarChar, 255).Value = sDocumentPath或为批量复制设置列类型和大小。
标签: c# sql-server sql-server-2012 sql-insert bulkupdate