開発を改善するために、C# 経由でクエリ プランを収集したいと考えています。
私のアプローチは使用DbCommandとSET 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) }