我正在阅读有关统计数据的白皮书,但我无法得到几个问题的答案
- 重现问题的代码
CREATE TABLE stats_update
(
id INT IDENTITY(1, 1) CONSTRAINT PK__stats_up__3213E83FCCAB6EF5 PRIMARY KEY,
name CHAR(20) DEFAULT 'a'
)
--check for stats
EXEC sp_helpstats 'stats_update'
go
--insert two values
INSERT INTO stats_update
DEFAULT VALUES
go 2
--check for stats
EXEC sp_helpstats
'stats_update',
'all'
SELECT *
FROM stats_update
--lets create an index now on name
CREATE INDEX nci_test
ON dbo.stats_update(name)
--check for stats
EXEC sp_helpstats
'stats_update',
'all'
--lets see when we stats last updated
DBCC show_Statistics ('stats_update', 'PK__stats_up__3213E83FCCAB6EF5')
go
--now lets insert some rows
INSERT INTO stats_update
DEFAULT VALUES
go 200
--lets check stats again
--check for stats
exec sp_helpstats 'stats_update', 'all'
DBCC show_Statistics ('stats_update', 'PK__stats_up__3213E83FCCAB6EF5')
SELECT *
FROM sys.stats
WHERE object_id = object_id('stats_update')
go
INSERT INTO stats_update
DEFAULT VALUES
go 2000
SELECT *
FROM stats_update
SELECT *
FROM stats_update
WHERE id = 10
DBCC show_Statistics ('stats_update', 'PK__stats_up__3213E83FCCAB6EF5')
根据评论更新
的问题:
我在上面的脚本的任何阶段都看不到直方图,直方图只有在重建索引或执行更新统计数据后才会填充。可以帮助我理解为什么
答案 0 :(得分:2)
您的问题不是很明确,但您的脚本执行的操作都不需要创建有关id
列的详细统计信息。
您的脚本执行
INSERT INTO stats_update
DEFAULT VALUES; /*Doesn't need column stats on id*/
SELECT *
FROM stats_update /*Table cardinality is stored separately*/
SELECT *
FROM stats_update
WHERE id = 10 /*Unique constraint so can assume 1 row*/
如果您将谓词更改为类似下面的内容,则会创建统计数据。
SELECT *
FROM stats_update
WHERE id > 10