黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

數(shù)據(jù)庫索引

系統(tǒng) 2156 0

數(shù)據(jù)庫索引的基礎(chǔ)知識

一、理解索引的結(jié)構(gòu)

索引在數(shù)據(jù)庫中的作用類似于目錄在書籍中的作用,用來提高查找信息的速度。使用索引查找數(shù)據(jù),無需對整表進(jìn)行掃描,可以快速找到所需數(shù)據(jù)。微軟的SQL SERVER提供了兩種索引:聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。

SQL Server 中數(shù)據(jù)存儲的基本單位是頁(Page)。數(shù)據(jù)庫中的數(shù)據(jù)文件(.mdf 或 .ndf)分配的磁盤空間可以從邏輯上劃分成頁(從 0 到 n 連續(xù)編號)。磁盤 I/O 操作在頁級執(zhí)行。也就是說,SQL Server 每次讀取或?qū)懭霐?shù)據(jù)的最少數(shù)據(jù)單位是數(shù)據(jù)頁。

下面我們先簡單的了解一下索引的體系結(jié)構(gòu):

1. 聚集索引結(jié)構(gòu)
在 SQL Server 中,索引是按 B 樹結(jié)構(gòu)進(jìn)行組織的。
聚集索引單個(gè)分區(qū)中的結(jié)構(gòu):

--建立 UserAddDate 聚集索引
CREATE CLUSTERED INDEX [ IX_AddDate ] ON [ User ]
(
?? ?[
AddDate ] ASC
)


聚集索引(Clustered Index)特點(diǎn)

聚集索引的葉節(jié)點(diǎn)就是實(shí)際的數(shù)據(jù)頁
聚集索引中的排序順序僅僅表示數(shù)據(jù)頁鏈在邏輯上是有序的。而不是按照順序物理的存儲在磁盤上
行的物理位置和行在索引中的位置是相同的
每個(gè)表只能有一個(gè)聚集索引
聚集索引的平均大小大約為表大小的5%左右

2.非聚集索引結(jié)構(gòu)
非聚集索引與聚集索引具有相同的 B 樹結(jié)構(gòu),它們之間的顯著差別在于以下兩點(diǎn):
1. 基礎(chǔ)表的數(shù)據(jù)行不按非聚集鍵的順序排序和存儲。
2. 非聚集索引的葉層是由索引頁而不是由數(shù)據(jù)頁組成。

下圖示意了單個(gè)分區(qū)中的非聚集索引結(jié)構(gòu):


包含列的索引

通過將包含列(稱為非鍵列)添加到索引的葉級,可以擴(kuò)展非聚集索引的功能。鍵列存儲在非聚集索引的所有級別,而非鍵列僅存儲在葉級別。

下面舉個(gè)簡單的例子來說明一下聚集索引和非聚集索引的區(qū)別:
我們有一本漢語字典,可以把它的正文本身看做是一個(gè)聚集索引,它是按照漢字拼音的開頭字母排序的,不再需要查找其他目錄。當(dāng)遇到不認(rèn)識的字時(shí),需要結(jié)合“部首目錄”和“檢字表”, 先找到目錄中的結(jié)果,然后再翻到您所需要的頁碼。通過這種方法查到的目錄中字的排序并不是真正的正文的排序方法。把這種看做是一個(gè)非聚集索引。

另外,請注意每個(gè)表只能有一個(gè)聚集索引。

--建立 UserAddDate 非聚集索引
CREATE NONCLUSTERED INDEX [ IX_AddDate ] ON [ User ]
(
?? ?[
AddDate ] ASC
)


非聚集索引 (Unclustered Index) 特點(diǎn)

非聚集索引的頁,不是數(shù)據(jù),而是指向數(shù)據(jù)頁的頁。
若未指定索引類型,則默認(rèn)為非聚集索引
葉節(jié)點(diǎn)頁的次序和表的物理存儲次序不同
每個(gè)表最多可以有249個(gè)非聚集索引
在非聚集索引創(chuàng)建之前創(chuàng)建聚集索引(否則會引發(fā)索引重建)

二、選擇建立哪種索引

1.何時(shí)創(chuàng)建聚集索引更能提高性能
Clustered Index會提高大多數(shù)table的性能,尤其是當(dāng)它滿足以下條件時(shí):
獨(dú)特, 狹窄, 持續(xù)增長的,最好是只向上增加。例如:
?Identity
?Date, identity
?GUID (only when using newsequentialid() function)

2.非聚集索引提高性能的方法

非聚集索引由于B樹的節(jié)點(diǎn)不是具體數(shù)據(jù)頁,有時(shí)候由于這個(gè)原因,會導(dǎo)致非聚集索引甚至不如表遍歷來的快。但是,非聚集索引有個(gè)特性,如果你要查詢的內(nèi)容,在非聚集索引中以及被覆蓋到了,則不需要繼續(xù)到聚集索引,或者RID(heap結(jié)構(gòu)中的行標(biāo)識符)中去尋找數(shù)據(jù)了,這時(shí)候就可以很大的提高性能,這就是 覆蓋面(Covering) 的問題。
由于聚集索引葉子節(jié)點(diǎn)就是具體數(shù)據(jù),所以聚集索引的覆蓋率是 100%, 通過提高覆蓋面來提高性能的問題也就只有非聚集索引(Nonclustered Indexes)才存在。

當(dāng)查詢中所有的columns 都包括在index上時(shí),我們說這個(gè) index covers the query. Columns的順序在此不重要(Select 時(shí)候的順序不重要,但是Index 建立的順序可得小心了)。

在 SQL Server 2005 中,為了提高這種 Covering 帶來的好處,甚至可以通過將非鍵列添加到非聚集索引的葉級別來擴(kuò)展非聚集索引的功能。

補(bǔ)充:只有查詢在具有高度選擇性的情況下,非聚集索引才有優(yōu)勢。

三、使用聚集索引或非聚集索引的場景 (注:優(yōu)先級依次為推薦,應(yīng),不應(yīng))


四、主鍵和聚集索引的比較

以下是一些大眾點(diǎn)評網(wǎng)中測試使用的示例:

CHECKPOINT
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
declare @ d datetime
set @ d = getdate ()
?
SELECT * FROM User WHERE AddDate > ' 2008-06-01 ' AND AddDate < ' 2008-06-10 '
?
select [語句執(zhí)行花費(fèi)時(shí)間 ( 毫秒 ) ]= datediff ( ms ,@ d , getdate ())
?
--
( 45077 行受影響 )
--表
' User ' 。掃描計(jì)數(shù) 1 ,邏輯讀取 1103 次,物理讀取 2 次,預(yù)讀 1090 次, lob 邏輯讀取 0 次, lob 物理讀取 0 次, lob 預(yù)讀 0 次。
--
2543
?
CHECKPOINT
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
declare @ d datetime
set @ d = getdate ()
?
SELECT * FROM User WITH ( INDEX = IX_AddDate ) WHERE AddDate > ' 2008-06-01 ' AND AddDate < ' 2008-06-10 '
?
select [語句執(zhí)行花費(fèi)時(shí)間 ( 毫秒 ) ]= datediff ( ms ,@ d , getdate ())
?
--
( 45077 行受影響 )
--表
' User ' 。掃描計(jì)數(shù) 1 ,邏輯讀取 45165 次,物理讀取 133 次,預(yù)讀 141 次, lob 邏輯讀取 0 次, lob 物理讀取 0 次, lob 預(yù)讀 0 次。
?
--
3860

五、使用索引的代價(jià)
索引需要占用數(shù)據(jù)表以外的物理存儲空間。
創(chuàng)建索引和維護(hù)索引要花費(fèi)一定的時(shí)間。
當(dāng)對表進(jìn)行更新操作時(shí),索引需要被重建,這樣降低了數(shù)據(jù)的維護(hù)速度。

?

數(shù)據(jù)庫索引


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論