2

SQL Server Management Studioで実行するのに5〜10秒かかるストアドプロシージャがあります。

これがC#から呼び出されると、10分後にタイムアウトになります。

cmd.CommandTimeout = 600;

sp_recompileを使用してクエリを再コンパイルしました。また、DBCCDROPCLEANBUFFERSとDBCCFREEPROCCACHEを使用して、キャッシュと実行計画を無効にしました。

私は検索して検索しましたが、上記で試したことを指し示す答えしか見つかりませんでした。だから私は、私が行方不明になっていることがもっと明白なことかもしれないと思っていますか?

public static void Action_StoredProc(SqlConnection conn, Boolean map, string acc) {
        SqlCommand cmd = new SqlCommand("Action_StoredProc", conn);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.Add("@map", SqlDbType.Bit).Value = map;
        cmd.Parameters.Add("@acc", SqlDbType.VarChar).Value = acc;
        cmd.CommandTimeout = 600;
        cmd.ExecuteNonQuery();
    }
4

3 に答える 3

1

SQL Server プロファイラーを使用する場合は、実行中のプロファイルを設定し、SSMS でクエリを実行してからコードから実行します。

SSMS とコードから渡される SET ステートメントに注意してください。私の推測では、それらは異なるものになるでしょう。

次に、コード内の接続に対して明示的に設定するか、異なるものを SP の先頭に追加するだけです。

于 2013-01-02T17:17:18.453 に答える
0

SSMS を介して手順を実行するのに 1 秒もかからないという非常によく似た状況がありましたが、コードから実行すると完了するまでに 45 秒かかりました。SQL トレースを読み込んだところ、実行計画が SSMS およびコードを介して実行されている手順とは異なることがわかりました。両方の場所で適切な実行計画を取得するために、手順を再コンパイルし、変更し、DB 内のすべての実行計画をクリアするなどしましたが、まだ問題がありました。

最終的に、プロシージャで使用されるプライマリ テーブルの統計を再構築し、プロシージャを再コンパイルすると、両方の実行方法で実行計画が同じになり、問題が修正されました。

コマンドは次のとおりです。

UPDATE STATISTICS [TABLE NAME]
GO

EXEC sys.sp_recompile @objname = N''
GO
于 2013-06-04T17:34:43.767 に答える