密度的公式是:1/表中唯一值的個(gè)數(shù)。當(dāng)密度越小時(shí),索引越容易被選中。比如圖1中的第二個(gè)表,我們可以通過如下公式來計(jì)算一下密度:
對(duì)于那些不能根據(jù)采樣步長做出選擇的查詢,查詢分析器使用密度來估計(jì)行數(shù),這個(gè)公式為:估計(jì)的行數(shù)=表中的行數(shù)*密度
因此,可以看出,估計(jì)的行數(shù)是和實(shí)際的行數(shù)有出入的,當(dāng)數(shù)據(jù)分布均勻時(shí),或者數(shù)據(jù)量大時(shí),這個(gè)誤差將會(huì)變的非常小。
統(tǒng)計(jì)信息的更新
由上面的例子可以看到,查詢分析器由于依賴于統(tǒng)計(jì)信息進(jìn)行查詢,那么過時(shí)的統(tǒng)計(jì)信息則可能導(dǎo)致低效率的查詢。統(tǒng)計(jì)信息既可以由SQL Server來進(jìn)行管理,也可以手動(dòng)進(jìn)行更新,也可以由SQL Server管理更新時(shí)手動(dòng)更新。
當(dāng)開啟了自動(dòng)更新后,SQL Server監(jiān)控表中的數(shù)據(jù)更改,當(dāng)達(dá)到臨界值時(shí)則會(huì)自動(dòng)更新數(shù)據(jù)。這個(gè)標(biāo)準(zhǔn)是:
● 向空表插入數(shù)據(jù)時(shí)
● 少于500行的表增加500行或者更多
● 當(dāng)表中行多于500行時(shí),數(shù)據(jù)的變化量大于20%時(shí)
上述條件的滿足均會(huì)導(dǎo)致統(tǒng)計(jì)被更新。
當(dāng)然,我們也可以使用如下語句手動(dòng)更新統(tǒng)計(jì)信息。
UPDATE STATISTICS 表名[索引名]
列級(jí)統(tǒng)計(jì)信息
SQL Server還可以針對(duì)不屬于任何索引的列創(chuàng)建統(tǒng)計(jì)信息來幫助查詢分析器獲取”估計(jì)的行數(shù)“.當(dāng)我們開啟數(shù)據(jù)庫級(jí)別的選項(xiàng)“自動(dòng)創(chuàng)建統(tǒng)計(jì)信息”如圖6所示。

圖6.自動(dòng)創(chuàng)建統(tǒng)計(jì)信息
當(dāng)這個(gè)選項(xiàng)設(shè)置為True時(shí),當(dāng)我們where謂詞指定了不在任何索引上的列時(shí),列的統(tǒng)計(jì)信息會(huì)被創(chuàng)建,但是會(huì)有以下兩種情況例外:
● 創(chuàng)建統(tǒng)計(jì)信息的成本超過生成查詢計(jì)劃的成本
● 當(dāng)SQL Server忙時(shí)不會(huì)自動(dòng)生成統(tǒng)計(jì)信息
我們可以通過系統(tǒng)視圖sys.stats來查看這些統(tǒng)計(jì)信息,如圖7所示。

圖7.通過系統(tǒng)視圖查看統(tǒng)計(jì)信息
當(dāng)然,也可以通過如下語句手動(dòng)創(chuàng)建統(tǒng)計(jì)信息:
CREATE STATISTICS 統(tǒng)計(jì)名稱 ON 表名(列名 [,...n])
總結(jié)
本文簡單談了統(tǒng)計(jì)信息對(duì)于查詢路徑選擇的影響。過時(shí)的統(tǒng)計(jì)信息很容易造成查詢性能的降低。因此,定期更新統(tǒng)計(jì)信息是DBA重要的工作之一。