SQL Server數(shù)據(jù)庫中表和索引結(jié)構(gòu)存儲的原理及如何加快搜索速度分析
本文詳細(xì)分析了SQL Server中表和索引結(jié)構(gòu)存儲的原理以及對于如何加快搜索速度和提高效率等方面做了詳細(xì)的分析,以下是主要內(nèi)容。...
本文詳細(xì)分析了SQL Server中表和索引結(jié)構(gòu)存儲的原理以及對于如何加快搜索速度和提高效率等方面做了詳細(xì)的分析,以下是主要內(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)表進(jìn)而,對于這個分區(qū)下面的每個分配單元,都有一個連接指向根頁。數(shù)據(jù)頁之間通過前后指針互相聯(lián)系,是一個完整的樹形結(jié)構(gòu)。在樹的底層,會有一個連接指向真正的數(shù)據(jù),連接的形式是文件號+頁號+行號,而真正的數(shù)據(jù)是以堆的形式存放的。如下圖所示:
3. 具有聚集索引的表
表中的聚集索引,對應(yīng)的索引號是1。它有一個對應(yīng)的分區(qū),該分區(qū)下的每個分配單元都有一個連接指向根頁。對于聚集索引來說,葉子結(jié)點(diǎn)里存放的是真正的數(shù)據(jù),而不是非聚集索引那樣的連接。如下圖所示:
非聚集索引與聚集索引具有相同的 B 樹結(jié)構(gòu),它們之間的顯著差別在于以下兩點(diǎn):
基礎(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是一樣的,如果希望進(jìn)一步查看某一個索引的具體信息,可以使用下面的命令,如查看72057594067419136的信息。
從這個圖當(dāng)中,我們可以看到這個分區(qū)只有一個分配單元,IN_ROW_DATA表明此分配單元只用來存放具體數(shù)據(jù),共5353頁,已使用5346頁,數(shù)據(jù)占用5320頁。
如果希望查看根頁的位置,可以使用下面的命令:
但需要注意,這里顯示的根頁的位置是0xEC0100001100,由于存儲的關(guān)系,用倒序的方式對它進(jìn)行解析,也就是0x0011000001EC,最前面的兩個字節(jié)表明是所在的文件組編號,后面的4個字節(jié)是頁的編號,即(1,0x01CE) ,換成十進(jìn)制(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)境中,還是要謹(jǐn)慎行事。
原文鏈接:https://www.cnblogs.com/zxtceq/p/7920431.html
- SQL Server Page數(shù)據(jù)庫結(jié)構(gòu)深入分析
- 基于Sql server數(shù)據(jù)庫的四種分頁方式總結(jié)
- SQL Server 2016數(shù)據(jù)庫快照代理過程詳解
- SQL Server 全文搜索功能、全文索引方式介紹
- 關(guān)于SQL Serve數(shù)據(jù)庫r帳號被禁用的處理方法
- SQL數(shù)據(jù)庫查詢優(yōu)化技巧提升網(wǎng)站訪問速度的方法
- SQL數(shù)據(jù)庫開發(fā)中的SSIS 延遲驗證方法
- SQL Server數(shù)據(jù)庫建立新用戶及關(guān)聯(lián)數(shù)據(jù)庫的方法教程
- Oracle數(shù)據(jù)庫多條sql執(zhí)行語句出現(xiàn)錯誤時的控制方式
- Oracle數(shù)據(jù)庫基礎(chǔ):程序中調(diào)用sqlplus的方式
SQL Server Page數(shù)據(jù)庫結(jié)構(gòu)深入分析
SQL Server存儲數(shù)據(jù)的基本單元是Page,每一個Page的大小是8KB,數(shù)據(jù)文件是由Page構(gòu)成的。在同一個數(shù)據(jù)庫上,每一個Page都有一個唯一的資源標(biāo)識,標(biāo)識符由三部分組成...
基于Sql server數(shù)據(jù)庫的四種分頁方式總結(jié)
下面小編就為大家分享一篇基于sqlserver的四種分頁方式總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧。...
SQL Server 2016數(shù)據(jù)庫快照代理過程詳解
本文我們通過SQL Server 2016一個實例數(shù)據(jù)表,給大家詳細(xì)分析了快照代理過程遇到的問題和解決辦法,并對快照生成過程做了詳細(xì)說明,以下是全部內(nèi)容:...
SQL Server 全文搜索功能、全文索引方式介紹
SQL Server 的全文搜索(Full-Text Search)是基于分詞的文本檢索功能,依賴于全文索引。全文索引不同于傳統(tǒng)的平衡樹(B-Tree)索引和列存儲索引,它是由數(shù)據(jù)表構(gòu)成的,稱作倒轉(zhuǎn)索引(Invert Index),存儲分詞和行的唯一鍵的映射關(guān)系。...
關(guān)于SQL Serve數(shù)據(jù)庫r帳號被禁用的處理方法
若發(fā)現(xiàn)SQL Serve所有帳號不小心被禁用了,這個時候怎么辦?用重裝嗎?不用,仔細(xì)看小白是怎么一步一步解開這個謎題的。首先需要Windows帳號設(shè)置里重新添加一個新帳號。并將其添加到...
SQL數(shù)據(jù)庫查詢優(yōu)化技巧提升網(wǎng)站訪問速度的方法
在這篇文章中,我將介紹如何識別導(dǎo)致性能出現(xiàn)問題的查詢,如何找出它們的問題所在,以及快速修復(fù)這些問題和其他加快查詢速度的方法?! ∧阋欢ㄖ溃粋€快速訪問的網(wǎng)站能讓用...
SQL數(shù)據(jù)庫開發(fā)中的SSIS 延遲驗證方法
驗證是一個事件,該事件在Package執(zhí)行時,第一個被觸發(fā),驗證能夠避免SSIS引擎執(zhí)行一個有異常的Package或Task。延遲驗證(DelayValidation)是把驗證操作延遲到Package真正運(yùn)行(run-ti...
SQL Server數(shù)據(jù)庫建立新用戶及關(guān)聯(lián)數(shù)據(jù)庫的方法教程
本文講的是SQLserver數(shù)據(jù)庫創(chuàng)建新用戶方法以及賦予此用戶特定權(quán)限的方法,非常的簡單實用,有需要的小伙伴可以參考下...
Oracle數(shù)據(jù)庫多條sql執(zhí)行語句出現(xiàn)錯誤時的控制方式
多條sql執(zhí)行時如果在中間的語句出現(xiàn)錯誤,后續(xù)會不會直接執(zhí)行,如何進(jìn)行設(shè)定,以及其他數(shù)據(jù)庫諸如Mysql是如何對應(yīng)的,這篇文章將會進(jìn)行簡單的整理和說明。環(huán)境準(zhǔn)備使用Oracle的精簡...
Oracle數(shù)據(jù)庫基礎(chǔ):程序中調(diào)用sqlplus的方式
通過sqlplus可以連接數(shù)據(jù)庫根據(jù)用戶權(quán)限進(jìn)行數(shù)據(jù)或者設(shè)定操作,但是需要交互操作并返回結(jié)果,這篇文章介紹一下如何在程序中使用sqlplus。環(huán)境準(zhǔn)備使用Oracle的精簡版創(chuàng)建docker...