System.Data.SqlClient.SqlCommand
SQL Server Management Studioから実行する場合(2分後にタイムアウト)よりもはるかに高速に実行されるストアドプロシージャがあります(2秒)。
これの理由は何でしょうか?
詳細:SQL Server Management Studioでは、これは2秒で実行されます(本番データベースで):
EXEC sp_Stat @DepartmentID = NULL
.NET / C#では、2分後に次のタイムアウトが発生します(本番データベースの場合)。
string selectCommand = @"
EXEC sp_Stat
@DepartmentID = NULL";
string connectionString = "server=***;database=***;user id=***;pwd=***";
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(selectCommand, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
}
}
}
}
、、、も試してみましたがselectCommand = "sp_Stat"
、同じ結果です。CommandType = StoredProcedure
SqlParameter
そしてそれEXEC
がなければ、同じ結果になります。
ほとんどデータが空の開発データベースでは、どちらの場合も1秒未満で終了します。つまり、データベースには大量のデータがあることに関連していますが、それは.NETからのみ発生するようです...
Marc GravellがさまざまなSET
値について書いたことは、提示されたケースに違いをもたらします。
SQL Server Profilerは、Sql Server Management Studioが、SET
.NETSqlクライアントデータプロバイダーが実行しない次のを実行することを示しました。
SET ROWCOUNT 0
SET TEXTSIZE 2147483647
SET NOCOUNT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ARITHABORT ON
SET LOCK_TIMEOUT -1
SET QUERY_GOVERNOR_COST_LIMIT 0
SET DEADLOCK_PRIORITY NORMAL
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET ANSI_NULLS ON
SET ANSI_NULL_DFLT_ON ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET CURSOR_CLOSE_ON_COMMIT OFF
SET IMPLICIT_TRANSACTIONS OFF
SET QUOTED_IDENTIFIER ON
SET NOEXEC, PARSEONLY, FMTONLY OFF
これらを含めると、SSMSと.NETで同じクエリに同じ時間がかかりました。そして責任SET
は...
SET ARITHABORT ON
私は何を学びましたか?推測する代わりにプロファイラーを使用するかもしれません...
(最初の解決策は、パラメーターのスニッフィングに関連しているように見えました。しかし、私はいくつかのことを混ぜ合わせていました...)