在SQL Server中更新表的最快方法

在SQL Server中更新表的最快方法,sql,sql-server,vb.net,Sql,Sql Server,Vb.net,我有一个Vb.net应用程序,它非常频繁地更新SQL Server数据库中的表。该表有143列,约10000行。更新多个不同模块的表需要相同的过程,因此更新的数据始终不同,有时可能只是几行中的几个单元格,有时可能是几百行和几列 有时更新信息需要15到30秒。考虑到表可以在一两秒钟内通过批量导入完全重写,这一点非常长(我意识到这与问题无关)。数据库设置为简单恢复,表只有一个索引。我尝试过使用更新批量大小,但没有明显的改进 我正在使用下面的代码进行更新。我能做些什么来提高速度吗 Dim oMain

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

有时更新信息需要15到30秒。考虑到表可以在一两秒钟内通过批量导入完全重写,这一点非常长(我意识到这与问题无关)。数据库设置为简单恢复,表只有一个索引。我尝试过使用更新批量大小,但没有明显的改进

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

 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

我敢打赌,瓶颈在于两个方面:

首先,每次需要运行更新时,都要从表中选择所有内容。随着表的增大,这将花费越来越长的时间。
SqlCommandBuilder
只需要一个模式即可使用,因此将查询字符串更改为:

oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
这将只返回表的架构和列名,而不返回行。
DataSet
包含
CommandBuilder
执行更新所需的所有数据信息。如果你想知道为什么这样做,考虑0永远不会等于1,所以SQL说从来没有任何行0=1,而只是返回模式。 其次,
UpdateBatchSize
限制了更新的批量大小。 考虑在<代码>数据集< /代码>中有200行更改的数据。你 然后,您必须访问数据库两次才能完成更新。 设置UpdateBatchSize=0将删除此限制,您也可以 只需删除该行,因为默认值为0


否则,另一个事务锁定
dbs
表可能会导致瓶颈。确保在更新过程中,如果您正在对该表运行任何查询,您要么希望使用
with(nolock)
语句,要么确保您的更新是当时发生的唯一事务。

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

首先,每次需要运行更新时,都要从表中选择所有内容。随着表的增大,这将花费越来越长的时间。
SqlCommandBuilder
只需要一个模式即可使用,因此将查询字符串更改为:

oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
这将只返回表的架构和列名,而不返回行。
DataSet
包含
CommandBuilder
执行更新所需的所有数据信息。如果你想知道为什么这样做,考虑0永远不会等于1,所以SQL说从来没有任何行0=1,而只是返回模式。 其次,
UpdateBatchSize
限制了更新的批量大小。 考虑在<代码>数据集< /代码>中有200行更改的数据。你 然后,您必须访问数据库两次才能完成更新。 设置UpdateBatchSize=0将删除此限制,您也可以 只需删除该行,因为默认值为0


否则,另一个事务锁定
dbs
表可能会导致瓶颈。确保在更新过程中,如果您正在对该表运行任何查询,您要么希望使用
with(nolock)
语句,要么确保您的更新是当时发生的唯一事务。

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

首先,每次需要运行更新时,都要从表中选择所有内容。随着表的增大,这将花费越来越长的时间。
SqlCommandBuilder
只需要一个模式即可使用,因此将查询字符串更改为:

oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
这将只返回表的架构和列名,而不返回行。
DataSet
包含
CommandBuilder
执行更新所需的所有数据信息。如果你想知道为什么这样做,考虑0永远不会等于1,所以SQL说从来没有任何行0=1,而只是返回模式。 其次,
UpdateBatchSize
限制了更新的批量大小。 考虑在<代码>数据集< /代码>中有200行更改的数据。你 然后,您必须访问数据库两次才能完成更新。 设置UpdateBatchSize=0将删除此限制,您也可以 只需删除该行,因为默认值为0


否则,另一个事务锁定
dbs
表可能会导致瓶颈。确保在更新过程中,如果您正在对该表运行任何查询,您要么希望使用
with(nolock)
语句,要么确保您的更新是当时发生的唯一事务。

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

首先,每次需要运行更新时,都要从表中选择所有内容。随着表的增大,这将花费越来越长的时间。
SqlCommandBuilder
只需要一个模式即可使用,因此将查询字符串更改为:

oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
这将只返回表的架构和列名,而不返回行。
DataSet
包含
CommandBuilder
执行更新所需的所有数据信息。如果你想知道为什么这样做,考虑0永远不会等于1,所以SQL说从来没有任何行0=1,而只是返回模式。 其次,
UpdateBatchSize
限制了更新的批量大小。 考虑20