都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

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

実行プランの読み方をまとめてみる - その7 ( ブロッキングしないオペレーター ( Non-Blocking Operator ) とブロッキングオペレータ ( Blocking Operator ) について説明してみる ) -

 正月休みも終わりました。年末年始の暴飲暴食のため胃腸がボロボロです。お粥を食べたい気分です。

七草粥も地方毎に特色あるんですね。七草がゆ - Wikipedia

 そして、終いには腰もやってしまうという始末....正月でかなり気分もだらけてしまったので、気合を入れるため早速記事を書きたいと思います。今回は、ブロッキングオペレータ ( Blocking Operator ) とブロッキングしないオペレーター ( Non-Blocking Operator ) について説明します。(各種オペレータを説明する上で、必要かなーと思ったので。あと、チューニングする上でも知っておいたほうがよいです。)
 
 昨年度末に下記の二つ記事を投稿しました。
ryuchan.hatenablog.com
ryuchan.hatenablog.com

 結論から言うと、Stream Aggregate がブロッキングしないオペレーター ( Non-Blocking Operator ) で、Hash Aggregate がブロッキングオペレータ ( Blocking Operator )です。
 
 Stream Aggregate は集計に使用するキーが並べかえられているのが前提のオペレータ処理です。Stream Aggregate は下図のように処理されます。少ない単位で処理ができ、次のオペレータに処理を行うことができるので、リソースの使用効率が非常にいいオペレータです。
f:id:koogucc11:20160104154223p:plain
※実行プランの Stream Aggregate オペレーターのアイコンがまさに処理内容を表現してますね。
f:id:koogucc11:20160104171557p:plain

 Hash Aggregate は集計に使用するキーが並べかえられていない場合のオペレータ処理です。Hash Aggregate は下図のように処理されます。一度対象データすべて抱える必要があり、且つ集計がすべて完了するまでは次のオペレータの処理ができません。
f:id:koogucc11:20160104154316p:plain
 
 参考までですが、下記のように Hash Aggregate が発生しているクエリに OPTION句 を足すことで Stream Aggregate に変更することができます。ブロッキングオペレータの Sort オペレータが発生しているので、パフォーマンスチューニングとしては、あまり意味がないかもしれません。

SELECT
    ModifiedDate,
    COUNT(ModifiedDate)
FROM
    Sales.SalesOrderHeader
GROUP BY
    ModifiedDate
OPTION (ORDER GROUP);

f:id:koogucc11:20160104155753p:plain

 ORDER GROUP を指定すると、Hash Aggregate が発生させる workfile 処理がなくなります。どちらが効率的なのでしょうか?OPTION (ORDER GROUP) を指定しない場合、workfile と worktable を二つ必要とするので、OPTION (ORDER GROUP) を指定したほうが効率的な気もしますが....(時間があるときにでも、検証してみよう)

  • OPTION (ORDER GROUP)を付加した場合
    f:id:koogucc11:20160104160535p:plain
  • OPTION (ORDER GROUP)を付加しない場合
    f:id:koogucc11:20160104160544p:plain

 今回の内容から少しそれてしまいました。次回は Spool 系のオペレータについて説明します。

  • Eager Spool
    f:id:koogucc11:20160104145214p:plain
  • Lazy Spool
    f:id:koogucc11:20160104145220p:plain

 はて?なんなんでしょうか?熱心なSpool と怠けた Spool ?

※うう、腰がまだ痛い。

【第2類医薬品】バンテリンコーワパップS 24枚

【第2類医薬品】バンテリンコーワパップS 24枚

※腰のサポーターとか買おうかな。