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);
ด้วยเหตุนี้จึงมีการสร้างสถิติสองรายการในดัชนีสองรายการที่เรามี:
สถิติสำหรับ 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 |
+--------------+------------+---------+---------------------+----------------+
(ฉันเติมข้อมูลตารางด้วยข้อมูลตัวอย่างแบบสุ่มโดยที่ประมาณหนึ่งในสิบของแถวไม่ถูกเก็บถาวรฉันรันการอัพเดตสถิติการสแกนแบบเต็มหลังจากนั้น)
ทำไมฮิสโตแกรมของสถิติสองคอลัมน์จึงใช้เพียงหนึ่งคอลัมน์เท่านั้น ฉันรู้ว่าหลายคนเขียนเกี่ยวกับสิ่งนี้แต่เหตุผลคืออะไร ในกรณีนี้มันทำให้ทั้งฮิสโตแกรมมีประโยชน์น้อยกว่ามากเพราะคอลัมน์แรกมีค่าเพียงสองค่าเท่านั้น ทำไมสถิติจะถูก จำกัด โดยพลการเช่นนั้น?
โปรดทราบว่าคำถามนี้ไม่ได้หมายถึงฮิสโตแกรมหลายมิติซึ่งเป็นสัตว์ที่แตกต่างอย่างสิ้นเชิง มันเกี่ยวกับฮิสโทแกรมมิติเดียวโดยมีมิติเดียวคือสิ่งอันดับที่มีหลายคอลัมน์