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

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

sql索引碎片產生的原理 解決碎片的辦法(sql碎片整理)

2024-07-16 17:45:45
字體:
來源:轉載
供稿:網友
本文需要你對索引和SQL中數據的存儲方式有一定了解

在SQL Server中,存儲數據的最小單位是頁,每一頁所能容納的數據為8060字節.而頁的組織方式是通過B樹結構(表上沒有聚集索引則為堆結構,不在本文討論之列)如下圖:

    BTree

    在聚集索引B樹中,只有葉子節點實際存儲數據,而其他根節點和中間節點僅僅用于存放查找葉子節點的數據.

    每一個葉子節點為一頁,每頁是不可分割的. 而SQL Server向每個頁內存儲數據的最小單位是表的行(Row).當葉子節點中新插入的行或更新的行使得葉子節點無法容納當前更新或者插入的行時,分頁就產生了.在分頁的過程中,就會產生碎片.

 

 

理解外部碎片

    首先,理解外部碎片的這個“外”是相對頁面來說的。外部碎片指的是由于分頁而產生的碎片.比如,我想在現有的聚集索引中插入一行,這行正好導致現有的頁空間無法滿足容納新的行。從而導致了分頁:

   1

     因為在SQL SERVER中,新的頁是隨著數據的增長不斷產生的,而聚集索引要求行之間連續,所以很多情況下分頁后和原來的頁在磁盤上并不連續.

     這就是所謂的外部碎片.

     由于分頁會導致數據在頁之間的移動,所以如果插入更新等操作經常需要導致分頁,則會大大提升IO消耗,造成性能下降.

     而對于查找來說,在有特定搜索條件,比如where子句有很細的限制或者返回無序結果集時,外部碎片并不會對性能產生影響。但如果要返回掃描聚集索引而查找連續頁面時,外部碎片就會產生性能上的影響.

     在SQL Server中,比頁更大的單位是區(Extent).一個區可以容納8個頁.區作為磁盤分配的物理單元.所以當頁分割如果跨區后,需要多次切區。需要更多的掃描.因為讀取連續數據時會不能預讀,從而造成額外的物理讀,增加磁盤IO.

 

理解內部碎片

    和外部碎片一樣,內部碎片的”內”也是相對頁來說的.下面我們來看一個例子:

    2

    我們創建一個表,這個表每個行由int(4字節),char(999字節)和varchar(0字節組成),所以每行為1003個字節,則8行占用空間1003*8=8024字節加上一些內部開銷,可以容納在一個頁面中:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平顺县| 临海市| 新疆| 本溪| 集贤县| 花垣县| 山东省| 黑河市| 柘荣县| 突泉县| 兴隆县| 长垣县| 安陆市| 克东县| 武定县| 中江县| 临邑县| 互助| 松原市| 辛集市| 凯里市| 邛崃市| 陇南市| 元谋县| 桂东县| 广宁县| 普宁市| 安康市| 邮箱| 马关县| 松原市| 麟游县| 武清区| 西盟| 广丰县| 南开区| 固阳县| 平潭县| 崇义县| 孙吴县| 定西市|