<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

    淺談SQL Server中統(tǒng)計(jì)對(duì)于查詢的影響

      簡介

      SQL Server查詢分析器是基于開銷的。通常來講,查詢分析器會(huì)根據(jù)謂詞來確定該如何選擇高效的查詢路線,比如該選擇哪個(gè)索引。而每次查詢分析器尋找路徑時(shí),并不會(huì)每一次都去統(tǒng)計(jì)索引中包含的行數(shù),值的范圍等,而是根據(jù)一定條件創(chuàng)建和更新這些信息后保存到數(shù)據(jù)庫中,這也就是所謂的統(tǒng)計(jì)信息。

      如何查看統(tǒng)計(jì)信息

      查看SQL Server的統(tǒng)計(jì)信息非常簡單,使用如下指令:

      DBCC SHOW_STATISTICS('表名','索引名')

      所得到的結(jié)果如圖1所示。

    圖1.統(tǒng)計(jì)信息

      統(tǒng)計(jì)信息如何影響查詢

      下面我們通過一個(gè)簡單的例子來看統(tǒng)計(jì)信息是如何影響查詢分析器。我建立一個(gè)測試表,有兩個(gè)INT值的列,其中id為自增,ref上建立非聚集索引,插入100條數(shù)據(jù),從1到100,再插入9900條等于100的數(shù)據(jù)。圖1中的統(tǒng)計(jì)信息就是示例數(shù)據(jù)的統(tǒng)計(jì)信息。

      此時(shí),我where后使用ref值作為查詢條件,但是給定不同的值,我們可以看出根據(jù)統(tǒng)計(jì)信息,查詢分析器做出了不同的選擇,如圖2所示。

    圖2.根據(jù)不同的謂詞,查詢優(yōu)化器做了不同的選擇

      其實(shí),對(duì)于查詢分析器來說,柱狀圖對(duì)于直接可以確定的謂詞非常管用,這些謂詞比如:

      where date = getdate()
      where id= 12345
      where monthly_sales < 10000 / 12
      where name like “Careyson” + “%”

      但是對(duì)于比如

      where price = @vari
      where total_sales > (select sum(qty) from sales)
      where a.id =b.ref_id
      where col1 =1 and col2=2

      這類在運(yùn)行時(shí)才能知道值的查詢,采樣步長就明顯不是那么好用了。另外,上面第四行如果謂詞是兩個(gè)查詢條件,使用采樣步長也并不好用。因?yàn)闊o論索引有多少列,采樣步長僅僅存儲(chǔ)索引的第一列。當(dāng)柱狀圖不再好用時(shí),SQL Server使用密度來確定最佳的查詢路線。

      密度的公式是:1/表中唯一值的個(gè)數(shù)。當(dāng)密度越小時(shí),索引越容易被選中。比如圖1中的第二個(gè)表,我們可以通過如下公式來計(jì)算一下密度:

    圖3.某一列的密度

      根據(jù)公式可以推斷,當(dāng)表中的數(shù)據(jù)量逐漸增大時(shí),密度會(huì)越來越小。

      對(duì)于那些不能根據(jù)采樣步長做出選擇的查詢,查詢分析器使用密度來估計(jì)行數(shù),這個(gè)公式為:估計(jì)的行數(shù)=表中的行數(shù)*密度

      那么,根據(jù)這個(gè)公式,如果我做查詢時(shí),估計(jì)的行數(shù)就會(huì)為如圖4所示的數(shù)字。

    圖4.估計(jì)的行數(shù)

      我們來驗(yàn)證一下這個(gè)結(jié)論,如圖5所示。

    圖5.估計(jì)的行數(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重要的工作之一。










    posted on 2012-06-27 09:55 順其自然EVO 閱讀(193) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

    <2012年6月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 一级毛片aa高清免费观看| 国产黄色片在线免费观看| A毛片毛片看免费| 亚洲sm另类一区二区三区| 亚洲视频在线观看免费| 中文字幕中韩乱码亚洲大片| 国产裸模视频免费区无码| 一本岛高清v不卡免费一三区| 久久青草免费91线频观看不卡 | 91禁漫免费进入| 国产精品免费大片一区二区| 国产成人精品久久亚洲高清不卡| 亚洲a级在线观看| 亚洲欧洲视频在线观看| 亚洲人成在线观看| 亚洲va在线va天堂va888www| 国产成人A亚洲精V品无码| 亚洲精品视频在线看| 免费中文字幕在线观看| 国产精品国产午夜免费福利看 | 亚洲av无码片vr一区二区三区| 国产精品亚洲片夜色在线| 亚洲视频网站在线观看| 亚洲精品资源在线| 亚洲成A∨人片在线观看无码| 亚洲狠狠久久综合一区77777| 亚洲VA中文字幕无码毛片| 亚洲av无码乱码国产精品fc2| 久久精品国产亚洲麻豆| 国产亚洲av片在线观看播放| 国产亚洲精久久久久久无码| 亚洲成Av人片乱码色午夜| 亚洲s色大片在线观看| 亚洲精品免费在线观看| 亚洲一二成人精品区| 久久久久亚洲AV无码专区首JN| 亚洲人成电影在在线观看网色| 精品亚洲成a人片在线观看少妇| 亚洲高清免费在线观看| 亚洲国产精品日韩在线| 亚洲乱亚洲乱妇无码|