【问题标题】:How do I improve the database performance when going from VBA to SQL Server 2008 R2?从 VBA 转到 SQL Server 2008 R2 时,如何提高数据库性能?
【发布时间】:2012-12-17 07:32:04
【问题描述】:

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

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

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

我要尝试的东西已经不多了。从 VBA 转到 SQL Server 2008 R2 时如何提高数据库性能?

【问题讨论】:

  • 从 VBA 转到 SQL Server 是什么意思? VBA 是一种编程语言,SQL Server 是一种 DBMS。这些是完全不同的东西。
  • 客户端是VBA写的,SQL Server是数据库。
  • 你能告诉我们VBA代码吗?
  • 尽量避免对数据库进行大量往返。也许将您的数据加载到 SQL Server 中的临时表中,然后针对整个批次运行您的 SP。逐行处理非常慢 - 以集合的形式处理数据,您将获得更好的性能。
  • @LordPeter:将数据加载到临时表中仍然需要多次往返并且仍然很慢(尽管它可能比这更快)。这是一个常见的性能问题,问题首先在于将数据导入 SqlServer。一旦进入,就有许多高性能选项。但是要从客户端应用程序中获取数据,实际上只有一个高性能选项,那就是 SqlBulkCopy(),它仅在 ADO.net 中可用,在 ADODB(即 COM)中不可用。

标签: excel sql-server-2008-r2 table-valued-parameters vba


【解决方案1】:

我想通了。虽然 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 的文章中更详细地描述了该解决方案:Using SQL Server 2008 Table-valued Parameters in Access 2007

使用 TVP 极大地提升了我的性能。希望这对其他人有帮助。干杯。

【讨论】:

    【解决方案2】:

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

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

    也就是说,这取决于您更新的复杂程度,这可能只会让事情变得更糟。

    【讨论】:

    • 好点。但是,我的客户正在使用这项技术,我没有选择更改它的权利。
    • 我在使用更糟糕的 Access 性能时遇到了类似的情况。我发现编写一个 .csv 文件并上传它可以使性能提高一个数量级。不确定这对 CRUD 应用程序是否有帮助
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多