最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

SQLServer表和索引存儲結構

來源:懂視網 責編:小采 時間:2020-11-09 10:27:01
文檔

SQLServer表和索引存儲結構

SQLServer表和索引存儲結構:SQLServer表和索引存儲結構杜飛在上一篇文章中,我們介紹了SQLServer數據文件的頁面類型,系統(tǒng)通過96個字節(jié)的頭部信息和系統(tǒng)表從邏輯層面上將表的存儲結構管理起 SQL Server 表和索引存儲結構杜飛 在上一篇文章中,我們介紹了SQL Server數據文件
推薦度:
導讀SQLServer表和索引存儲結構:SQLServer表和索引存儲結構杜飛在上一篇文章中,我們介紹了SQLServer數據文件的頁面類型,系統(tǒng)通過96個字節(jié)的頭部信息和系統(tǒng)表從邏輯層面上將表的存儲結構管理起 SQL Server 表和索引存儲結構杜飛 在上一篇文章中,我們介紹了SQL Server數據文件

SQLServer表和索引存儲結構杜飛在上一篇文章中,我們介紹了SQLServer數據文件的頁面類型,系統(tǒng)通過96個字節(jié)的頭部信息和系統(tǒng)表從邏輯層面上將表的存儲結構管理起

SQL Server 表和索引存儲結構

杜飛

在上一篇文章中,我們介紹了SQL Server數據文件的頁面類型,系統(tǒng)通過96個字節(jié)的頭部信息和系統(tǒng)表從邏輯層面上將表的存儲結構管理起來,具體到表的存儲結構上,SQL Server引入對象、分區(qū)、堆或B樹、分配單元等概念。

下圖顯示了表的存儲組織,每張表有一個對應的對象ID,并且包含一個或多個分區(qū),每個分區(qū)會有一個堆或者多個B樹,堆或者B樹的結構是預留的。每個堆或者是B樹都有三個分配單元用來存放數據,分別是數據、LOB、行溢出,使用最多的分配單元是數據。如果有LOB數據或者是長度超過8000字節(jié)的記錄,則可能有另外的LOB分配單元和行溢出分配單元。

image

小總結: 一個表可以有多個分區(qū),但是每個分區(qū)(堆/B樹)最多有三個分配單元,每個分配單元可以有很多頁,對于每個分配單元內的數據頁,根據表是否有索引,以及索引是聚集還是非聚集,組織方式有以下三種:

1. 堆

所謂堆(heap),就是不含聚集索引的表。堆的 sys.partitions 中具有一行,對于堆使用的每個分區(qū),都有 index_id = 0。只有一個分區(qū),在系統(tǒng)表里,對于這個分區(qū)下面的每個分配單元都有一個連接指向Index Allocation Map頁(IAM),在IAM頁里,描述了區(qū)的信息。

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

image

2. 具有非聚集索引的表

如果有一個表只有非聚集索引而沒有聚集索引,對應的索引號是2--250。那么針對每個非聚集索引,都有一個對應的分區(qū),在系統(tǒng)表進而,對于這個分區(qū)下面的每個分配單元,都有一個連接指向根頁。數據頁之間通過前后指針互相聯系,是一個完整的樹形結構。在樹的底層,會有一個連接指向真正的數據,連接的形式是文件號+頁號+行號,而真正的數據是以堆的形式存放的。如下圖所示:

image

3. 具有聚集索引的表

表中的聚集索引,對應的索引號是1。它有一個對應的分區(qū),該分區(qū)下的每個分配單元都有一個連接指向根頁。對于聚集索引來說,葉子結點里存放的是真正的數據,而不是非聚集索引那樣的連接。如下圖所示:

image

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

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

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

  • 案例分析: 我們來查看一個表的存儲結構,我們在此使用的表是一個生產表,共有1億多條記錄,查看表的object_ID,如下圖所示:

    image

    此表,我已經做了分區(qū),查看其分區(qū)信息,可以使用下圖所示的命令:

    image

    從上圖可以看到,此表共有16個分區(qū),對應不同的索引,基本上每個分區(qū)都有1千多萬條記錄。從此圖中還可以看到堆或者B樹的ID跟分區(qū)ID是一樣的,如果希望進一步查看某一個索引的具體信息,可以使用下面的命令,如查看72057594067419136的信息。

    image

    從這個圖當中,我們可以看到這個分區(qū)只有一個分配單元,IN_ROW_DATA表明此分配單元只用來存放具體數據,共5353頁,已使用5346頁,數據占用5320頁。

    如果希望查看根頁的位置,可以使用下面的命令:

    image

    但需要注意,這里顯示的根頁的位置是0xEC0100001100,由于存儲的關系,用倒序的方式對它進行解析,也就是0x0011000001EC,最前面的兩個字節(jié)表明是所在的文件組編號,后面的4個字節(jié)是頁的編號,,即(1,0x01CE) ,換成十進制(1,492),然后可以利用我們上一節(jié)所說的DBCC PAGE命令查看頁的信息,如下圖所示:

    image

    從中可以看到具體的數據,此界面的返回結果會因表上的聚集索引、非聚集索引而不同。如果查看一個表使用的總頁數和區(qū)數,也可以使用命令:DBCC SHOWCONFIG,如下圖所示:

    image

    在同樣表結構的情況下,建立聚集索引不會增加表格的大小,但是建立非聚集索引反而會增加不少空間,在性能方面,SQL Server產品組做過測試,在select、update、delete操作下,聚集索引性能較高,在插入記錄時,聚集索引和非聚集索引性能相同,沒有出現聚集索引影響插入速度的現象,但在生產環(huán)境中,還是要謹慎行事。

    本文出自 “杜飛” 博客,請務必保留此出處

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    SQLServer表和索引存儲結構

    SQLServer表和索引存儲結構:SQLServer表和索引存儲結構杜飛在上一篇文章中,我們介紹了SQLServer數據文件的頁面類型,系統(tǒng)通過96個字節(jié)的頭部信息和系統(tǒng)表從邏輯層面上將表的存儲結構管理起 SQL Server 表和索引存儲結構杜飛 在上一篇文章中,我們介紹了SQL Server數據文件
    推薦度:
    標簽: 文件 存儲 sql
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top