読者です 読者をやめる 読者になる 読者になる

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

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

実行プランの読み方をまとめてみる - その8 ( 全部一気に取得してしまって後続のオペレーターを待たしてしまう Eager Spool と要求されたら、データを取得し後続の処理にすぐ渡しちゃう Lazy Spool の二つの Spool オペレーターを説明してみる ) -

 新年度になりました。気持ちも新たに頑張ります。旧年度の最後の記事はいまいちな内容の記事で終わってしまいました。
ryuchan.hatenablog.com

 前回の『実行プランの読み方をまとめてみる』では、ブロッキングとノンブロッキングオペレータについて説明しました。
ryuchan.hatenablog.com

 『実行プランの読み方をまとめてみる』シリーズは、今回で『その8』になります。その1から是非みてください。
ryuchan.hatenablog.com
ryuchan.hatenablog.com
ryuchan.hatenablog.com
ryuchan.hatenablog.com
ryuchan.hatenablog.com
ryuchan.hatenablog.com
※特集っぽくやっておきながら、いつもまとまりがない感じになってしまう....

 今回は、Spool 系のオペレータである、Eager と Lazy について説明します。下記のクエリを SQL Server Management Studio で実行させましょう。Eager と Lazy Spool オペレーターを無理矢理発生させることが目的のクエリですので、クエリ自体の意味はあまり深く考えないでくださいwww

SELECT 
    soh1.SubTotal
FROM 
    Sales.SalesOrderHeader soh1
WHERE 
    soh1.SubTotal > ( SELECT
                          AVG(soh2.SubTotal)
                      FROM 
                          Sales.SalesOrderHeader soh2
                      WHERE
                          soh1.DueDate > soh2.DueDate
                     )

f:id:koogucc11:20160401063107p:plain

f:id:koogucc11:20160401063115p:plain

 Eager Spool と Lazy Spool は上図のような感じです、ではまったく理解できないと思うので、説明しますww

  • Eager Spool オペレーター
     Eager Spool は別のオペレータ (今回実行したクエリの実行プランでは、『Cluster Index Scan』) から受け取ったデータをすべて TempDB に格納します。一気にすべてのデータを TempDB に書きこむ"熱心"にお仕事してしまうオペレータなので、後続のオペレータ(今回実行したクエリの実行プランでは、『Stream Aggregate』)はその処理に待たされてしまいます。Eager Spool はいわゆるブロッキングオペレーターです。下図で Eager Spool の動きが確認できます。
    f:id:koogucc11:20160401062320g:plain
  • Lazy Spool オペレーター
     Lazy Spool はそれぞれのデータが必要になったときに読み込み、TempDB に書きこみます。書きこんだら後続のオペレーターに即座にデータを提供します。Lazy Spool は ノンブロッキングオペレーターです。下図は Lazy Spool の動きが確認できます。
    f:id:koogucc11:20160401062140g:plain

※この動画は Office Mix でキャプチャーしました。Office Mix に知りたい方は下記の記事を参考にしてください。かっこいいプレゼン資料を作成するにはもってこいのツールです。
ryuchan.hatenablog.com

 Eager Spool は TempDB を頻用するため、IO の観点からみて OLTP 系のシステムにおいて可能ならば排除すべきオペレーターなのかもしれません。TempDB の領域が フラッシュストレージであれば、大問題にならなそうですが....

 さて、次は何を書こうかな。

 お、プライム会員だし見てみよ。本日(4月1日)配信です。

Amazon プライム・ビデオによると、

※これ、Amazon だから仮面ライダーアマゾンなの?(笑)

 そういえば、仮面ライダー1号って、

仮面ライダー1号ぴあ (ぴあMOOK)

仮面ライダー1号ぴあ (ぴあMOOK)

 映画になりましたね。自分が見に行きたかったので、子供に『一緒に見に行こう♪』って言ったら、『興味ない。』と一蹴されました....
www.superhero-movie.com

 一人で見に行くには、少し勇気がいる...何事にも勇気がいる...

彼女はなぜ成功したのか―転職、再就職、起業 少しの勇気と努力で未来は拓ける!

彼女はなぜ成功したのか―転職、再就職、起業 少しの勇気と努力で未来は拓ける!