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

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

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

実行プランの読み方をまとめてみる - その4 ( Stream Aggregrate について説明してみる ) -

 今日から来年 1/3 までお休みです。今日は家でまったりです。いい天気ですねー♪
f:id:koogucc11:20151229102105j:plain

 東京も初霜、初氷、やっとで冬になったという感じですね。しかし、年明けから徐々に春な感じになりそうです。
f:id:koogucc11:20151229120135p:plain
 
 今回は、Stream aggregrate を取り上げたいと思います。下図のようなオペレーターです。
f:id:koogucc11:20151229103438p:plain

 まず下記のクエリを SQL Server Management Studio で実行しましょう。(実行プランも表示するようにしてください。)

SELECT
    SalesPersonID,
    COUNT(SalesPersonID)
FROM
    Sales.SalesOrderHeader
GROUP BY
    SalesPersonID

f:id:koogucc11:20151229104049p:plain
f:id:koogucc11:20151229104954p:plain

 Aggregrate(アグリゲート) は、その意味の通り集計です。Stream Aggregrate は、GROUP BY に指定するキーでデータがソートされている場合に発生します。今回のクエリでは、下図のように動作します。

  • 対象データを IX_SalesOrderHeader_SalesPersonID をインデックススキャンし、SalesPersonID で並び替えられた状態でデータを取得します。
    f:id:koogucc11:20151229111742p:plain
    f:id:koogucc11:20151229112536p:plain
  • 取得したデータを SalesPersonID 単位 ( Group By )に COUNT していきます。どのようなデータを返すかは、Output List を見れば判断できます。SalesPersonID と Expr1005 です。Expr1005 は定義済の値を参照することでどのようなことをしているのか判断できます。
    [Expr1005] = Scalar Operator(COUNT([AdventureWorks2016CTP3].[Sales].[SalesOrderHeader].[SalesPersonID]))
    上記の通り、SalesPersonID をカウントしたものを値に格納していることがわかります。
    f:id:koogucc11:20151229103438p:plain
    f:id:koogucc11:20151229112943p:plain
    f:id:koogucc11:20151229114403p:plain
  • 集計したデータを型変換し、結果を返します。どのようなデータを返すかは、Output List を見れば判断できます。SalesPersonID と Expr1002 です。どのように型変換を行っているかは、定義済の値を参照することで判断できます。
    [Expr1002] = Scalar Operator(CONVERT_IMPLICIT(int,[Expr1005],0))
    上記の通り、COUNT した値(Expr1005)を int 型に変換していることが判断できます。
    f:id:koogucc11:20151229113242p:plain
    f:id:koogucc11:20151229113246p:plain
    f:id:koogucc11:20151229114524p:plain

 今年は、記事の投稿はあと一つ。

※携帯保証使って、携帯新しくなったのでケースも新調したいなぁ。