4

開発を改善するために、C# 経由でクエリ プランを収集したいと考えています。

私のアプローチは使用DbCommandSET SHOWPLAN_XML ON

しかし...

  • Non-parameterized queryクエリプランをまとめて返します。
  • Parameterized query何も返しません!

SQL Server 2008 R2 と LocalDB(2012) の両方に同じ問題があります。

パラメータ化されたクエリの計画を取得するにはどうすればよいですか?

パラメータ化されたクエリが計画できない理由を知っていますか?


[サンプル:再現手順]</h1>

1. テーブルを作成します。

CREATE TABLE バナナ (
  BananaId int IDENTITY(100,1),
  タイトル nvarchar(512)、
);
行く

ALTER TABLE バナナ
    制約を追加 Banana_PK PRIMARY KEY(BananaId);
行く

2.クエリを実行する

  • パラメータ化されていないクエリ

    これは返品プランになります:

    using (var conn = new SqlConnection( {Connection Strings} )) {
        conn.Open();
        DbCommand command = conn.CreateCommand();
    
        command.CommandText = "SET SHOWPLAN_XML ON;";
        command.CommandType = CommandType.Text;
        command.ExecuteNonQuery();
    
        command.CommandText = "SELECT BananaId, Title FROM Banana Where BananaId = 999";
        var plan = (string)command.ExecuteScalar();
    
        command.CommandText = "SET SHOWPLAN_XML OFF;";
        command.ExecuteNonQuery();
    
        Debug.WriteLine(plan); // <ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" ...
    }
    
  • パラメータ化されたクエリ

    これは対応計画ではありません:

    using (var conn = new SqlConnection( {Connection Strings} )) {
        conn.Open();
        DbCommand command = conn.CreateCommand();
    
        command.CommandText = "SET SHOWPLAN_XML ON;";
        command.CommandType = CommandType.Text;
        command.ExecuteNonQuery();
    
        command.CommandText = "SELECT BananaId, Title FROM Banana Where BananaId = @BananaId";
        var parameter = command.CreateParameter();
        parameter.ParameterName = "@BananaId";
        parameter.Value = 999;
        command.Parameters.Add(parameter);
        var plan = (string)command.ExecuteScalar();
    
        command.CommandText = "SET SHOWPLAN_XML OFF;";
        command.ExecuteNonQuery();
    
        Debug.WriteLine(plan); // (null)
    }
    
4

2 に答える 2