日期:2014-05-16  浏览次数:20555 次

数据库分配空间问题
T-SQL查询一书中说:当表或索引需要更多的空间以存储数据时,SQL Server为该对象分配一个完整的区。但有一个例外:如果该对象不足64KB,则当需要更多空间时,SQL Server通常只分配一个单独的页,而不是整个区。

问题:
①如果该对象(比如表)在第一次建立插入数据的时候,数据量很小,如果不满一页,这时候是分配一个完整的区还是只分配就一个页?
②如果该对象该对象初始化的时候分配了整个区,那么是不是当需要更多的空间时,超过一个区的部分如果小于一页的话那就在混合区分配一个页?如果超过一个区的部分如果大于一页的话那么就会再分配一个新的区而不是在混合区分配一个页?

以上,欢迎高手解答。。。
------解决方案--------------------
没啥数据的新表放混合区,如果表数据量足够放8页,而且做了索引重建之类的动作,就放统一区了
------解决方案--------------------
DBCC TRACEON(3604,1)
DBCC IND(AdventureWorks2012,test,1)
--得到結果中pagetype為10的為IAM頁 , 我這邊為PagePID 24130
--查看IAM頁的內容,數據量少時
DBCC PAGE(AdventureWorks2012 , 1 , 24130 , 3)
/*
 IAM: Single Page Allocations @0x000000000F4AA08E   --8個單獨分配頁的分配情況

Slot 0 = (1:24124)                  Slot 1 = (0:0)                      Slot 2 = (0:0)
Slot 3 = (0:0)                      Slot 4 = (0:0)                      Slot 5 = (0:0)
Slot 6 = (0:0)                      Slot 7 = (0:0)                      


IAM: Extent Alloc Status Slot 1 @0x000000000F4AA0C2  --統一區的分配情況

(1:0)        - (1:28280)    = NOT ALLOCATED   
 */
 --再插入一些數據
 INSERT INTO test (  productid,  orderid,shipmentquantity, valueid,valuestr, productname )
 VALUES (  3,  '8',  8,  '8',  'aaaaaaaaa',  'bbbbbbb' )
 GO 1000
 --再看看IAM頁的情況
 DBCC PAGE(AdventureWorks2012 , 1 , 24130 , 3)
 /*
  IAM: Single Page Allocations @0x000000000B24A08E --8個單獨分配頁都已經用掉了

Slot 0 = (1:24124)                  Slot 1 = (1:24131)                  Slot 2 = (1:24132)
Slot 3 = (1:24133)                  Slot 4 = (1:24342)                  Slot 5 = (1:24343)
Slot 6 = (1:24360)                  Slot 7 = (1:24361)                  


IAM: Extent Alloc Status Slot 1 @0x000000000B24A0C2 --統一區的分配情況

(1:0)        - (1:24360)    = NOT ALLOCATED    &nb