SQL Server中更新表的最快方法

时间:2014-03-16 21:50:26

标签: sql sql-server vb.net

我有一个Vb.net应用程序,它非常频繁地更新SQL Server数据库中的表。该表有143列,大约10,000行。更新几个不同模块的表需要相同的过程,因此更新的数据始终不同,有时它可能只是几行中的几个单元,其他时间可能是几百行和几列。

有时需要15到30秒才能更新信息。这个接缝真的很长,因为这个表可以在一秒钟或2秒内完全重写一次批量导入(我意识到这不是重点)。数据库设置为简单恢复,表只有一个索引。我尝试过更新批量大小,没有明显改善。

我正在使用以下代码进行更新。我能做些什么来提高速度吗?

 Dim oMainQueryR As String

    If DBSelectionsDS.HasChanges Then

        Try
                oMainQueryR = "SELECT * FROM DBSelections"

                Using connection As New SqlConnection(RacingConStr)
                    Using oDataSQL As New SqlDataAdapter(oMainQueryR, connection)
                        oDataSQL.UpdateBatchSize = 100
                        Using cbT As SqlCommandBuilder = New SqlCommandBuilder(oDataSQL)
                            connection.Open()
                            oDataSQL.Update(DBSelectionsDS, "DBSelectionsDetails")
                            connection.Close()
                        End Using
                    End Using
                End Using


                DBSelectionsDS.Tables("DBSelectionsDetails").AcceptChanges()

        Catch ex As Exception

            ErrMess = "ERROR - occured  " & ex.ToString
            Call WriteError()
            Call ViewError()

        End Try

    End If

1 个答案:

答案 0 :(得分:3)

我愿意打赌瓶颈在两个地方:

首先,您每次需要运行更新时从表中选择所有。随着桌子的大小增加,这将花费更长时间。 SqlCommandBuilder只需要使用架构,因此请将查询字符串更改为:

oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"

这将仅返回表的架构和列名,但不返回任何行,DataSet包含CommandBuilder执行更新所需的所有数据信息。如果你很好奇为什么会这样,那么考虑0永远不会等于1,所以SQL说永远不会任何0 = 1的行,而只是返回架构。

其次,UpdateBatchSize限制了更新的批量大小。     考虑在DataSet中有200行已更改的数据。您     然后将不得不两次前往数据库完成更新。     设置UpdateBatchSize = 0将删除此限制,您也可以     只需删除该行,默认为0。

否则您的瓶颈可能是由另一个锁定DBSelections表的事务引起的。确保如果在更新发生时对该表运行任何查询,您将要么使用with (nolock)语句,要么确保您的更新是当时发生的唯一事务。