都内で働くSEの技術的なひとりごと

都内でサラリーマンやってます。マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。よろしくお願いします♪

SQL Server のチューニングについてまとめてみる - その19 - ( プランがちゃんと再利用されているか確認してみる )

 クエリチューニングにおいてインデックスが使われていることに着目することが多いですが、他の重要なことに "プランの再利用" があります。プランの再利用率が悪いと SQLコンパイルが頻繁に実行されてしまい、その結果 CPU 使用率が高くなってしまいます。私の経験ではコンパイルに要した時間は最高で35秒です。DB サーバの負荷が異常に上がってしまい、変な汗をかいた記憶がありますwww 下記の記事で少し触れています。
ryuchan.hatenablog.com

 さて、クエリの再利用率ですが sys.dm_os_performance_counters を使用します。( カウンターは、Batch Requests/sec と SQL Compilations/sec を使用します。 )

SQL Server: SQL Statistics オブジェクト

  • Batch Requests/sec
    1 秒あたりに受信した Transact-SQL コマンドのバッチの数。 この統計値はすべての制約の影響を受けます。制約とは、I/O、ユーザー数、キャッシュ サイズ、要求の複雑さなどです。 バッチ要求の数が多いことは、スループットが優れていることを意味します。
  • SQL Compilations/sec
    1 秒あたりの SQL コンパイルの回数。 コンパイル コード パスが入力された回数を示します。 SQL Serverステートメントレベルの再コンパイルによって発生したコンパイル回数を含みます。 SQL Server のユーザー利用状況が安定化すると、この値は定常状態に到達します。

 下記のクエリを SQL Server Management Studio で実行してみましょう。

SELECT 
    [実行プランの再利用率] = CAST(((( batch_req.cntr_value * 1.00 - sql_comp.cntr_value * 1.00 ) / batch_req.cntr_value) * 100 ) AS DECIMAL(5,2))
FROM  
    sys.dm_os_performance_counters batch_req,
    sys.dm_os_performance_counters sql_comp
WHERE 
    batch_req.counter_name='Batch Requests/sec' and
    sql_comp.counter_name='SQL Compilations/sec'

f:id:koogucc11:20160515234906p:plain
※これは、低すぎ!

 パラメータ化などをきちんと使用して再利用率を向上させ、クエリをパフォーマンスアップさせましょう。

 子供のためにポチった!

 ThinkPad X1 Carbon が欲しい!メモリは16Gで。

 Yoga も捨てがたい....