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

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

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

 年末は飲んだくれるために買いました。プレモル美味しいですよね。

 朝から、一杯やりながら記事を書く...年末ならでは。(なのか?)
f:id:koogucc11:20151230075425j:plain

 前回、Stream Aggregate を説明したので、今回は同じ集計操作である、Hash Aggregrate について説明します。
ryuchan.hatenablog.com

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

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

f:id:koogucc11:20151229140206p:plain
f:id:koogucc11:20151229140212p:plain

 Stream Aggregate 同様、集計操作です。異なるのは、GROUP BY に指定するキーでデータがソートされて "いない" 場合に発生します。前回説明した Stream Aggregate の例では SalesPersonID できちんと並び替えられていることが下図の通り判断できます。
f:id:koogucc11:20151229104049p:plain

 今回のクエリでは、下図のように動作します。

  • 対象データを PK_SalesOrderHeader_SalesOrderID をクラスタインデックススキャンし、並び替えのされてない状態でデータを取得します。
    f:id:koogucc11:20151229172027p:plain
    f:id:koogucc11:20151229172152p:plain
  • 取得したデータは並び替えがされていないため ModifiedDate キー (どの値を Hash テーブルのキーにするかは、プロパティ→ Hash Key Build を参照) にした Hash テーブルをメモリ中に作成し、ModifiedDate の数を COUNT していきます。どのようなデータを返すかは、Output List を見れば判断できます。ModifiedDate と Expr1005 です。Expr1005 は定義済の値を参照することでどのようなことをしているのか判断できます。
    [Expr1005] = Scalar Operator(COUNT(*))
    上記の通り COUNT(*) となっているので、PK_SalesOrderHeader_SalesOrderID でクラスタインデックススキャンになっていることが判断でき、カウントしたものを Expr1005 に格納していることが判断できます。
    f:id:koogucc11:20151229172216p:plain
    f:id:koogucc11:20151229172303p:plain
    f:id:koogucc11:20151229173020p:plain
  • 集計したデータを型変換し、結果を返します。どのようなデータを返すかは、Output List を見れば判断できます。ModifiedDate と Expr1002 です。どのように型変換を行っているかは、定義済の値を参照することで判断できます。
    [Expr1002] = Scalar Operator(CONVERT_IMPLICIT(int,[Expr1005],0))
    上記の通り、COUNT した値(Expr1005)を int 型に変換していることが判断できます。
    f:id:koogucc11:20151229173618p:plain
    f:id:koogucc11:20151229173813p:plain
    f:id:koogucc11:20151229173916p:plain

※申歳のバージョンもありますね。

※本も出ていますね。
なぜザ・プレミアム・モルツは売れ続けるのか? (小学館文庫)

なぜザ・プレミアム・モルツは売れ続けるのか? (小学館文庫)