国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SQL SERVER 索引之聚集索引和非聚集索引的描述

2024-08-31 00:54:18
字體:
來源:轉載
供稿:網友
SQL SERVER 索引之聚集索引和非聚集索引的描述

索引是與表或視圖關聯的磁盤上結構,可以加快從表或視圖中檢索行的速度。 索引包含由表或視圖中的一列或多列生成的鍵。 這些鍵存儲在一個結構(B 樹)中,使 SQL Server 可以快速有效地查找與鍵值關聯的行。

表或視圖可以包含以下類型的索引:

  • 聚集

    • 聚集索引根據數據行的鍵值在表或視圖中排序和存儲這些數據行。 索引定義中包含聚集索引列。 每個表只能有一個聚集索引,因為數據行本身只能按一個順序排序。

    • 只有當表包含聚集索引時,表中的數據行才按排序順序存儲。 如果表具有聚集索引,則該表稱為聚集表。 如果表沒有聚集索引,則其數據行存儲在一個稱為堆的無序結構中。

  • 非聚集

    • 非聚集索引具有獨立于數據行的結構。 非聚集索引包含非聚集索引鍵值,并且每個鍵值項都有指向包含該鍵值的數據行的指針。

    • 從非聚集索引中的索引行指向數據行的指針稱為行定位器。 行定位器的結構取決于數據頁是存儲在堆中還是聚集表中。 對于堆,行定位器是指向行的指針。 對于聚集表,行定位器是聚集索引鍵。

    • 您可以向非聚集索引的葉級添加非鍵列以跳過現有的索引鍵限制(900 字節和 16 鍵列),并執行完整范圍內的索引查詢。

聚集索引和非聚集索引都可以是唯一的。 這意味著任何兩行都不能有相同的索引鍵值。 另外,索引也可以不是唯一的,即多行可以共享同一鍵值。每當修改了表數據后,都會自動維護表或視圖的索引。

索引 B 樹中的每一頁稱為一個索引節點。B 樹的頂端節點稱為根節點。索引中的底層節點稱為葉節點。根節點與葉節點之間的任何索引級別統稱為中間級。在聚集索引中,葉節點包含基礎表的數據頁。根節點和中間級節點包含存有索引行的索引頁。每個索引行包含一個鍵值和一個指針,該指針指向 B 樹上的某一中間級頁或葉級索引中的某個數據行。每級索引中的頁均被鏈接在雙向鏈接列表中。

聚集索引在 sys.partitions 中有一行,其中,索引使用的每個分區的 index_id = 1。默認情況下,聚集索引有單個分區。當聚集索引有多個分區時,每個分區都有一個包含該特定分區相關數據的 B 樹結構。例如,如果聚集索引有四個分區,就有四個 B 樹結構,每個分區中有一個 B 樹結構。

根據聚集索引中的數據類型,每個聚集索引結構將有一個或多個分配單元,將在這些單元中存儲和管理特定分區的相關數據。每個聚集索引的每個分區中至少有一個 IN_ROW_DATA 分配單元。如果聚集索引包含大型對象 (LOB) 列,則它的每個分區中還會有一個 LOB_DATA 分配單元。如果聚集索引包含的變量長度列超過 8,060 字節的行大小限制,則它的每個分區中還會有一個 ROW_OVERFLOW_DATA 分配單元。數據鏈內的頁和行將按聚集索引鍵值進行排序。所有插入操作都在所插入行中的鍵值與現有行中的排序順序相匹配時執行。B 樹頁集合由sys.system_internals_allocation_units 系統視圖中的頁指針來定位。

對于某個聚集索引,sys.system_internals_allocation_units 中的 root_page 列指向該聚集索引某個特定分區的頂部。SQL Server 將在索引中向下移動以查找與某個聚集索引鍵對應的行。為了查找鍵的范圍,SQL Server 將在索引中移動以查找該范圍的起始鍵值,然后用向前或向后指針在數據頁中進行掃描。為了查找數據頁鏈的首頁,SQL Server 將從索引的根節點沿最左邊的指針進行掃描。

下圖顯式了聚集索引單個分區中的結構。

聚集索引的級別

非聚集索引與聚集索引具有相同的 B 樹結構,它們之間的顯著差別在于以下兩點:

  • 基礎表的數據行不按非聚集鍵的順序排序和存儲。

  • 非聚集索引的葉層是由索引頁而不是由數據頁組成。

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

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

  • 如果表是堆(意味著該表沒有聚集索引),則行定位器是指向行的指針。該指針由文件標識符 (ID)、頁碼和頁上的行數生成。整個指針稱為行 ID (RID)。

  • 如果表有聚集索引或索引視圖上有聚集索引,則行定位器是行的聚集索引鍵。如果聚集索引不是唯一的索引,SQL Server 將添加在內部生成的值(稱為唯一值)以使所有重復鍵唯一。此四字節的值對于用戶不可見。僅當需要使聚集鍵唯一以用于非聚集索引中時,才添加該值。SQL Server 通過使用存儲在非聚集索引的葉行內的聚集索引鍵搜索聚集索引來檢索數據行。

對于索引使用的每個分區,非聚集索引在 index_id >0 的 sys.partitions 中都有對應的一行。默認情況下,一個非聚集索引有單個分區。如果一個非聚集索引有多個分區,則每個分區都有一個包含該特定分區的索引行的 B 樹結構。例如,如果一個非聚集索引有四個分區,那么就有四個 B 樹結構,每個分區中一個。

根據非聚集索引中數據類型的不同,每個非聚集索引結構會有一個或多個分配單元,在其中存儲和管理特定分區的數據。每個非聚集索引至少有一個針對每個分區的 IN_ROW_DATA 分配單元(存儲索引 B 樹頁)。如果非聚集索引包含大型對象 (LOB) 列,則還有一個針對每個分區的 LOB_DATA 分配單元。此外,如果非聚集索引包含的可變長度列超過 8,060 字節行大小限制,則還有一個針對每個分區的 ROW_OVERFLOW_DATA 分配單元。B 樹的頁集合由 sys.system_internals_allocation_units 系統視圖中的root_page 指針定位。

下圖說明了單個分區中的非聚集索引結構。

非聚集索引的級別


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德保县| 竹山县| 申扎县| 天长市| 高碑店市| 平陆县| 社旗县| 阿拉尔市| 新建县| 永登县| 和顺县| 辽阳市| 梁山县| 琼结县| 二连浩特市| 岳池县| 民勤县| 静乐县| 赣榆县| 珠海市| 桐梓县| 营山县| 嘉义市| 崇信县| 兴宁市| 金乡县| 安阳市| 根河市| 威宁| 遂宁市| 大石桥市| 临漳县| 县级市| 平陆县| 利津县| 达日县| 海晏县| 江城| 都兰县| 利川市| 宣城市|