#author("2019-01-11T03:00:20+00:00","default:admin","admin") #author("2021-01-04T07:20:12+00:00","default:admin","admin") -[[SQL Server | 実行プランの確認方法:https://mura-hiro.com/sql-server-real-plan/]] -[[実行プランを読む – 基本編 (その 1):https://blogs.msdn.microsoft.com/jpsql/2011/09/06/1/]] -[[実行プランを読む – 基本編 (その 2):https://blogs.msdn.microsoft.com/jpsql/2011/09/14/2/]] -[[実行プランを読む – 基本編 (その 3):https://blogs.msdn.microsoft.com/jpsql/2011/10/24/3/]] -[[実行プランのキャッシュと再利用:https://technet.microsoft.com/ja-jp/library/ms181055(v=sql.105).aspx]] -[[「パラメータースニッフィング」によって、あるタイミングから処理が遅くなった(パフォーマンストラブル):http://www.atmarkit.co.jp/ait/articles/1706/19/news007.html]] -[[ストアド プロシージャの再コンパイル:https://docs.microsoft.com/ja-jp/sql/relational-databases/stored-procedures/recompile-a-stored-procedure?view=sql-server-2017]] *実行プランの再利用 [#necc4082] -[[クエリの実行プランを強制する:http://daiyamamoto.hatenablog.com/entry/20080626/p1]] -[[XML 形式での実行プランの保存:https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/save-an-execution-plan-in-xml-format?view=sql-server-2017]] -[[USE PLAN クエリ ヒントの使用:https://docs.microsoft.com/ja-jp/previous-versions/sql/sql-server-2008-r2/ms186954(v=sql.105)]] -SQL Server Management Studioで、クエリを選択して「CTRL+L」で実行プランをビジュアル表示 -この実行プラン上で、右クリック⇒「実行プランのXMLの表示」 -このXMLは、XMLで書かれた実行プランのDump -クエリ内に '(アポストロフィー)がある場合 --エディタで '(アポストロフィー)を &apos に文字列置換 -クエリの後に「option (use plan N'【実行プランのXML】');」を追記して実行 -実行プランを再利用することで、環境が変わろうがなんだろうが、指定したプラン通りに実行される -ただし、他のクエリヒント(HASH JOINやLOOP JOIN)などと同様に、オプティマイザが働かなくなる点は注意 *実行プランのRecompileが発生するトリガ [#w41ec912] -スキーマの変更 -統計の変更 -コンパイルの遅延 -Set オプションの変更 -Temp テーブルの変更 -リモート行セットの変更 -参照権限の変更 -クエリ通知環境の変更 -パーティション ビューの変更 -カーソル オプションの変更 -オプション (再コンパイル) の要求 *実行プラン再作成イベントの確認 [#vc4e0643] -[[ウィザードを使用した拡張イベント セッションの作成 (オブジェクト エクスプローラー):https://docs.microsoft.com/ja-jp/sql/database-engine/create-an-extended-events-session-using-the-wizard-object-explorer?view=sql-server-2014]] -[[SQL:StmtRecompile イベント クラス:https://docs.microsoft.com/ja-jp/sql/relational-databases/event-classes/sql-stmtrecompile-event-class?view=sql-server-2017]] *実行プランの固定化 [#n4017df3] -実行プランはプランガイドを使用して固定することが可能 -プランガイドとは、あるクエリが発行された場合にはこのヒントやプランを使用するといった方法で、固定の実行プランを使用して特定のクエリを実行する方法 -[[プランガイド:https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/plan-guides?view=sql-server-2017]] -[[パラメーター化クエリのプランガイドの作成:https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/create-a-plan-guide-for-parameterized-queries?view=sql-server-2017]] -[[SQL Server Profiler を使用したプランガイドの作成とテスト:https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/use-sql-server-profiler-to-create-and-test-plan-guides?view=sql-server-2017]] -[[プランガイドへの固定クエリプランの適用:https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/apply-a-fixed-query-plan-to-a-plan-guide?view=sql-server-2017]] **注意点 [#v9d39f60] -実行プランを固定化した場合、下記の注意事項、および、デメリットが生じる可能性がある --クエリにスペースが一つ入っただけでも、異なるクエリとみなされてプランガイドが機能しなくなる恐れがある --毎回、記述が変化するようなクエリの場合、プランガイドの固定化は事実上不可能 --実行プランを固定する場合、例えば レコード件数の大幅な増加、減少が発生することで、現状では最適な実行プランであったとしても、データの大幅な増減後では最適ではない実行プランとなる可能性がある *SQL実行時間の計測 [#n0e08698] -[[これでスッキリ!! SQLServerダイエット!:http://tech.sanwasystem.com/entry/2015/08/31/225815]] -[[sys.dm_exec_query_stats (Transact-SQL):https://docs.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-query-stats-transact-sql?view=sql-server-2017]] -直近で実行したSQLの実行時間 SELECT st.text ,last_execution_time ,(last_elapsed_time+0.0)/1000 AS [last_elapsed_time(ms)] ,(min_elapsed_time+0.0)/1000 AS [min_elapsed_time(ms)] ,(max_elapsed_time+0.0)/1000 AS [max_elapsed_time(ms)] ,(total_elapsed_time+0.0)/execution_count/1000 AS [avg_elapsed_time(ms)] ,execution_count FROM sys.dm_exec_query_stats qs WITH(NOLOCK) CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st ORDER BY last_execution_time desc *index使用状況 [#xe3022f0] -[[SQLServer: 指定したテーブルのインデックス使用状況を取得する:https://qiita.com/maaaaaaaa/items/cbfa1845cebfea258c41]]