5

現在、Microsoft Enterprise Library Data Access 5.0 を使用してストアド プロシージャを実行しています。

Database myDatabase = DatabaseFactory.CreateDatabase();
using (DbCommand command = myDatabase.GetStoredProcCommand("myStoredProc"))
{
   //Add parameters here
   using (IDataReader dataReader = myDatabase.ExecuteReader(command))
   {
      while (dataReader.Read())
      {
      }
   }
}

すべてが機能しますが、実行には時間がかかります。SQL プロファイラーを有効にすると、ストアド プロシージャの実行に約 50 秒かかることがわかります。ただし、プロファイラーから同じスクリプトを取得して SQL Management Studio 内で実行すると、すべての行を返すのに約 480 ミリ秒しかかかりません。

誰かがこの問題に遭遇しましたか? 大きな違いがあるのはなぜですか?

4

2 に答える 2

1

簡単にParameter Sniffingになる可能性があります。

于 2013-02-28T23:39:19.447 に答える
0

文字列パラメーターの型を に変更してみてDbType.AnsiString、それが役立つかどうかを確認してください。
問題は、データベース列が varchar(...) であり、インデックスがあり、その列に一致するパラメーターが nvarchar(...) である場合、SQL Server がインデックスを無視してテーブル スキャンを実行することです。解決策は、SQL Server がインデックスを使用するように、パラメーターを強制的に AnsiString 型にすることです。

于 2013-03-01T07:36:31.443 に答える