Sql Server專題一:索引(上)

來源:互聯網
上載者:User

標籤:頁   資料頁   區   

        寫在前面的廢話索引問題已經是老生常談的問題,雖然被經常說起,但作為我來說,至今沒有用過索引(很可怕吧),我作為MS-BI實施工程師居然沒用過索引,說話自然沒底氣。之前對索引的瞭解停留在“知道”的地步上,隨著時間的流逝感覺不真正將索引應用起來簡直是渣渣!廢話到此為止,開始索引專題,為了徹徹底底(我不是DBA,能將索引理解達到熟練使用即可,所以並不徹底)搞懂索引,從資料頁學習吧!本篇主要來源MS的聯機文檔!

  •      頁和區系統結構

    頁:SQL Server中資料存放區的基本單元便是頁。為資料庫中的資料檔案分配的磁碟空間可以從邏輯上劃分成頁(從0到N連續編號)。磁碟的I/O操作在頁層級執行。也就是說SQLSERVER讀取或寫入所有資料頁。

    怎樣理解呢?作為儲存單位,這裡給個不恰當的比喻:一個養豬場,有很多豬圈,每個豬圈看作儲存資料的頁。作為飼養員的我,假設我對養豬場的豬進行買賣,我的操作對象是豬沒錯,但是,其實我們也是在豬圈的基礎上進行買賣,首先,我會對豬圈進行編號,然後,去買賣不同編號裡的豬。所以可以理解為:我把豬(資料)養在不同編號(磁碟空間從邏輯上劃分成0到N連續編號)的豬圈(頁)裡面,我買賣(I/O操作)這些豬,都是來自各個豬圈的。

    頁的大小為8K。每頁的開頭是96位元組的標題,用於儲存有關頁的資訊。此資訊包括:頁碼,頁類型,頁的可用空間以及擁有該頁的對象的配置單位ID。

    這句話好理解:每個豬圈能養幾頭豬(8k),每個豬圈有個豬圈牌,豬圈牌上寫點啥呢?當然要寫:幾號豬圈,是公豬圈、母豬圈、還是豬崽圈,已經養了幾頭豬以及這個豬圈的負責人連絡方式。

    下面列出MSSQL中資料頁的種類(公豬圈、母豬圈、還是豬崽圈):

     

    頁類型

    內容

    Data

    當 text in row 設定為 ON 時,包含除 text、  ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 資料之外的所有資料的資料行。

    Index

    索引條目。

    Text/Image

    大型物件資料類型:

    ·          text、 ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 資料。

    資料行超過 8 KB 時為可變長度資料類型列:

    ·          varchar、nvarchar、varbinary 和 sql_variant

    Global  Allocation Map、Shared Global Allocation Map

    有關區是否分配的資訊。

    Page  Free Space

    有關頁分配和頁的可用空間的資訊。

    Index  Allocation Map

    有關每個配置單位中表或索引所使用的區的資訊。

    Bulk  Changed Map

    有關每個配置單位中自最後一條 BACKUP LOG 語句之後的大容量操作所修改的區的資訊。

    Differential  Changed Map

    有關每個配置單位中自最後一條 BACKUP  DATABASE 語句之後更改的區的資訊。

    在下來看看豬圈的樣子吧:

    650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/71/87/wKioL1XTT5GC9sFSAABnicuNgrs645.jpg" title="豬圈圖.png" alt="wKioL1XTT5GC9sFSAABnicuNgrs645.jpg" />

    上面是一個頁的樣本圖:注意,在資料頁上,資料行緊接著標題按順序放置,頁的末尾是行位移表,對於頁中的每一行,每個行位移表都包含一個條目,每個條目記錄對應行的第一個位元組與頁首的距離(行位移量之前一直不理解,現在我理解的就是,假設每頭豬不會動的按照行排列在豬圈中,每頭豬距離豬圈門口的距離就是位移量,當然這個距離-行位移量也像豬圈牌一樣是記錄在另一個“牌子”上的,只不過它不按照123的順序記錄,是倒敘的)。行位移表中的條目的順序與頁中行的順序相反(至於為什麼是相反的順序,我猜是從資料結構等等高深的角度考慮吧,暫且理解為寫這個行位移量豬牌的人,站在豬圈尾端,先看到了最後一頭豬,所以倒著記錄了,沒準MS就是這麼設計的,哈哈!)。

至此,MS的這個豬圈看似可以養豬了,但是,一種極端的情況呢?這頭豬,變異了,豬腿超級大,一個豬圈養不下怎麼辦!注意力,注意了,看MS怎辦了:行不能跨頁,但是行的部分可以移出行所在的頁,因此行實際可能非常大(看到一頭沒有腿的小豬,不要嫌棄它小,沒準的腿比大象的還粗!)。對了,將豬腿切下來,單獨放……下面是MS的具體做法:頁的單個行中的最大資料量和開銷是8060位元組(8K);但是不包括用Text/Image頁類型儲存的資料(為什麼不包括這些類型的頁呢?原因很簡單,有些豬圈是經過特別設計的專門存放超大豬的,是整個豬,不是一個豬腿。),包括varchar ,nvarchar,varbinary或sql_variant列的表不受此限制的約束。當表中的所有固定列和可變列的行的總大小超過限制的8k時,SQL SERVER將從最大的列開始動態將一個或者多個可變長度列移動到 ROW_OVERFLOW_DATA配置單位中的頁。(自述:將表中列移動到其他頁)。每當插入或更新操作將行的總大小增大到超過限制的 8,060 位元組時,將會執行此操作。將列移動到 ROW_OVERFLOW_DATA 配置單位中的頁後,將在 IN_ROW_DATA 配置單位中的原始頁上維護 24 位元組的指標。如果後續操作減小了行的大小,SQL Server 會動態將列移回到未經處理資料頁。

本文出自 “SeaSky” 部落格,請務必保留此出處http://seasky09.blog.51cto.com/7243998/1685740

Sql Server專題一:索引(上)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.