200万条记录的SqlDataAdapter.Update()非常慢

时间:2019-04-30 09:22:51

标签: sql vb.net sql-server-2008

我有一个客户想要每天将其子客户pricetools(超过2.000.000条记录)导入到SQL Server数据库中(是的...每天有超过900.000行的更改)。

数据以CSV格式提供(不是RFC-4180标准ç_ç,而是nvm),并且可以是数据的插入,删除或更新。

我的问题是,数据库中数据的插入需要1个多晚上才能结束,我需要加快速度。

我现在正在做的是:

  • 将csv文件投射到数据表(Tab1)中(约3分钟)
  • 选择上一个表(Tab0)中的所有数据,并将它们与Tab1匹配(约15分钟,未更改的行被标记为未修改,因此在flex-grow: 1中将其忽略,我检查了第一行,而且似乎行得通,我使用adapter.Update来实现。)
  • 启动以下命令以应用更改(对于900.000更改,超过5小时):

    dataRowToProcess.AcceptChanges()

如果我有很多插入过程,则它比相同数量的更新要慢。 我究竟做错了什么?我是否缺少某些cmdSQL = New SqlCommand(superQuery, cn) Dim adapter As SqlDataAdapter = New SqlDataAdapter(cmdSQL) adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey Dim build As SqlCommandBuilder = New SqlCommandBuilder(adapter) build.SetAllValues = False adapter.Update(dataTableCustomersDetail) 'Insert/Update records 选项?

谢谢

2 个答案:

答案 0 :(得分:0)

由于@matsnow,我想出了SqlBulkCopy的解决方案。考虑到表的一半会随时更改,这是一个静态的错误,因此我决定删除/插入数据是最快的跟踪方式(现在只需5-6分钟而不是10分钟)。

代码:

'Delete all table content
Dim cmd As SqlCommand = New SqlCommand("TRUNCATE TABLE " + tableName, cn)
cmd.ExecuteNonQuery()
'Insert all records
Using sbc As SqlBulkCopy = New SqlBulkCopy(cn)
    sbc.DestinationTableName = tableName
    sbc.BulkCopyTimeout = 1000
    For Each column As DataColumn In dataTableCustomersDetail.Columns
        sbc.ColumnMappings.Add(column.ToString(), column.ToString())
    Next
    sbc.WriteToServer(dataTableCustomersDetail)
End Using

答案 1 :(得分:0)

使用 Connection.BeginTransaction() 加速 DataAdapter 更新。

cn.Open() 'open connection
Dim myTrans As SQLTransaction
myTrans = cn.BeginTransaction() 
'Associate the transaction with the select command object of the DataAdapter
adapter.SelectCommand.Transaction = myTrans 

adapter.Update(dataTableCustomersDetail) 'do the update as before

Try
    myTrans.Commit()
Catch ex As Exception
    myTrans.Rollback()
End Try
cn.Close()

对于 8000 行,这会将更新时间从超过 5 分钟更改为 2 秒