SQL Server 数据库的整理优化的基本过程(二)
SQL Server 數(shù)據(jù)庫的整理優(yōu)化的基本過程(二)
高建剛
第一節(jié) 基本維護(hù)
第二節(jié) 索引
?
索引相信大家都不陌生,而且在因特網(wǎng)上,有了很多關(guān)于如何通過索引來優(yōu)化數(shù)據(jù)庫的文章,在這里,我主要是結(jié)合我的使用情況向大家推薦關(guān)于索引如何來提高和改善數(shù)據(jù)庫性能的。
眾所周知,在數(shù)據(jù)庫的數(shù)據(jù)存儲(chǔ)方面,數(shù)據(jù)是以分頁的形式存儲(chǔ)的,在數(shù)據(jù)量較小的時(shí)候,如果我們不建立索引,那么整體的性能可能不會(huì)受到多大影響,但是如果數(shù)據(jù)量較大,達(dá)到千萬、甚至過億,如果仍然不采用索引,數(shù)據(jù)庫的檢索仍然會(huì)去遍歷所有的頁去找找你想要的那一點(diǎn)點(diǎn)數(shù)據(jù),就會(huì)感覺到簡(jiǎn)單的查詢效率很低,客戶抱怨,前端的程序開發(fā)人員也對(duì)數(shù)據(jù)庫性能不滿意,因此使用索引來提高性能這時(shí)候就顯得特別重要了。
在 SQL Server 中索引的存放是以平衡樹 Balance-Tree(B-Tree) 結(jié)構(gòu)順序存放的,在有效的利用索引時(shí),系統(tǒng)會(huì)根據(jù)建立的索引樹,通過二分查找方式查找符合條件的記錄,同時(shí)建立索引后,索引所占用的硬盤空間也會(huì)比每條數(shù)據(jù)記錄的硬盤空間小一些,所以說無論是查找方式和讀取硬盤的空間都可以達(dá)到提高性能和查詢效率的目的。索引的理解,好比一本書的目錄,讀者可以通過目錄去快速找到自己想看的章節(jié),而目錄在整本書的占用書本頁數(shù)少,結(jié)構(gòu)簡(jiǎn)單,索引也是同樣的道理,這樣可能理解起來就比較容易接受了。
在 SQL Server 中,索引的結(jié)構(gòu)包含三方面,根節(jié)點(diǎn)分頁 (Root Level) ,即索引結(jié)構(gòu)的開始。子葉層 (Leaf Level) ,索引的最下層。非子葉層 (Non-Leaf Level) ,介于子葉層和根節(jié)點(diǎn)之間的結(jié)構(gòu)。
SQL Server 的索引分為聚集索引和非聚集索引兩類 ( 后續(xù)內(nèi)容會(huì)單獨(dú)介紹全文檢索和全文索引 ) 。聚集索引每個(gè)表只能存在一個(gè),它的建立標(biāo)志著數(shù)據(jù)表本身就是索引的一部分,因?yàn)橹付司奂饕?#xff0c;整個(gè)表的數(shù)據(jù)存儲(chǔ)都會(huì)按照用戶建立的聚集索引來擺放,在 SQL Server2000 以后的版本中,聚集索引已經(jīng)可以指定由大到小還是由小到大的順序了 ( 還有分區(qū)、在線等其他特性,在此不累述 ) 。索引建立后會(huì)生成索引結(jié)構(gòu),也就是索引的根節(jié)點(diǎn)和非子葉層級(jí),從而完成整個(gè)聚集索引的整體結(jié)構(gòu)。數(shù)據(jù)表的數(shù)據(jù)的存放只能有一種原則,所以每個(gè)表的索引也就只能有一個(gè)聚集索引了。所以選擇一個(gè)表的字段作為聚集索引時(shí),要慎重。
那么建立聚集索引有什么樣的技巧哪?首先我們強(qiáng)調(diào)一點(diǎn),聚集索引和主鍵是兩碼事,不可混為一談,它們分別是表結(jié)構(gòu)的兩個(gè)重要的機(jī)制,有共同的特性,是數(shù)據(jù)表的重要部分構(gòu)成,但是兩者在應(yīng)用上存在著本質(zhì)的區(qū)別,雖然 SQL Server 在你不指定聚集索引時(shí),會(huì)默認(rèn)為主鍵就是聚集索引,但是仍然要記住聚集索引和主鍵盡量區(qū)分對(duì)待,聚集索引的建立主要是從數(shù)據(jù)的讀取效率來考慮的,比如說人員信息表,設(shè)計(jì)上主鍵一般是人員編號(hào),但是我們?cè)诶萌藛T信息表的時(shí)候,一般都會(huì)以姓名來過濾或排序,所以我們一般把聚集索引建立在姓名的字段上。
既然提到了主鍵,在這里簡(jiǎn)單描述一下主鍵 ( 看好了,說的是主鍵 ) ,主鍵是數(shù)據(jù)庫設(shè)計(jì)的主要部分,它是數(shù)據(jù)正確性和完整性的保證,建立主鍵時(shí)我們應(yīng)該考慮數(shù)據(jù)庫的第三范式的定義和要求,即所有字段內(nèi)容都與主鍵有直接關(guān)聯(lián),而沒有間接關(guān)聯(lián),同時(shí)主鍵也是用來唯一定義表數(shù)據(jù)的單一記錄,選擇主鍵時(shí),要堅(jiān)持唯一、最小、不可為 NULL 、易獲取、基本不變更等條件。
再談非聚集索引,非聚集索引從結(jié)構(gòu)上來說,他是完全獨(dú)立于數(shù)據(jù)表之外的結(jié)構(gòu),其子葉層存放數(shù)據(jù)存在著兩種類型:書簽和聚集索引的鍵值,原則是根據(jù)表是否存在聚集索引來區(qū)別的。如果表沒有建立聚集索引那么子葉層存放的字段鍵值和指向數(shù)據(jù)表符合鍵值記錄的 Row ID ,也就是說文檔編號(hào)、分頁編號(hào)與頁內(nèi)記錄編號(hào)所組合的值 (slot 編號(hào) ) ,即 Heap 數(shù)據(jù)表。而直接通過 Row ID 來獲取數(shù)據(jù),就是書簽查找,稱為 bookmark lookup 。一般的非聚集索引都是要結(jié)合聚集索引的,否則只使用非聚集索引可能還會(huì)導(dǎo)致數(shù)據(jù)檢索的緩慢,所以要盡量保證數(shù)據(jù)表的聚集索引的存在和合理性。非聚集索引在一個(gè)表上可以存在 249 個(gè),但是建議每個(gè)表的聚集索引不要超過 10 個(gè)。
了解了上述內(nèi)容后,我們?cè)诮⑺饕臅r(shí)候,就可以從整體上去考慮如何建立聚集索引和非聚集索引了。
首先,索引是用來幫助在大數(shù)據(jù)量的表中查找少量數(shù)據(jù)而建立的,所以聚集索引的結(jié)構(gòu)所占空間應(yīng)遠(yuǎn)遠(yuǎn)小于數(shù)據(jù)庫表本身,想想如果一本書 400 頁,目錄就有 300 頁,你會(huì)看目錄嗎?
其次,索引鍵值的重復(fù)性越低越好。好比我們?cè)谝槐緯锩嬗谩暗摹比フ覍?#xff0c;幾乎每頁都有一大堆,重復(fù)性極高,索引會(huì)反復(fù)在前后頁面讀取,還不如直接遍歷效率高。
總之,建立索引一般要遵循數(shù)據(jù)類型盡量為整型、數(shù)據(jù)本身盡量唯一、不可為空值等原則。
最后強(qiáng)調(diào),建立索引后,數(shù)據(jù)的增刪改會(huì)造成索引的自動(dòng)維護(hù),所以建立合理的索引就要求特別高,另外為保證數(shù)據(jù)的增刪改的效率,建議類似實(shí)時(shí)查詢、實(shí)時(shí)監(jiān)控之類的在反復(fù)讀取數(shù)據(jù),但查詢結(jié)果不要求非常準(zhǔn)確的時(shí)候,可以在 SELECT 的語句上增加臟讀的關(guān)鍵字,以便提高總體的數(shù)據(jù)庫效率。
羅嗦了很多,不知道大家是越看越糊涂,請(qǐng)批評(píng)指正!下一節(jié),嘮叨一下索引的維護(hù),望關(guān)注。
?
轉(zhuǎn)載于:https://www.cnblogs.com/Gaojier/archive/2010/08/02/2783528.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server 数据库的整理优化的基本过程(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转,帅气的表格隔行换色+鼠标经过变色、点
- 下一篇: 打新股中签后能赚多少钱 不同股票赚的不一