SQL Server误区30日谈-Day25-有关填充因子的误区

本文澄清了关于SQL Server中填充因子的三个常见误区,包括填充因子是否一直存在、填充因子0与100的区别以及填充因子设为0时是否会在非叶子节点保留空间等问题。
    本系列文章是我在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; 
GO 
CREATE TABLE t1 (c1 INT 
IDENTITY, c2 CHAR (1000) DEFAULT 'a'); 
CREATE CLUSTERED INDEX t1c1 ON t1 
(c1); 
GO 
SET NOCOUNT ON; 
GO 
INSERT INTO t1 DEFAULT VALUES; 

GO 10000
 

    接下来设置填充因子为0并重建索引

SELECT [fill_factor] FROM sys.indexes 
WHERE NAME = 't1c1' AND [object_id] 
= OBJECT_ID ('t1'); 
GO 
ALTER INDEX t1c1 ON t1 REBUILD WITH (FILLFACTOR = 
100); 
GO


 

    上面的代码执行后,通过查看既定页中的m_freeCnt列的值,也就是页中可用空间的值:

EXEC sp_allocationMetadata 't1'; 
GO 
DBCC TRACEON (3604); 
DBCC PAGE (foo, 1, 164, 3); -- the root page, from the SP output 
GO 
DBCC PAGE (foo, 1, 162, 1); -- the page ID in the DBCC PAGE output above 
GO

 

  通过上面代码可以看到值为10,也就是说业内不存在保留空间。这时一个误区,有关上面sp_allocationMetadata的实现细节请看这篇博文:this blog post。

分类: SQL Server DBA误区



本文转自CareySon博客园博客,原文链接:http://www.cnblogs.com/CareySon/archive/2013/01/22/2871202.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值