--最近我们的K3账套运行速度很慢,所以在性能上做了一些研究,现在K3的速度快多了,呵呵
--希望这些资料对大家有帮助!!!其实这些SQL高级应用,大家都可以研究一下的!!!
--下面的资料请大家在 SQL 的查询分析器中,直接调试就明白了,我已经调度成功了!
--如果想了解更多这方面的知识的话,请给我留言,我会上传更多更适用的资料!!!
--你的朋友:诗欢
-- 统计信息
-- Microsoft® SQL Server™ 2000 允许创建有关值在列中的分布情况的统计信息。该统计信息可供查询处理器用来确定最佳的查询评估策略。
-- 在创建索引时,SQL Server 会自动存储有关值在索引列中的分布情况的统计信息。SQL Server 中的查询优化器使用这些统计信息估算使用该索引进行查询的成本。
-- 另外,当 AUTO_CREATE_STATISTICS 数据库选项设置为 ON(默认值)时,SQL Server 自动为没有列索引用于谓词的列创建统计信息。
--
-- 随着列中数据的更改,索引和列的统计信息可能会过时,导致查询优化器选择的查询处理方法不是最佳的。
-- 例如,如果创建一个包含一个索引列和 1,000 行数据的表,每一行在索引列中的值都是唯一的,则查询优化器将把该索引列视为搜集查询数据的好方法。
-- 如果更新列中的数据,因而有很多重复值,则该列对于查询不再是理想的候选列。
-- 然而,查询优化器仍然根据索引的过时分发统计信息(这些信息基于的是更新前的数据),将该列看作是一个好的候选列。
--
--
--
-- 说明 在使用 SQL 查询分析器以图形方式显示查询的执行计划时,过时或丢失的统计信息将予以警告显示(表名用红色文字显示)。
-- 有关更多信息,请参见使用 SQL 查询分析器以图形方式显示执行计划。
-- 另外,使用 SQL 事件探查器监视 Missing Column Statistics 事件类可以指示何时缺少统计信息。有关更多信息,请参见错误和警告事件分类。
--
--
-- 因此,随着表中的数据发生变化,SQL Server 会自动定期更新这些统计信息。采样是在各个数据页上随机进行的,
-- 取自表或统计信息所需的列上的最小非聚集索引。从磁盘读取一个数据页后,该数据页上的所有行都被用来更新统计信息。
-- 统计信息更新的频率取决于列或索引中的数据量以及数据更改量。例如,对于一个包含 10,000 行的表,当 1,000 个索引值发生更改时,
-- 该表的统计信息便可能需要更新,因为 1,000 个值可能在该表中占有很大的比例。而对于包含 10,000,000 个索引条目的表来说,
-- 有 1,000 个索引值发生更改的意义要小得多,因此统计信息便可能不会自动更新。但是,SQL Server 总是确保至少对若干行进行采样;
-- 对小于 8 兆字节 (MB) 的表搜集统计信息时,总是进行完全扫描。
--
-- 通过进行数据采样而不是分析所有数据,可以极大地减少这种统计信息的自动更新所带来的成本。
-- 在某些情况下,统计采样无法获得表中数据的精确特征。可以使用 UPDATE STATISTICS 语句的 SAMPLE 和 FULLSCAN 子句,
-- 控制在逐个表手工更新统计信息时采样的数据量。FULLSCAN 子句指定搜集信息时扫描表中所有数据,而 SAMPLE 子句可用来指定采样的行数百分比或采样的行数。
--
-- 也可以用下列方式告知 SQL Server 不必维护给定列或索引上的统计信息:
--********************************************************************************************************
sp_helpindex t_icitem --查询索引信息
DBCC SHOW_STATISTICS (t_icitem,PK_ICItem) --查询物料表的 PK_ICItem索引的 分布统计信息
-- 发现 Rows 122859 而 Rows Sampled 是 62546 正常情总下这两个值应该是一样的,不一样说明不正常!!!
-- 所以我们要 对 PK_ICItem 统计组(集合)有关键值分发的信息进行更新
update statistics t_icitem PK_ICItem --仅更新单一索引的统计,没什么效果的
--更新表 t_icitem 中的 PK_ICItem 统计组(集合),强制对表 t_icitem 中的所有行进行完全扫描
--当为较大的表或视图收集统计时,指定要采样的表或索引视图的百分比或行数
update statistics t_icitem PK_ICItem WITH SAMPLE 100 PERCENT --OK!!!!
--更新表 t_icitem 中的 PK_ICItem 统计组(集合),强制对表 t_icitem 中的所有行进行完全扫描,并且关闭该统计组(集合)的自动统计更新
--update statistics t_icitem PK_ICItem WITH SAMPLE 100 PERCENT , NORECOMPUTE
--更新统计信息之后,再查询一下,发现 Rows 和 Rows Sampled 这两个值一样的 正常 ,说明更新成功了!!!
DBCC SHOW_STATISTICS (t_icitem,PK_ICItem) --查询物料表的 PK_ICItem索引的 分布统计信息 --OK!!!!
--********************************************************************************************************
DBCC SHOW_STATISTICS (t_icitem,ICItem_FNumber) --发现 Rows 和 Rows Sampled 这两个值一样的 正常
DBCC SHOW_STATISTICS (t_icitem,ICItem_FShortNumber) ----发现 Rows 和 Rows Sampled 这两个值一样的 正常
--********************************************************************************************************
-- A
. 显示表的所有索引的当前状态
-- 下面的示例显示 authors 表上所有索引的当前统计状态。
EXEC sp_autostats t_icitem
-- B
. 启用表的所有索引的自动统计
-- 下面的示例启用 t_icitem 表的所有索引的自动统计设置。
EXEC sp_autostats t_icitem, 'ON'
-- C
. 禁用特定索引的自动统计
-- 下面的示例禁用 t_icitem 表的 [PK_ICItem] 索引的自动统计设置。
EXEC sp_autostats t_icitem, 'OFF', [PK_ICItem]