SQL Server 的 Statistics 簡介
當你要清空「資料表(table)」,或倒入大量「資料(data;record)」,或公司「資料庫(database)」改用新版本要資料大搬家…等情形,不只是要重建「索引(index)」,還應要重建或更新「統計(statistics)」。「統計」的正確與否,直接牽動 SQL Server 的「效能(performance)」。沒有「統計」固然不好,「統計」若過時,會讓最佳化程式做出錯誤的決定則更糟。
SQL Server 的查詢最佳化程式,會用索引的「統計」,來獲得它所需要的「資訊(information)」,以決定某個索引是否有用處。
如果某個用在搜尋的「欄位(column)」,我們沒有事先為它建立索引,則 SQL Server 會自動為該欄位建立「統計」。自動建立的「統計」會以 _WA_Sys 開頭來命名,如下圖 1。

圖 1
----------------------------------------------------------------------------------------------------------
手動更新「統計」:
透過 CREATE STATISTICS 指令,可針對未建立索引的欄位,直接產生「統計」資訊,也可透過 sp_createstats 系統「預存程序(stored procedure)」,直接將某個資料庫內的「所有」資料表,全部的欄位都建立「統計」資訊。
http://msdn.microsoft.com/zh-tw/library/ms188038.aspx
http://msdn.microsoft.com/zh-tw/library/ms186834.aspx
(hyperlink 若無法連結,可將 zh-tw 改為 zh-cn 再重試)
執行 UPDATE STATISTICS 指令,可要求某個資料表,或是直接指定索引或「統計」來做更新,而 sp_updatestats 系統預存程序,可針對特定資料表,把所有相關的統計進行更新。
http://msdn.microsoft.com/zh-tw/library/hh510198.aspx
http://msdn.microsoft.com/zh-tw/library/ms187348.aspx
http://msdn.microsoft.com/zh-tw/library/ms173804.aspx
一般來說,我們會依靠「自動更新統計」,但有些特殊情況下,可能會希望立即「手動」更新「統計」,例如 :
* 該資料庫的用途為「資料倉儲(data warehouse)」,平常不會有個別的資料更新,僅有批次更新。在批次更新完資料後,需要立即執行統計的更新。
* 索引中的鍵值,有大量的新增、修改或刪除,而你又確定接下來的運作,會立刻用到索引。
* 透過 TRUNCATE TABLE 清空某個資料表後,重新輸入或倒入資料,也就是資料內容已經完全不同了,但你又需要立即「存取(access)」該資料表。
----------------------------------------------------------------------------------------------------------
自動更新「統計」:
可透過圖形管理介面,在「資料庫屬性」視窗中,切到「選項」頁籤,如下圖 2。

圖 2
-----------------------------------------------------------------------------------------------------------
透過圖形介面的「統計」資料,看是否有 _WA_Sys 開頭來命名的「統計」,也可看出有哪些欄位,曾被應用程式用來搜尋,卻沒有事先建立可用的相關索引。
-----------------------------------------------------------------------------------------------------------
用指令瞭解「統計」資料 DBCC SHOW_STATISTICS(資料表名稱, 索引名稱或欄位名稱)
http://msdn.microsoft.com/zh-tw/library/ms174384.aspx
Density(密度),越低越好,較低的索引密度,表示此索引較具「辨識度」。當密度越接近 1,代表此索引越不具辨識度,查詢最佳化工具也就越不願意使用此索引。也代表此索引的存在,對查詢沒幫助,只會影響寫入資料的效能。
有關介紹「統計」的書籍,一些有介紹「資料庫效能」的書籍,多半都會提到。但以章立民先生,在 2008 年寫的下列這本書「SQL Server 2005 效能調校經典」(繁體中文),內容最完整和詳細,對於上圖 2 裡的「自動 非同步(asynchronous)更新統計資料」,此書也有詳細的解釋。但此書因年代久遠,在台灣已絕版 :
http://www.tenlong.com.tw/items/986181339X?item_id=37625
SQL Server 2005 效能調校經典 (Microsoft SQL Server 2005 Unleashed)
ISBN: 986181339X
ISBN-13: 9789861813394
-----------------------------------------------------------------------------------------------------------
SQL Server 的 Statistics 簡介的更多相关文章
- SQL Server中STATISTICS IO物理读和逻辑读的误区
SQL Server中STATISTICS IO物理读和逻辑读的误区 大家知道,SQL Server中可以利用下面命令查看某个语句读写IO的情况 SET STATISTICS IO ON 那么这个命令 ...
- SQL SERVER - set statistics time on的理解
一.set statistics time on的作用 显示分析.编译和执行各语句所需的毫秒数. 二.语法 SET STATISTICS TIME { ON | OFF } 注释 1.当 SET ST ...
- 怎样获取Windows平台下SQL server性能计数器值
转载自工作伙伴Garrett, Helen "SQL Server Performance Counter captures" Capturing Windows Performa ...
- SQL Server中的SQL语句优化与效率问题
很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...
- SQL SERVER索引
(一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚 ...
- 转:SQL SERVER数据库中实现快速的数据提取和数据分页
探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...
- SQL Server 2008性能故障排查(四)——TempDB
原文:SQL Server 2008性能故障排查(四)--TempDB 接着上一章:I/O TempDB: TempDB是一个全局数据库,存储内部和用户对象还有零食表.对象.在SQLServer操作过 ...
- SQL Server 2008 R2 性能计数器详细列表(五)
原文:SQL Server 2008 R2 性能计数器详细列表(五) SQL Server:SQL Statistics 对象: 监视编译和发送到 SQL Server 实例的请求类型 SQL Ser ...
- SQL Server 2008 R2 性能计数器详细列表(三)
原文:SQL Server 2008 R2 性能计数器详细列表(三) SQL Server,Deprecated Features 对象: 监视指定为不推荐使用的功能: SQL Server Depr ...
随机推荐
- SSH框架整合(全注解)
全部jar包 目录结构 配置案例 package cn.yzu.Tbook.action; import javax.annotation.Resource; import org.apach ...
- JS(去掉前后空格或去掉所有空格)的用法
1. 去掉字符串前后所有空格: 代码如下: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } 说明 ...
- Greenplum安装
最近需要安装Greenplum测试一些东西,在安装过程中出现了许多问题,所以在这里将安装过程整理一下,主要参考<Greenplum企业应用实践>和http://jxzhfei.blog.5 ...
- MYSQL 按照字母排序查询
select id vKey, name vValue from ib_brand order by convert(name USING gbk) COLLATE gbk_chinese_ci a ...
- 【转】查询oracle比较慢的session和sql
-查询最慢的sql select * from ( select parsing_user_id,executions,sorts command_type,disk_reads,sql_text f ...
- div内文字超出换行问题
1.强制换行: div的样式加上: word-wrap:break-word;word-break:break-all; 2.在文字中间加入建议换行标志<wbr>可以每隔几个字符加一个,
- javaWeb高级编程(1)
十月 24, 2016 10:41:43 上午 org.apache.catalina.core.StandardContext setPath警告: A context path must eith ...
- __autoload()尝试加载未定义的类
在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可.PHP5 以后提供了这样一个方法可以自动完成加载所需的类文件. 参见官网的例子: ./myClass. ...
- NotificationCenter接收不到通知的原因
今天在项目中遇到一个奇葩的事情,我在一个类中明明写了: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #00af ...
- OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序
1.先把OC的类分清楚各有什么方法 普通类的方法 init initialize: 控制器类的方法 init initialize: initWithCoder: UI控件类的方法 init init ...