我有一个客户想要每天将其子客户pricetools(超过2.000.000条记录)导入到SQL Server数据库中(是的...每天有超过900.000行的更改)。
数据以CSV格式提供(不是RFC-4180标准ç_ç,而是nvm),并且可以是数据的插入,删除或更新。
我的问题是,数据库中数据的插入需要1个多晚上才能结束,我需要加快速度。
我现在正在做的是:
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
选项?
谢谢
答案 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 秒