天天看點

SQL Server誤區30日談-Day25-有關填充因子的誤區

    本系列文章是我在sqlskill.com的PAUL的部落格看到的,很多誤區都比較具有典型性和代表性,原文來自T-SQL Tuesday #11: Misconceptions about.... EVERYTHING!!,經過我們團隊的翻譯和整理釋出在AgileSharp上。希望對大家有所幫助。

誤區 #25:多個有關填充因子的誤區

都是錯誤的

25a) 填充因子是一直存在的

不是的,通過Books Online可以看到(譯者:我在新版的BOL沒有找到這句話):

重要: 

填充因子僅僅在索引建立或重建時生效,SQL Server存儲引擎并不會一直保證頁内的空閑值和填充因子保持一緻。如果為了保證頁内的空餘值和指定的填充因子保持一直那麼填充因子就會失去意義。因為這時頁即使不滿也需要進行分頁。

25 b)填充因子0和100是不同的

錯誤,由BOL的一句話可以看到

    填充因子0和100在各個方面都是一個意思。

25 c)填充因子設定為0會在非葉子節點保留  空間

    這時錯誤的,這一點BOL上沒有說,我也不知道這個誤區從何而來,但這絕對是錯誤的。你可以通過如下代碼證明這一點:

CREATE DATABASE foo; 

GO 

USE foo; 

CREATE TABLE t1 (c1 INT 

IDENTITY, c2 CHAR (1000) DEFAULT 'a'); 

CREATE CLUSTERED INDEX t1c1 ON t1 

(c1); 

SET NOCOUNT ON; 

INSERT INTO t1 DEFAULT VALUES; 

GO 10000

    接下來設定填充因子為0并重建索引

SELECT [fill_factor] FROM sys.indexes 

WHERE NAME = 't1c1' AND [object_id] 

= OBJECT_ID ('t1'); 

ALTER INDEX t1c1 ON t1 REBUILD WITH (FILLFACTOR = 

100); 

GO

    上面的代碼執行後,通過檢視既定頁中的m_freeCnt列的值,也就是頁中可用空間的值:

EXEC sp_allocationMetadata 't1'; 

DBCC TRACEON (3604); 

DBCC PAGE (foo, 1, 164, 3); -- the root page, from the SP output 

DBCC PAGE (foo, 1, 162, 1); -- the page ID in the DBCC PAGE output above 

  通過上面代碼可以看到值為10,也就是說業内不存在保留白間。這時一個誤區,有關上面sp_allocationMetadata的實作細節請看這篇博文:this blog post。

分類: SQL Server DBA誤區

本文轉自CareySon部落格園部落格,原文連結:http://www.cnblogs.com/CareySon/archive/2013/01/22/2871202.html,如需轉載請自行聯系原作者