SQL Serverのプロセス全体像~リレーショナルエンジンの動作~
引用元
https://gyazo.com/53671da65807b29e83d83d54d3176b56
It s not enough to be familiar with hardware spec to improve the database server performance, because it is just one percepective. The procedures tell us the story as it works. Let s get down on the big picture of processes.
サーバーレベルのプロセス全貌に加えて, Relational Engineに閉じたQuery処理も記載. キーとなるのがOptimizerと最適化(Query評価)のための統計上になる. 統計情報は実際のデータベース, table内のデータの①分布と②密度から生成される.
--.icon
処理全体プロセス ~DBサーバー(Oracle9i R2 SE)を例に~
https://gyazo.com/a3321b6c58cfa953993628006d8009c1, https://gyazo.com/0cd7d663b50da20785ce3256aa61c3ce, https://gyazo.com/e77710f50c259949f8e5a6f01cf6bcf9
SQL Serverがクエリ受信してから, 実際にデータアクセスまでに責任を持つのがRelational Engine
Relational Engineは, 以下3つのコンポーネントから構成される.
①Language Procedure Execution ... クエリ構文解析やクエリのパラメータ化
②Query Optimization ... クエリの最適化
③Query Execution ... クエリ実行のためのメモリなどのリソース確保と実行
https://gyazo.com/843d16d75dbf9876d273564fffd46a4d
クエリのライフサイクル
Queryを受信してから実行するまでのRelation Engine内の動作.
https://gyazo.com/5efab889e449bb0ffe001ea4571deaf2
クエリ実行プランを決定するOptimization
Optimizerは, 大きく分けて8つのプロセスに分けられる. 単純化すると, Queryの単純化と正規化, 統計情報の取得と作成, Query実行プランの複数作成, コストを元にプランの考慮, 物理Queryの作成.
なお, Optimizerは「最適」なQuery実行プランを生成するのではなくて, 「制限時間内」に実行可能な, 妥当な実行計画を生成することを目的にしている. 実行プランの生成+実行が所要時間であり, Plan生成に時間をかけて所要時間を長くしても意味がない.
Queryの評価の際にはCostという概念が考慮される. 当Costとは統計情報を元に算出され, 要はQuery実行時にスキャンされるデータの量を示す. 具体的には, ①データ分布( histogram ), ②データ密度( density )の項目が利用される. 密度とは, 列におけるデータの一意性, 重複程度である. histogramは, データの分布状況, 列内データ間の分布と, グループ間の距離である. Densityは低いほど, 一意性をもつデータの含有率が上がるので探索効率は高い. histogramは, 分布が範囲が狭いほど, 距離が近いので探索性は高い(と推測される??).
統計情報を確認してみよう
DBCC SHOW_STATICS(table_name, 統計情報名)
Make use of it??