<address id="thnfp"></address>

    <address id="thnfp"><th id="thnfp"><progress id="thnfp"></progress></th></address>
    <listing id="thnfp"><nobr id="thnfp"><meter id="thnfp"></meter></nobr></listing>
    以文本方式查看主題

    -  安易免費財務軟件交流論壇  (http://m.gangyx.cn/bbs/index.asp)
    --  電腦知識交流  (http://m.gangyx.cn/bbs/list.asp?boardid=11)
    ----  SQL Server2008存儲結構之堆表、行溢出 (一)  (http://m.gangyx.cn/bbs/dispbbs.asp?boardid=11&id=32401)

    --  作者:炙天
    --  發布時間:2011/1/13 8:43:25
    --  SQL Server2008存儲結構之堆表、行溢出 (一)

    堆數據表是沒有聚集索引的表。即數據行不按任何特殊的順序存儲,數據頁也沒有任何特殊的順序。數據頁不在鏈接列表內鏈接。 sys.system_internals_allocation_units 系統視圖中的列 first_iam_page 指向管理特定分區中堆的分配空間的一系列 IAM 頁的第一頁。SQL Server 使用 IAM 頁在堆中移動。堆內的數據頁和行沒有任何特定的順序,也不鏈接在一起。數據頁之間唯一的邏輯連接是記錄在 IAM 頁內的信息。

    圖片點擊可在新窗口打開查看
     

      那么堆表是如何存儲數據的呢?出于簡化的目的,我們先來構造不含任何索引的一張堆數據表,然后從簡單到復雜逐步深入探討。

    --創建一張數據表,從系統表生成測試數據


    DROP TABLE testheap


    --創建一張2個固定長度字段,3個不定長字段的表,其中4個不為空,1個可為空


    CREATE TABLE testheap


    (


      ID         INT IDENTITY(1,1) NOT NULL,


      name       VARCHAR(20) NOT NULL,


      type       CHAR(100) NOT NULL,


      other      VARCHAR(50) NOT NULL,


      describle  VARCHAR(500)


    )


    --產生1000條隨機數據,并插入表中


    DECLARE @i INT 


    SET @i=1


    WHILE @i<=1000


    BEGIN


      INSERT INTO testheap(name,type,other,describle)


      VALUES(\'name\'+CAST(@i AS VARCHAR(3)),REPLICATE(@i%4,100),FLOOR(RAND()*10),NULL)


      SET @i=@i+1


    END


    SELECT * FROM testheap


    --查詢該表的IAM頁面地址和首頁地址


    SELECT total_pages,used_pages,data_pages,


           --first_page,root_page,first_iam_page,


           testdb.dbo.f_get_page(first_page) first_page_address,


           testdb.dbo.f_get_page(root_page) root_address,


           testdb.dbo.f_get_page(first_iam_page) IAM_address


      FROM sys.system_internals_allocation_units


    WHERE container_id IN (SELECT partition_id FROM sys.partitions


                 WHERE object_id in (SELECT object_id  FROM sys.objects


                                                  WHERE name IN (\'testheap\')))



      查詢結果如下:

    total_pagesused_pagesdata_pagesfirst_page_addressroot_addressIAM_address
    2518171:2240:01:119

      即SQL Server為該表分配了總計25個頁面,實際使用了18個頁面,扣除1個IAM管理頁面,實際數據頁面為17個,IAM管理頁面地址為第一個文件的第119頁面,數據頁面的第一個頁面為第一個文件的第224頁面。

      那么如何查看到該表的頁面詳細分配情況呢?

      首先通過dbcc page(testdb,1,119,3)可以粗略看到頁面分配情況

    圖片點擊可在新窗口打開查看
     

      即SQL Server首先分配了8個混合區頁面,其次因為該對象已經超過8頁,SQL Server又分配了從第472頁到第487頁的頁面,共計16個頁面,然后包括本身的IAM頁面,共計25個頁面。


    Channel