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

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

統計情報更新の動作を SQL Server Profiler を使って観察してみる

 統計情報の更新についての動作を SQL Server Profiler を使って観察してみましょう。今回は下記の条件下で観察します。
f:id:koogucc11:20161127134704p:plain

f:id:koogucc11:20161127191214p:plain

f:id:koogucc11:20161116051019p:plain

 データベースは、AdventureWorks、テーブルは Production.WorkOrder 統計は PK_WorkOrder_WorkOrderID を使用します。まず下記のクエリを SQL Server Management Studio で実行し、統計情報を更新しましょう。

USE AdventureWorks;  
GO  
UPDATE STATISTICS Production.WorkOrder PK_WorkOrder_WorkOrderID WITH FULLSCAN;  
GO

f:id:koogucc11:20161127135414p:plain

 統計情報更新を促すため、下記のクエリを SQL Server Management Studio で実行しましょう。(多めに更新してます。)

USE AdventureWorks
INSERT INTO
    Production.WorkOrder(ProductID, OrderQty, ScrappedQty, StartDate, EndDate, DueDate, ScrapReasonID, ModifiedDate)
    SELECT
        TOP 50000 ProductID,
        OrderQty,
        ScrappedQty,
        StartDate,
        EndDate,
        DueDate,
        ScrapReasonID,
        ModifiedDate
    FROM
        Production.WorkOrder

f:id:koogucc11:20161127141153p:plain

 SQL Server Profiler を起動して、トレースを取得します。
f:id:koogucc11:20161127141509p:plain

 下記のクエリを SQL Server Management Studio で実行します。

SELECT
    ProductID,
    OrderQty,
    ScrappedQty,
    StartDate,
    EndDate,
    DueDate,
    ScrapReasonID,
    ModifiedDate
FROM
    Production.WorkOrder
WHERE
    WorkOrderID BETWEEN 95000 AND 100000

f:id:koogucc11:20161127190038p:plain

 ここで SQL Server Profiler を参照してみましょう。何やら赤枠部分に出力されていますね。
f:id:koogucc11:20161127190249p:plain

SELECT
    StatMan([SC0])
FROM
    (
        SELECT
            TOP 100 PERCENT [WorkOrderID] AS [SC0]
        FROM
            [Production].[WorkOrder] WITH(READUNCOMMITTED)
        ORDER BY
            [SC0]
    ) AS _MS_UPDSTATS_TBL OPTION(MAXDOP 2)

 統計情報を生成するために実テーブルにアクセスしているクエリです。プログラムが発行するクエリの直前に発行されます。
f:id:koogucc11:20161127194258p:plain

 MAXDOP はサーバ設定値に従います。サーバの MAXDOP を 0 のままにしておくと、MAXDOP 16 でクエリが発行されます。(なぜ 16 なのかは不明です。ハードコーディングだったりww) しかし、これだとテーブルの件数が多いものは自動更新は使用できませんね。統計情報更新の考え方としては下記記事の内容で問題ないんですね。
ryuchan.hatenablog.com

 統計情報の更新はシステム規模に合わせてきちんと設計する必要がありますね。

 高すぎー。128,000 円!!

f:id:koogucc11:20161127193505p:plain