欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

優(yōu)化 SQL Server 索引的小技巧

 更新時(shí)間:2012年08月09日 21:42:36   作者:  
SQL Server中有幾個(gè)可以讓你檢測(cè)、調(diào)整和優(yōu)化SQL Server性能的工具
在本文中,我將說(shuō)明如何用SQL Server的工具來(lái)優(yōu)化數(shù)據(jù)庫(kù)索引的使用,本文還涉及到有關(guān)索引的一般性知識(shí)。
  
  關(guān)于索引的常識(shí)
  
  影響到數(shù)據(jù)庫(kù)性能的最大因素就是索引。由于該問(wèn)題的復(fù)雜性,我只可能簡(jiǎn)單的談?wù)勥@個(gè)問(wèn)題,不過(guò)關(guān)于這方面的問(wèn)題,目前有好幾本不錯(cuò)的書籍可供你參閱。我在這里只討論兩種SQL Server索引,即clustered索引和nonclustered索引。當(dāng)考察建立什么類型的索引時(shí),你應(yīng)當(dāng)考慮數(shù)據(jù)類型和保存這些數(shù)據(jù)的column。同樣,你也必須考慮數(shù)據(jù)庫(kù)可能用到的查詢類型以及使用的最為頻繁的查詢類型。
  
  索引的類型

  如果column保存了高度相關(guān)的數(shù)據(jù),并且常常被順序訪問(wèn)時(shí),最好使用clustered索引,這是因?yàn)槿绻褂胏lustered索引,SQL Server會(huì)在物理上按升序(默認(rèn))或者降序重排數(shù)據(jù)列,這樣就可以迅速的找到被查詢的數(shù)據(jù)。同樣,在搜尋控制在一定范圍內(nèi)的情況下,對(duì)這些column也最好使用clustered索引。這是因?yàn)橛捎谖锢砩现嘏艛?shù)據(jù),每個(gè)表格上只有一個(gè)clustered索引。
  
  與上面情況相反,如果columns包含的數(shù)據(jù)相關(guān)性較差,你可以使用nonculstered索引。你可以在一個(gè)表格中使用高達(dá)249個(gè)nonclustered索引——盡管我想象不出實(shí)際應(yīng)用場(chǎng)合會(huì)用的上這么多索引。
  
  當(dāng)表格使用主關(guān)鍵字(primary keys),默認(rèn)情況下SQL Server會(huì)自動(dòng)對(duì)包含該關(guān)鍵字的column(s)建立一個(gè)獨(dú)有的cluster索引。很顯然,對(duì)這些column(s)建立獨(dú)有索引意味著主關(guān)鍵字的唯一性。當(dāng)建立外關(guān)鍵字(foreign key)關(guān)系時(shí),如果你打算頻繁使用它,那么在外關(guān)鍵字cloumn上建立nonclustered索引不失為一個(gè)好的方法。如果表格有clustered索引,那么它用一個(gè)鏈表來(lái)維護(hù)數(shù)據(jù)頁(yè)之間的關(guān)系。相反,如果表格沒(méi)有clustered索引,SQL Server將在一個(gè)堆棧中保存數(shù)據(jù)頁(yè)。
  
  數(shù)據(jù)頁(yè)

  當(dāng)索引建立起來(lái)的時(shí)候,SQLServer就建立數(shù)據(jù)頁(yè)(datapage),數(shù)據(jù)頁(yè)是用以加速搜索的指針。當(dāng)索引建立起來(lái)的時(shí)候,其對(duì)應(yīng)的填充因子也即被設(shè)置。設(shè)置填充因子的目的是為了指示該索引中數(shù)據(jù)頁(yè)的百分比。隨著時(shí)間的推移,數(shù)據(jù)庫(kù)的更新會(huì)消耗掉已有的空閑空間,這就會(huì)導(dǎo)致頁(yè)被拆分。頁(yè)拆分的后果是降低了索引的性能,因而使用該索引的查詢會(huì)導(dǎo)致數(shù)據(jù)存儲(chǔ)的支離破碎。當(dāng)建立一個(gè)索引時(shí),該索引的填充因子即被設(shè)置好了,因此填充因子不能動(dòng)態(tài)維護(hù)。
  
  為了更新數(shù)據(jù)頁(yè)中的填充因子,我們可以停止舊有索引并重建索引,并重新設(shè)置填充因子(注意:這將影響到當(dāng)前數(shù)據(jù)庫(kù)的運(yùn)行,在重要場(chǎng)合請(qǐng)謹(jǐn)慎使用)。DBCC INDEXDEFRAG和DBCC DBREINDEX是清除clustered和nonculstered索引碎片的兩個(gè)命令。INDEXDEFRAG是一種在線操作(也就是說(shuō),它不會(huì)阻塞其它表格動(dòng)作,如查詢),而DBREINDEX則在物理上重建索引。在絕大多數(shù)情況下,重建索引可以更好的消除碎片,但是這個(gè)優(yōu)點(diǎn)是以阻塞當(dāng)前發(fā)生在該索引所在表格上其它動(dòng)作為代價(jià)換取來(lái)得。當(dāng)出現(xiàn)較大的碎片索引時(shí),INDEXDEFRAG會(huì)花上一段比較長(zhǎng)的時(shí)間,這是因?yàn)樵撁畹倪\(yùn)行是基于小的交互塊(transactional block)。
  
  填充因子

  當(dāng)你執(zhí)行上述措施中的任何一個(gè),數(shù)據(jù)庫(kù)引擎可以更有效的返回編入索引的數(shù)據(jù)。關(guān)于填充因子(fillfactor)話題已經(jīng)超出了本文的范疇,不過(guò)我還是提醒你需要注意那些打算使用填充因子建立索引的表格。
  
  在執(zhí)行查詢時(shí),SQL Server動(dòng)態(tài)選擇使用哪個(gè)索引。為此,SQL Server根據(jù)每個(gè)索引上分布在該關(guān)鍵字上的統(tǒng)計(jì)量來(lái)決定使用哪個(gè)索引。值得注意的是,經(jīng)過(guò)日常的數(shù)據(jù)庫(kù)活動(dòng)(如插入、刪除和更新表格),SQL Server用到的這些統(tǒng)計(jì)量可能已經(jīng)“過(guò)期”了,需要更新。你可以通過(guò)執(zhí)行DBCC SHOWCONTIG來(lái)查看統(tǒng)計(jì)量的狀態(tài)。當(dāng)你認(rèn)為統(tǒng)計(jì)量已經(jīng)“過(guò)期”時(shí),你可以執(zhí)行該表格的UPDATE STATISTICS命令,這樣SQL Server就刷新了關(guān)于該索引的信息了。
  
  建立數(shù)據(jù)庫(kù)維護(hù)計(jì)劃

  SQL Server提供了一種簡(jiǎn)化并自動(dòng)維護(hù)數(shù)據(jù)庫(kù)的工具。這個(gè)稱之為數(shù)據(jù)庫(kù)維護(hù)計(jì)劃向?qū)В―atabase Maintenance Plan Wizard ,DMPW)的工具也包括了對(duì)索引的優(yōu)化。如果你運(yùn)行這個(gè)向?qū)?,你?huì)看到關(guān)于數(shù)據(jù)庫(kù)中關(guān)于索引的統(tǒng)計(jì)量,這些統(tǒng)計(jì)量作為日志工作并定時(shí)更新,這樣就減輕了手工重建索引所帶來(lái)的工作量。如果你不想自動(dòng)定期刷新索引統(tǒng)計(jì)量,你還可以在DMPW中選擇重新組織數(shù)據(jù)和數(shù)據(jù)頁(yè),這將停止舊有索引并按特定的填充因子重建索引。

相關(guān)文章

  • Sqlserver timestamp數(shù)據(jù)類使用介紹

    Sqlserver timestamp數(shù)據(jù)類使用介紹

    SQL Server timestamp 數(shù)據(jù)類型與時(shí)間和日期無(wú)關(guān)。SQL Server timestamp 是二進(jìn)制數(shù)字,它表明數(shù)據(jù)庫(kù)中數(shù)據(jù)修改發(fā)生的相對(duì)順序。
    2011-08-08
  • SQL Server誤設(shè)置max server memory的處理方法

    SQL Server誤設(shè)置max server memory的處理方法

    這篇文章主要給大家介紹了關(guān)于SQL Server誤設(shè)置max server memory的處理方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL Server具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧下
    2019-12-12
  • SQLSERVER 清除歷史記錄的方法

    SQLSERVER 清除歷史記錄的方法

    使用SQL Server登錄使用數(shù)據(jù)庫(kù)時(shí),登錄過(guò)的記錄會(huì)出現(xiàn)在登錄框中,下面是刪除方法,需要的朋友可以參考下
    2014-08-08
  • SQl Function 創(chuàng)建函數(shù)實(shí)例介紹

    SQl Function 創(chuàng)建函數(shù)實(shí)例介紹

    這篇文章主要介紹了SQl Function 創(chuàng)建函數(shù)實(shí)例介紹,需要的朋友可以參考下
    2016-10-10
  • Sql Server 壓縮數(shù)據(jù)庫(kù)日志文件的方法

    Sql Server 壓縮數(shù)據(jù)庫(kù)日志文件的方法

    Sql Server 日志 _log.ldf文件太大,數(shù)據(jù)庫(kù)文件有500g,日志文件也達(dá)到了500g,占用磁盤空間過(guò)大,且可能影響程序性能,需要壓縮日志文件,下面小編給大家講解下Sql Server 壓縮數(shù)據(jù)庫(kù)日志文件的方法,感興趣的朋友一起看看吧
    2022-11-11
  • 解析Mybatis對(duì)sql表的一對(duì)多查詢問(wèn)題

    解析Mybatis對(duì)sql表的一對(duì)多查詢問(wèn)題

    這篇文章主要介紹了解析Mybatis對(duì)sql表的一對(duì)多查詢,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • SQL 創(chuàng)建、更新和刪除視圖的方法

    SQL 創(chuàng)建、更新和刪除視圖的方法

    這篇文章主要介紹了SQL 如何如何創(chuàng)建、更新和刪除視圖,文中講解非常詳細(xì),示例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • msSQL中having的用處詳解

    msSQL中having的用處詳解

    關(guān)于SQL中的HAVING,相信大家都不陌生,它往往與GROUP?BY配合使用,為聚合操作指定條件,下面這篇文章主要給大家介紹了關(guān)于msSQL中having用處的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • sqlserver中根據(jù)字符分割字符串的最好的寫法分享

    sqlserver中根據(jù)字符分割字符串的最好的寫法分享

    因數(shù)據(jù)庫(kù)中保存的是以,號(hào)分隔的數(shù)據(jù),需要在界面上以表格的方式顯示出來(lái)。特想出以下方法
    2012-05-05
  • mssql關(guān)于一個(gè)表格結(jié)構(gòu)的另外一種顯示(表達(dá)意思不變)

    mssql關(guān)于一個(gè)表格結(jié)構(gòu)的另外一種顯示(表達(dá)意思不變)

    mssql關(guān)于一個(gè)表格結(jié)構(gòu)的另外一種顯示(表達(dá)意思不變)接下來(lái)介紹實(shí)現(xiàn)方法,感興趣的朋友可以了解下哦
    2013-01-01

最新評(píng)論