为了账号安全,请及时绑定邮箱和手机立即绑定

SQL Server误区:有关填充因子的误区

标签:
SQL Server

    本系列文章是我在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。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消