2

ExcelからSQLServer2008R2へのCRUD操作を実行する金融アプリケーションに取り組んでいます。アプリケーションはVBAとADOを使用します。何千もの行をループしてデータベースに更新を送信する操作のパフォーマンスを最適化しようとしています。現在、ストアドプロシージャは、行ごとに1回呼び出されます。

ユーザーがアプリケーションへの接続が遅い場合、パフォーマンスも遅くなり、不満を言うようになります。パフォーマンスを最適化するために、私は次のことを試しました。

  1. すべての操作をXMLファイルにバッチ処理し、一度に送信します。残念ながら、パフォーマンスは悪化しました。
  2. 次に、すべての更新をテーブル値パラメーターにバッチ処理することを考えました。ただし、VBAとADOはテーブル値のパラメーターを使用できません。

試すことが不足しています。VBAからSQLServer2008 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 の速度は (Web サイトと比較して) かなりひどいものです。このデータベース接続方法には、特に SQL ステートメントを実行するときに難解なオーバーヘッドがあり、トラブルシューティングに役立つものはあまりありません。

試みるべき 1 つの手段は、ストアド プロシージャを実行するのではなく、レコードセット オブジェクトを更新することです。これが役立つ場合もあります。

とはいえ、更新の複雑さによっては、事態が悪化する可能性があります.

于 2013-01-03T20:19:48.890 に答える