到目前为止,我的印象是 SQL Server 中有两种类型的统计对象:
自动创建的统计信息,由 SQL Server 在索引列或单个列上创建以提高性能,以及
user-created statistics,这是用
CREATE STATISTICS
语句手动创建的。
因此,我很惊讶地看到以下查询:
SELECT s.name, s.stats_id, s.auto_created, s.user_created
FROM sys.stats AS s
INNER JOIN sys.stats_columns AS sc ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id
INNER JOIN sys.columns AS c ON sc.object_id = c.object_id AND sc.column_id = c.column_id
INNER JOIN sys.tables AS t ON c.object_id = t.object_id
WHERE t.name = 'mytable'
产生以下结果:
name stats_id auto_created user_created
--------------------------------------------------------------
PK__mytable__7A73B1B8 1 0 0
SomeIndex 2 0 0
SomeIndexedColumn1 3 0 0
SomeIndexedColumn2 4 0 0
SomeIndexedColumn3 5 0 0
SomeColumn 6 0 1
那些既不是 auto_created 也不是 user_created 的统计信息是什么?我查看了 sys.stats 的文档,但没有在那里找到答案。
这些是在创建索引时创建的统计信息。
我猜他们以某种方式推断统计数据不是作为统计数据创建的,而是作为索引的副作用创建的。
我之前在我的数据库中注意到了这一点,它们似乎总是与索引相关。我找不到任何证明这一点的文件。
是的,可以通过 3 种方式创建统计信息:
1) 由于创建索引而创建的统计信息。这些统计信息具有索引名称
2)优化器创建的统计信息(列统计信息)。以WA *开头
3) 由 DBA 使用 CREATE STATISTICS 命令创建的用户定义统计信息
参考:https ://harshdba.wordpress.com/category/sql-server-statistics/