実行プランの読み方をまとめてみる - その7 ( ブロッキングしないオペレーター ( Non-Blocking Operator ) とブロッキングオペレータ ( Blocking Operator ) について説明してみる ) -
正月休みも終わりました。年末年始の暴飲暴食のため胃腸がボロボロです。お粥を食べたい気分です。

- 出版社/メーカー: ほんまもん屋
- メディア: その他
- この商品を含むブログを見る
そして、終いには腰もやってしまうという始末....正月でかなり気分もだらけてしまったので、気合を入れるため早速記事を書きたいと思います。今回は、ブロッキングオペレータ ( Blocking Operator ) とブロッキングしないオペレーター ( Non-Blocking Operator ) について説明します。(各種オペレータを説明する上で、必要かなーと思ったので。あと、チューニングする上でも知っておいたほうがよいです。)
昨年度末に下記の二つ記事を投稿しました。
ryuchan.hatenablog.com
ryuchan.hatenablog.com
結論から言うと、Stream Aggregate がブロッキングしないオペレーター ( Non-Blocking Operator ) で、Hash Aggregate がブロッキングオペレータ ( Blocking Operator )です。
Stream Aggregate は集計に使用するキーが並べかえられているのが前提のオペレータ処理です。Stream Aggregate は下図のように処理されます。少ない単位で処理ができ、次のオペレータに処理を行うことができるので、リソースの使用効率が非常にいいオペレータです。
※実行プランの Stream Aggregate オペレーターのアイコンがまさに処理内容を表現してますね。

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

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

- OPTION (ORDER GROUP)を付加しない場合

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

- Lazy Spool

はて?なんなんでしょうか?熱心なSpool と怠けた Spool ?
※うう、腰がまだ痛い。

- 出版社/メーカー: 興和新薬
- 発売日: 2009/04/01
- メディア: ヘルスケア&ケア用品
- この商品を含むブログを見る

バンテリンサポーター 腰用 しっかり加圧タイプ ブラック 大きめサイズ 胴囲 80~100cm
- 出版社/メーカー: 興和新薬
- メディア: ヘルスケア&ケア用品
- この商品を含むブログを見る