亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解SQL Server表和索引存儲結(jié)構(gòu)

 更新時間:2017年11月30日 11:12:06   投稿:laozhang  
這篇文章主要介紹了詳解SQL Server表和索引存儲結(jié)構(gòu),有助于大家對SQL存儲方式有深入的理解,參考學(xué)習(xí)下吧。

本文詳細分析了SQL Server中表和索引結(jié)構(gòu)存儲的原理以及對于如何加快搜索速度和提高效率等方面做了詳細的分析,以下是主要內(nèi)容。

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

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

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 頁在堆中移動。堆內(nèi)的數(shù)據(jù)頁和行沒有任何特定的順序,也不鏈接在一起。數(shù)據(jù)頁之間唯一的邏輯連接是記錄在 IAM 頁內(nèi)的信息。

2. 具有非聚集索引的表

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

3. 具有聚集索引的表

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

 

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

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

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

案例分析: 我們來查看一個表的存儲結(jié)構(gòu),我們在此使用的表是一個生產(chǎn)表,共有1億多條記錄,查看表的object_ID,如下圖所示:

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

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

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

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

 

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

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

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

相關(guān)文章

  • sql 刪除表中的重復(fù)記錄

    sql 刪除表中的重復(fù)記錄

    本文主要介紹了sql 刪除表中的重復(fù)記錄的方法,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 詳解SQL游標的用法

    詳解SQL游標的用法

    這篇文章主要介紹了SQL游標的用法,文中講解非常詳細,配合代碼幫助大家更好的理解學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • SQL去除重復(fù)記錄(七種)

    SQL去除重復(fù)記錄(七種)

    本文主要介紹了SQL去除重復(fù)記錄的七種方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • SQL語句中的DDL類型的數(shù)據(jù)庫定義語言操作

    SQL語句中的DDL類型的數(shù)據(jù)庫定義語言操作

    這篇文章主要介紹了SQL語句中的DDL類型的數(shù)據(jù)庫定義語言,主要是用來定義數(shù)據(jù)庫中的對象的,例如數(shù)據(jù)庫、表和字段的定義,簡單的理解就是DDL語言是來操作數(shù)據(jù)庫、表和字段的,需要的朋友可以參考下
    2022-08-08
  • 使用SQL語句去掉重復(fù)的記錄【兩種方法】

    使用SQL語句去掉重復(fù)的記錄【兩種方法】

    這篇文章主要介紹了用SQL語句去掉重復(fù)的記錄的兩種方式,兩種方式都可以使用臨時表操作,具體實現(xiàn)方法大家跟隨腳本之家小編一起通過本文學(xué)習(xí)吧
    2018-05-05
  • SQL語句檢測sp4補丁是否安裝

    SQL語句檢測sp4補丁是否安裝

    如何查看sql2000 sp4補丁是否安裝成功,本文給出實現(xiàn)sql語句,需要的朋友可以了解下
    2012-12-12
  • SQL Server模糊查詢的常見方法總結(jié)

    SQL Server模糊查詢的常見方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于SQL Server模糊查詢的常見方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SQLServer查詢歷史執(zhí)行記錄的方法實現(xiàn)

    SQLServer查詢歷史執(zhí)行記錄的方法實現(xiàn)

    有的時候,需要知道近段時間SQLSERVER執(zhí)行了什么語句,本文主要介紹了SQLServer查詢歷史執(zhí)行記錄的方法實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • SQLSERVER中忽略索引提示

    SQLSERVER中忽略索引提示

    這篇文章主要介紹了SQLSERVER中如何忽略索引提示,需要的朋友可以參考下
    2014-11-11
  • 數(shù)據(jù)庫表的創(chuàng)建、管理和數(shù)據(jù)操作(實驗一)

    數(shù)據(jù)庫表的創(chuàng)建、管理和數(shù)據(jù)操作(實驗一)

    這篇文章主要介紹了數(shù)據(jù)庫中表的創(chuàng)建、管理和數(shù)據(jù)操作,感興趣的小伙伴可以參考一下
    2015-08-08

最新評論