以下是官方的对统计信息的描述:
按照默认设置,如果表中的某列没有索引,则SQL Server会自动为该列创建统计。然后,查询优化器评估该列中数据分布范围的统计信息,以选择一个更为有效的查询处理方案。分辨自动创建的统计很简单,在SQL Server 7.0和SQL Server 2000中,自动创建的统计的前缀为_WA_Sys。
个人感想:
以前对_WA_Sys开头的统计信息一直不知道有什么用,在学习了oracle时的CBO和三个算法(嵌套循环,合并连接和hash连接)才发现这个_WA_Sys开头的统计信息和索引的统计信息对我们用户没用,对数据库是很重要的。
运行上面命令以后,出来下列信息:
这里的信息说明:
name:统计信息的名称。 Updated :上一次更新统计信息的日期和时间
Rows :表中的行数。 Rows Sampled :统计信息的抽样行数。
Steps:分发步骤数(在sql server最多200步) Average key length :所有索引列的平均长度
这些信息是对统计信息一个汇总
还有下列信息:
All density :索引列前缀集的选择性(频繁) Average Length :索引列前缀集的平均长度。 Columns:索引列前缀的名称
还有包括数据统计的直方图信息:
1, index建立后,优化器是否使用该index,优化器需要借助一些统计信息来做判断
2,根据统计信息,预估采用嵌套循环连接,合并连接, 哈希连接等哪一个连接
3,根据统计信息判断表的估计最佳的成本(最佳的执行顺序),
1,建立索引后,就会出现一个同名的统计信息
2,一个列没有统计信息,这时用他来关联表和查询数据,这时,系统会在评估最佳查询计划前,生成一个该列的"_WA_Sys"的统计信息。
如下图:这里就包含(索引统计信息和列的统计信息)
统计信息的更新和维护,由于数据的经常改变,统计信息是由sql server 2005自动维护的。可以手工更新统计信息:
更新表的统计信息,采集表中该列的全部数据。一般建议采用全部数据采集。保证统计信息的正确性
系统是如何来设置更新和创建统计信息的?
原来在创建数据库时,系统自动设置了统计信息的属性。这两个属性一般不要手工改动。
-------------------------------------------------------------------------------------------------------------
---查询索引操作的信息
select * from sys.dm_db_index_usage_stats
--查询指定表的统计信息(sys.stats和sysobjects联合查询)
select
o.name,--表名
s.name,--统计信息的名称
auto_created,--统计信息是否由查询处理器自动创建
user_created--统计信息是否由用户显示创建
from
sys.stats
inner join
sysobjects o
on
s.object_id=o.id
where
o.name='表名'
go
--查看统计信息中列的信息
select
o.name,--表名
s.name,--统计信息的名称
sc.stats_column_id,
c.name---列名
from
sys.stats_columns sc
inner join
sysobjects o
on
sc.object_id=o.id
inner join
sys.stats s
on
sc.stats_id=s.stats_id and sc.object_id=s.object_id
inner join
sys.columns c
on
sc.column_id=c.column_id and sc.object_id=c.object_id
where
o.name='表名'
--查看统计信息的明细信息
dbcc show_statistics
--查看索引自动创建的统计信息
exec sp_autostats '对象名'
--关闭自动生成统计信息的数据库选项
alter datebase 数据库名 set auto_create_statistics off
--创建统计信息
create statistics 统计信息名称 on 表名(列名)
[with
[[fullscan
sample number{percent|rows}]
[norecompute]
]
go
解释一下上面的参数:
fullscan:指定对表或视图中所有的行收集统计信息
sample number{percent|rows}:指定随机抽样应读取的数据行数或者百分比 sample选项不能与fullscan选项同时使用
norecompute:指定数据库引擎不自动重新计算统计信息
--计算随机抽样统计信息
create statistics 统计信息名称 on 表名(列名)
with sample 5 percent---创建统计信息,按5%计算随机抽样统计信息
go
--创建统计信息
exec sp_createstats--参数自己去查下帮助,在这里不一一列举
--修改统计信息
update statistics 表名|视图名
索引名|统计信息名,索引名|统计信息名,.....
[with
[[fullscan
sample number{percent|rows}]
[norecompute]
]
---参数与create statistics 语句相似,下面介绍几种常用应用
1.更新指定表的所有统计信息
update statistics 表名
2.更新指定表的单个索引的统计信息
update statistics 表名 索引名
3.对表进行全面扫描,更新统计信息
update statistics 表名(列名) with fullscan