SQL Serverには「マルチカラム統計」と呼ばれるものがありますが、それが意味するものとは異なります。
次のサンプルテーブルを見てみましょう。
CREATE TABLE BadStatistics
(
IsArchived BIT NOT NULL,
Id INT NOT NULL IDENTITY PRIMARY KEY,
Mystery VARCHAR(200) NOT NULL
);
CREATE NONCLUSTERED INDEX BadIndex
ON BadStatistics (IsArchived, Mystery);
これで、2つの統計が2つのインデックスで作成されています。
BadIndexの統計:
+--------------+----------------+-------------------------+
| All density | Average Length | Columns |
+--------------+----------------+-------------------------+
| 0.5 | 1 | IsArchived |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 37 | IsArchived, Mystery |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 41 | IsArchived, Mystery, Id |
+--------------+----------------+-------------------------+
+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 0 | 0 | 24398 | 0 | 1 |
+--------------+------------+---------+---------------------+----------------+
| 1 | 0 | 216602 | 0 | 1 |
+--------------+------------+---------+---------------------+----------------+
クラスター化インデックスの統計:
+--------------+----------------+---------+
| All density | Average Length | Columns |
+--------------+----------------+---------+
| 4.149378E-06 | 4 | Id |
+--------------+----------------+---------+
+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 1 | 0 | 1 | 0 | 1 |
+--------------+------------+---------+---------------------+----------------+
| 240999 | 240997 | 1 | 240997 | 1 |
+--------------+------------+---------+---------------------+----------------+
| 241000 | 0 | 1 | 0 | 1 |
+--------------+------------+---------+---------------------+----------------+
(私は、約10分の1の行がアーカイブされていないランダムなサンプルデータをテーブルに入力しました。その後、フルスキャン統計の更新を実行しました。)
2列の統計のヒストグラムで1列しか使用されないのはなぜですか?多くの人がそれについて書いていることを知っていますが、その根拠は何ですか?この場合、最初の列には2つの値しかないため、ヒストグラム全体の有用性は低くなります。なぜ統計がそのように恣意的に制限されるのでしょうか?
この質問は、完全に異なる獣である多次元ヒストグラムについて言及していないことに注意してください。これは、1次元のヒストグラムに関するものであり、1次元は、それぞれの複数の列を含むタプルです。