中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
T-SQL查詢進(jìn)階--理解SQL Server中索引的概念,原理以及其他

簡(jiǎn)介


在SQL Server中,索引是一種增強(qiáng)式的存在,這意味著,即使沒有索引,SQL Server仍然可以實(shí)現(xiàn)應(yīng)有的功能。但索引可以在大多數(shù)情況下大大提升查詢性能,在OLAP中尤其明顯.要完全理解索引的概念,需要了解大量原理性的知識(shí),包括B樹,堆,數(shù)據(jù)庫(kù)頁(yè),區(qū),填充因子,碎片,文件組等等一系列相關(guān)知識(shí),這些知識(shí)寫一本小書也不為過。所以本文并不會(huì)深入討論這些主題。

索引是什么


索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問數(shù)據(jù)庫(kù)表中的特定信息。

精簡(jiǎn)來說,索引是一種結(jié)構(gòu).在SQL Server中,索引和表(這里指的是加了聚集索引的表)的存儲(chǔ)結(jié)構(gòu)是一樣的,都是B樹,B樹是一種用于查找的平衡多叉樹.理解B樹的概念如下圖:

理解為什么使用B樹作為索引和表(有聚集索引)的結(jié)構(gòu),首先需要理解SQL Server存儲(chǔ)數(shù)據(jù)的原理.

在SQL SERVER中,存儲(chǔ)的單位最小是頁(yè)(PAGE),頁(yè)是不可再分的。就像細(xì)胞是生物學(xué)中不可再分的,或是原子是化學(xué)中不可再分的最小單位一樣.這意味著,SQL SERVER對(duì)于頁(yè)的讀取,要么整個(gè)讀取,要么完全不讀取,沒有折中.

在數(shù)據(jù)庫(kù)檢索來說,對(duì)于磁盤IO掃描是最消耗時(shí)間的.因?yàn)榇疟P掃描涉及很多物理特性,這些是相當(dāng)消耗時(shí)間的。所以B樹設(shè)計(jì)的初衷是為了減少對(duì)于磁盤的掃描次數(shù)。如果一個(gè)表或索引沒有使用B樹(對(duì)于沒有聚集索引的表是使用堆heap存儲(chǔ)),那么查找一個(gè)數(shù)據(jù),需要在整個(gè)表包含的數(shù)據(jù)庫(kù)頁(yè)中全盤掃描。這無疑會(huì)大大加重IO負(fù)擔(dān).而在SQL SERVER中使用B樹進(jìn)行存儲(chǔ),則僅僅需要將B樹的根節(jié)點(diǎn)存入內(nèi)存,經(jīng)過幾次查找后就可以找到存放所需數(shù)據(jù)的被葉子節(jié)點(diǎn)包含的頁(yè)!進(jìn)而避免的全盤掃描從而提高了性能.

下面,通過一個(gè)例子來證明:

在SQL SERVER中,表上如果沒有建立聚集索引,則是按照堆(HEAP)存放的,假設(shè)我有這樣一張表:

現(xiàn)在這張表上沒有任何索引,也就是以堆存放,我通過在其上加上聚集索引(以B樹存放)來展現(xiàn)對(duì)IO的減少:

理解聚集和聚集索引


在SQL SERVER中,最主要的兩類索引是聚集索引和非聚集索引??梢钥吹?,這兩個(gè)分類是圍繞聚集這個(gè)關(guān)鍵字進(jìn)行的.那么首先要理解什么是聚集.

聚集在索引中的定義:

為了提高某個(gè)屬性(或?qū)傩越M)的查詢速度,把這個(gè)或這些屬性(稱為聚集碼)上具有相同值的元組集中存放在連續(xù)的物理塊稱為聚集。

簡(jiǎn)單來說,聚集索引就是:

在SQL SERVER中,聚集的作用就是將某一列(或是多列)的物理順序改變?yōu)楹瓦壿嬳樞蛳嘁恢?比如,我從adventureworks數(shù)據(jù)庫(kù)的employee中抽取5條數(shù)據(jù):

當(dāng)我在ContactID上建立聚集索引時(shí),再次查詢:

在SQL SERVER中,聚集索引的存儲(chǔ)是以B樹存儲(chǔ),B樹的葉子直接存儲(chǔ)聚集索引的數(shù)據(jù):

因?yàn)榫奂饕淖兊氖瞧渌诒淼奈锢泶鎯?chǔ)順序,所以每個(gè)表只能有一個(gè)聚集索引.

非聚集索引

因?yàn)槊總€(gè)表只能有一個(gè)聚集索引,如果我們對(duì)一個(gè)表的查詢不僅僅限于在聚集索引上的字段。我們又對(duì)聚集索引列之外還有索引的要求,那么就需要非聚集索引了.

非聚集索引,本質(zhì)上來說也是聚集索引的一種.非聚集索引并不改變其所在表的物理結(jié)構(gòu),而是額外生成一個(gè)聚集索引的B樹結(jié)構(gòu),但葉子節(jié)點(diǎn)是對(duì)于其所在表的引用,這個(gè)引用分為兩種,如果其所在表上沒有聚集索引,則引用行號(hào)。如果其所在表上已經(jīng)有了聚集索引,則引用聚集索引的頁(yè).

一個(gè)簡(jiǎn)單的非聚集索引概念如下:

可以看到,非聚集索引需要額外的空間進(jìn)行存儲(chǔ),按照被索引列進(jìn)行聚集索引,并在B樹的葉子節(jié)點(diǎn)包含指向非聚集索引所在表的指針.

MSDN中,對(duì)于非聚集索引描述圖是:

可以看到,非聚集索引也是一個(gè)B樹結(jié)構(gòu),與聚集索引不同的是,B樹的葉子節(jié)點(diǎn)存的是指向堆或聚集索引的指針.

通過非聚集索引的原理可以看出,如果其所在表的物理結(jié)構(gòu)改變后,比如加上或是刪除聚集索引,那么所有非聚集索引都需要被重建,這個(gè)對(duì)于性能的損耗是相當(dāng)大的。所以最好要先建立聚集索引,再建立對(duì)應(yīng)的非聚集索引.

聚集索引 VS 非聚集索引


前面通過對(duì)于聚集索引和非聚集索引的原理解釋.我們不難發(fā)現(xiàn),大多數(shù)情況下,聚集索引的速度比非聚集索引要略快一些.因?yàn)榫奂饕腂樹葉子節(jié)點(diǎn)直接存儲(chǔ)數(shù)據(jù),而非聚集索引還需要額外通過葉子節(jié)點(diǎn)的指針找到數(shù)據(jù).

還有,對(duì)于大量連續(xù)數(shù)據(jù)查找,非聚集索引十分乏力,因?yàn)榉蔷奂饕枰诜蔷奂饕腂樹中找到每一行的指針,再去其所在表上找數(shù)據(jù),性能因此會(huì)大打折扣.有時(shí)甚至不如不加非聚集索引.

因此,大多數(shù)情況下聚集索引都要快于非聚集索引。但聚集索引只能有一個(gè),因此選對(duì)聚集索引所施加的列對(duì)于查詢性能提升至關(guān)緊要.

索引的使用


索引的使用并不需要顯式使用,建立索引后查詢分析器會(huì)自動(dòng)找出最短路徑使用索引.

但是有這種情況.當(dāng)隨著數(shù)據(jù)量的增長(zhǎng),產(chǎn)生了索引碎片后,很多存儲(chǔ)的數(shù)據(jù)進(jìn)行了不適當(dāng)?shù)目珥?yè),會(huì)造成碎片(關(guān)于跨頁(yè)和碎片以及填充因子的介紹,我會(huì)在后續(xù)文章中說到)我們需要重新建立索引以加快性能:

比如前面的test_tb2上建立的一個(gè)聚集索引和非聚集索引,可以通過DMV語句查詢其索引的情況:

SELECT index_type_desc,alloc_unit_type_desc,avg_fragmentation_in_percent,fragment_count,avg_fragment_size_in_pages,page_count,record_count,avg_page_space_used_in_percentFROM sys.dm_db_index_physical_stats(DB_ID('AdventureWorks'),OBJECT_ID('test_tb2'),NULL,Sampled')

我們可以通過重建索引來提高速度:

ALTER INDEX idx_text_tb2_EmployeeID ON test_tb2 REBUILD

還有一種情況是,當(dāng)隨著表數(shù)據(jù)量的增大,有時(shí)候需要更新表上的統(tǒng)計(jì)信息,讓查詢分析器根據(jù)這些信息選擇路徑,使用:

那么什么時(shí)候知道需要更新這些統(tǒng)計(jì)信息呢,就是當(dāng)執(zhí)行計(jì)劃中估計(jì)行數(shù)和實(shí)際表的行數(shù)有出入時(shí):

使用索引的代價(jià)


我最喜歡的一句話是”everything has price”。我們通過索引獲得的任何性能提升并不是不需要付出代價(jià)。這個(gè)代價(jià)來自幾方面.

1.通過聚集索引的原理我們知道,當(dāng)表建立索引后,就以B樹來存儲(chǔ)數(shù)據(jù).所以當(dāng)對(duì)其進(jìn)行更新插入刪除時(shí),就需要頁(yè)在物理上的移動(dòng)以調(diào)整B樹.因此當(dāng)更新插入刪除數(shù)據(jù)時(shí),會(huì)帶來性能的下降。而對(duì)于聚集索引,當(dāng)更新表后,非聚集索引也需要進(jìn)行更新,相當(dāng)于多更新了N(N=非聚集索引數(shù)量)個(gè)表。因此也下降了性能.

2.通過上面對(duì)非聚集索引原理的介紹,可以看到,非聚集索引需要額外的磁盤空間。

3.前文提過,不恰當(dāng)?shù)姆蔷奂饕炊鴷?huì)降低性能.

所以使用索引需要根據(jù)實(shí)際情況進(jìn)行權(quán)衡.通常我都會(huì)將非聚集索引全部放到另外一個(gè)獨(dú)立硬盤上,這樣可以分散IO,從而使查詢并行.

總結(jié)


本文從索引的原理和概念對(duì)SQL SERVER中索引進(jìn)行介紹,索引是一個(gè)很強(qiáng)大的工具,也是一把雙刃劍.對(duì)于恰當(dāng)使用索引需要對(duì)索引的原理以及數(shù)據(jù)庫(kù)存儲(chǔ)的相關(guān)原理進(jìn)行系統(tǒng)的學(xué)習(xí).

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
在SQL Server中使用索引的技巧
SQL Server 2014 聚集列存儲(chǔ)
索引的原理及索引建立的注意事項(xiàng)
SQL索引學(xué)習(xí)-索引結(jié)構(gòu)
數(shù)據(jù)庫(kù)索引總結(jié)(二)
深入淺出數(shù)據(jù)庫(kù)索引原理
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服