2

我正在开发一个财务应用程序,该应用程序执行从 Excel 到 SQL Server 2008 R2 的 CRUD 操作。该应用程序使用 VBA 和 ADO。我正在尝试优化循环数千行并将更新发送到数据库的操作的性能。目前,存储过程每行调用一次。

当用户与应用程序的连接速度很慢时,性能也很慢,足以让他们开始抱怨。为了优化性能,我尝试了:

  1. 将所有操作批处理到一个 XML 文件中,然后一次性发送。不幸的是,性能变得更糟了。
  2. 接下来,我想在一个表值参数中批量处理所有更新。但是,VBA 和 ADO 不能使用表值参数。

我已经没有东西可以尝试了。从 VBA 转到 SQL Server 2008 R2 时,如何提高数据库性能?

4

2 回答 2

5

我想到了。虽然 ADO 中没有可用的表值参数 (TVP) 对象,但您可以在 SQL Server 连接上执行原始 SQL 语句。解决方案是:

  1. 构建使用 TVP 的 SQL 语句
  2. 在 ADO 连接上执行 SQL 语句。

例如:

Dim cnSQLServer As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strSQL As String

Set cnSQLServer = New ADODB.Connection
cnSQLServer.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;Integrated Security = SSPI"

' Build a SQL statement that uses a TVP
strSQL = "DECLARE @ReturnMessage nvarchar(255) " + _
    "DECLARE @catType CategoryTableType " + _
    "INSERT INTO @catType" + _
    "EXEC ('" + _
    "SELECT ''Organic'', ''Organically grown produce and grains'' " + _
    "SELECT ''Conventional'', ''Non-organically grown produce and grains'' " + _
    "SELECT ''Irish'', ''Mrs. O''''Leary''''s creamery products'' " + _
    "') " + _
    "EXEC dbo.usp_InsertCategory @catType, @ReturnMessage OUTPUT; " + _
    "SELECT @ReturnMessage as ReturnMessage'"

' Execute the SQL statement on the ADO connection.
Set rst = cnSQLServer.Execute(strSQL)

该解决方案在有关从 MS Access 调用 TVP 的文章中进行了更详细的描述:在 Access 2007 中使用 SQL Server 2008 表值参数

使用 TVP 给了我很好的性能提升。希望这对其他人有帮助。干杯。

于 2013-01-09T19:47:56.690 回答
1

老实说,根据我的经验,VBA/ADO 的速度非常快(与网站相比)。这种数据库连接方法的开销很大,尤其是在执行 SQL 语句时,而且对排除故障没有多大帮助。

尝试的一种途径是更新记录集对象而不是执行存储过程,我发现这在某些情况下会有所帮助。

也就是说,根据您更新的复杂性,这可能只会让事情变得更糟。

于 2013-01-03T20:19:48.890 回答