日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

sql server 2008学习3 表组织和索引组织

發(fā)布時(shí)間:2024/9/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql server 2008学习3 表组织和索引组织 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

表組織

表包含在一個(gè)或多個(gè)分區(qū)中,每個(gè)分區(qū)在一個(gè)堆或一個(gè)聚集索引結(jié)構(gòu)包含數(shù)據(jù)行。堆頁(yè)或聚集索引頁(yè)在一個(gè)或多個(gè)分配單元中進(jìn)行管理,具體的分配單元數(shù)取決于數(shù)據(jù)行中的列類(lèi)型。

聚集表、堆和索引

SQL Server 表使用下列兩種方法之一來(lái)組織其分區(qū)中的數(shù)據(jù)頁(yè):

  • 聚集表是有聚集索引的表。

    數(shù)據(jù)行基于聚集索引鍵按順序存儲(chǔ)。聚集索引按 B 樹(shù)索引結(jié)構(gòu)實(shí)現(xiàn),B 樹(shù)索引結(jié)構(gòu)支持基于聚集索引鍵值對(duì)行進(jìn)行快速檢索。索引中每個(gè)級(jí)別的頁(yè)(包括葉級(jí)別的數(shù)據(jù)頁(yè))鏈接在一個(gè)雙向鏈接的列表中。但是,通過(guò)使用鍵值來(lái)執(zhí)行從一個(gè)級(jí)別到另一級(jí)別的導(dǎo)航。堆是沒(méi)有聚集索引的表。

  • 數(shù)據(jù)行不按任何特殊的順序存儲(chǔ),數(shù)據(jù)頁(yè)也沒(méi)有任何特殊的順序。數(shù)據(jù)頁(yè)不在鏈接列表內(nèi)鏈接。

索引視圖與聚集表具有相同的存儲(chǔ)結(jié)構(gòu)。

當(dāng)堆或聚集表具有多個(gè)分區(qū)時(shí),每個(gè)分區(qū)都有一個(gè)堆或 B 樹(shù)結(jié)構(gòu),其中包含該指定分區(qū)的行組。例如,如果一個(gè)聚集表有 4 個(gè)分區(qū),那么將有 4 個(gè) B 樹(shù),每個(gè)分區(qū)一個(gè)

下面想看一下 聚集索引結(jié)構(gòu) ,堆結(jié)構(gòu)和非聚集索引結(jié)構(gòu)

聚集索引結(jié)構(gòu):

在 SQL Server 中,索引是按 B 樹(shù)結(jié)構(gòu)進(jìn)行組織的。索引 B 樹(shù)中的每一頁(yè)稱(chēng)為一個(gè)索引節(jié)點(diǎn)。B 樹(shù)的頂端節(jié)點(diǎn)稱(chēng)為根節(jié)點(diǎn)。索引中的底層節(jié)點(diǎn)稱(chēng)為葉節(jié)點(diǎn)。根節(jié)點(diǎn)與葉節(jié)點(diǎn)之間的任何索引級(jí)別統(tǒng)稱(chēng)為中間級(jí)。在聚集索引中,葉節(jié)點(diǎn)包含基礎(chǔ)表的數(shù)據(jù)頁(yè)。根節(jié)點(diǎn)和中間級(jí)節(jié)點(diǎn)包含存有索引行的索引頁(yè)。每個(gè)索引行包含一個(gè)鍵值和一個(gè)指針,該指針指向 B 樹(shù)上的某一中間級(jí)頁(yè)或葉級(jí)索引中的某個(gè)數(shù)據(jù)行。每級(jí)索引中的頁(yè)均被鏈接在雙向鏈接列表中。

對(duì)于某個(gè)聚集索引,sys.system_internals_allocation_units 中的 root_page 列指向該聚集索引某個(gè)特定分區(qū)的頂部。SQL Server 將在索引中向下移動(dòng)以查找與某個(gè)聚集索引鍵對(duì)應(yīng)的行。為了查找鍵的范圍,SQL Server 將在索引中移動(dòng)以查找該范圍的起始鍵值,然后用向前或向后指針在數(shù)據(jù)頁(yè)中進(jìn)行掃描。為了查找數(shù)據(jù)頁(yè)鏈的首頁(yè),SQL Server 將從索引的根節(jié)點(diǎn)沿最左邊的指針進(jìn)行掃描。

下圖顯式了聚集索引單個(gè)分區(qū)中的結(jié)構(gòu)。

堆結(jié)構(gòu):

堆是不含聚集索引的表。堆的 sys.partitions 中具有一行,對(duì)于堆使用的每個(gè)分區(qū),都有 index_id = 0。默認(rèn)情況下,一個(gè)堆有一個(gè)分區(qū)。當(dāng)堆有多個(gè)分區(qū)時(shí),每個(gè)分區(qū)有一個(gè)堆結(jié)構(gòu),其中包含該特定分區(qū)的數(shù)據(jù)。例如,如果一個(gè)堆有四個(gè)分區(qū),則有四個(gè)堆結(jié)構(gòu);每個(gè)分區(qū)有一個(gè)堆結(jié)構(gòu)。

sys.system_internals_allocation_units 系統(tǒng)視圖中的列 first_iam_page 指向管理特定分區(qū)中堆的分配空間的一系列 IAM 頁(yè)的第一頁(yè)。SQL Server 使用 IAM 頁(yè)在堆中移動(dòng)。堆內(nèi)的數(shù)據(jù)頁(yè)和行沒(méi)有任何特定的順序,也不鏈接在一起。數(shù)據(jù)頁(yè)之間唯一的邏輯連接是記錄在 IAM 頁(yè)內(nèi)的信息。

可以通過(guò)掃描 IAM 頁(yè)對(duì)堆進(jìn)行表掃描或串行讀操作來(lái)找到容納該堆的頁(yè)的擴(kuò)展盤(pán)區(qū)。因?yàn)?IAM 按擴(kuò)展盤(pán)區(qū)在數(shù)據(jù)文件內(nèi)存在的順序表示它們,所以這意味著串行堆掃描連續(xù)沿每個(gè)文件進(jìn)行。使用 IAM 頁(yè)設(shè)置掃描順序還意味著堆中的行一般不按照插入的順序返回。

下圖說(shuō)明 SQL Server 數(shù)據(jù)庫(kù)引擎 如何使用 IAM 頁(yè)檢索具有單個(gè)分區(qū)的堆中的數(shù)據(jù)行。

非聚集索引結(jié)構(gòu):

非聚集索引與聚集索引具有相同的 B 樹(shù)結(jié)構(gòu),它們之間的顯著差別在于以下兩點(diǎn):

  • 基礎(chǔ)表的數(shù)據(jù)行不按非聚集鍵的順序排序和存儲(chǔ)。

  • 非聚集索引的葉層是由索引頁(yè)而不是由數(shù)據(jù)頁(yè)組成。

既可以使用聚集索引來(lái)為表或視圖定義非聚集索引,也可以根據(jù)堆來(lái)定義非聚集索引。非聚集索引中的每個(gè)索引行都包含非聚集鍵值和行定位符。此定位符指向聚集索引或堆中包含該鍵值的數(shù)據(jù)行。

非聚集索引行中的行定位器或是指向行的指針,或是行的聚集索引鍵,如下所述:

  • 如果表是堆(意味著該表沒(méi)有聚集索引),則行定位器是指向行的指針。該指針由文件標(biāo)識(shí)符 (ID)、頁(yè)碼和頁(yè)上的行數(shù)生成。整個(gè)指針?lè)Q為行 ID (RID)。

  • 如果表有聚集索引或索引視圖上有聚集索引,則行定位器是行的聚集索引鍵。如果聚集索引不是唯一的索引,SQL Server 將添加在內(nèi)部生成的值(稱(chēng)為唯一值)以使所有重復(fù)鍵唯一。此四字節(jié)的值對(duì)于用戶(hù)不可見(jiàn)。僅當(dāng)需要使聚集鍵唯一以用于非聚集索引中時(shí),才添加該值。SQL Server 通過(guò)使用存儲(chǔ)在非聚集索引的葉行內(nèi)的聚集索引鍵搜索聚集索引來(lái)檢索數(shù)據(jù)行。

對(duì)于索引使用的每個(gè)分區(qū),非聚集索引在 index_id >0 的 sys.partitions 中都有對(duì)應(yīng)的一行。默認(rèn)情況下,一個(gè)非聚集索引有單個(gè)分區(qū)。如果一個(gè)非聚集索引有多個(gè)分區(qū),則每個(gè)分區(qū)都有一個(gè)包含該特定分區(qū)的索引行的 B 樹(shù)結(jié)構(gòu)。例如,如果一個(gè)非聚集索引有四個(gè)分區(qū),那么就有四個(gè) B 樹(shù)結(jié)構(gòu),每個(gè)分區(qū)中一個(gè)。

根據(jù)非聚集索引中數(shù)據(jù)類(lèi)型的不同,每個(gè)非聚集索引結(jié)構(gòu)會(huì)有一個(gè)或多個(gè)分配單元,在其中存儲(chǔ)和管理特定分區(qū)的數(shù)據(jù)。每個(gè)非聚集索引至少有一個(gè)針對(duì)每個(gè)分區(qū)的 IN_ROW_DATA 分配單元(存儲(chǔ)索引 B 樹(shù)頁(yè))。如果非聚集索引包含大型對(duì)象 (LOB) 列,則還有一個(gè)針對(duì)每個(gè)分區(qū)的 LOB_DATA 分配單元。此外,如果非聚集索引包含的可變長(zhǎng)度列超過(guò) 8,060 字節(jié)行大小限制,則還有一個(gè)針對(duì)每個(gè)分區(qū)的 ROW_OVERFLOW_DATA 分配單元。有關(guān)分配單元的詳細(xì)信息,請(qǐng)參閱表組織和索引組織。B 樹(shù)的頁(yè)集合由 sys.system_internals_allocation_units 系統(tǒng)視圖中的 root_page 指針定位。

下圖說(shuō)明了單個(gè)分區(qū)中的非聚集索引結(jié)構(gòu)。

總結(jié)

以上是生活随笔為你收集整理的sql server 2008学习3 表组织和索引组织的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。