性能调整分隔文件读取和写入数据库
Posted
技术标签:
【中文标题】性能调整分隔文件读取和写入数据库【英文标题】:Performance tuning delimited file read and writes to the database 【发布时间】:2012-10-07 23:17:04 【问题描述】:我需要帮助加快我的应用程序。应用程序读取大约 53,000 行分隔记录,解析每一行,然后继续将每一行发送到数据库以进行写入。到目前为止,我已将数据库端确定为主要瓶颈,我将不胜感激请帮助调整它。目前,处理所有包含 190 个字段的记录(53,000 条)大约需要 20 分钟,我想从将数据发送到数据库的代码开始显着减少这个数字。
我使用 Enterprise Library 5,利用那里的连接池)像这样连接到数据库
internal void SaveItem(String connString)
try
ImportDataAccessor dbacess = new ImportDataAccessor(connString);
foreach (ItemDetail item in itemEZdetails)
if (dbacess.SaveProduct(RecordID, item))
updatecounter++;
successfulsaves = dbacess.RowsProcessed;
updatecounter = dbacess.TotalRows;
catch (Exception ex)
throw ex;
public bool SaveProduct(String RecordUID, ItemDetail item)
//. . . . start function here
DbCommand insertCommand = db.GetStoredProcCommand("IDW_spEZViewRecordImport");
db.AddInParameter(insertCommand, "SessionUID", DbType.String, recordUID);
// the other 189 Parameters go here
int rowsAffected = db.ExecuteNonQuery(insertCommand);
// Object sreturnval = (String)db.GetParameterValue(insertCommand, "ReturnVal");
String returnval = String.Empty;
if ( ! (db.GetParameterValue(insertCommand, "ReturnVal") == DBNull.Value))
returnval = (String)db.GetParameterValue(insertCommand, "ReturnVal");
if (returnval == "60")
RowsProcessed++;
result = rowsAffected > 0;
//end of line add
如何使用我现在拥有的代码来实现这一点。提前致谢。
【问题讨论】:
看看这里***.com/questions/7070011/… 【参考方案1】:使用SQLBulkCopy,因为它在输入多行时非常快。
DataTable newProducts = MakeTable();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
bulkCopy.DestinationTableName =
"dbo.BulkCopyDemoMatchingColumns";
try
// Write from the source to the destination.
bulkCopy.WriteToServer(newProducts);
catch (Exception ex)
Console.WriteLine(ex.Message);
您只需向它传递一个带有匹配列名的DataTable
,瞧!
【讨论】:
【参考方案2】:在存储过程中使用多记录 INSERT 命令可能会获得更好的性能,如下所示:
Insert into ItemType (ItemTypeName)
VALUES
('TYPE1'),
('TYPE2'),
('TYPE3')
【讨论】:
以上是关于性能调整分隔文件读取和写入数据库的主要内容,如果未能解决你的问题,请参考以下文章