2017-06-22 54 views
1

我在填充因子为100%的数据库中有大约250 GB的索引。为了提高性能,我想将填充因子降低到95%。SQL Server:在填充因子小于100%后预计有多少指数增长

因此,在将填充因子应用于我的索引之前,我想知道在应用95%填充因子后索引大小将增长多少。

我期望的是,索引尺寸总数的5%会增长是正确的吗?

+0

本质上是的,我不会建议盲目做所有索引思想,挑选不断更新和重新排列的具体的 – dbajtr

+0

谢谢,这将有助于, 是的,我不会去运行它盲目。我只想清理我的音乐会,以便我可以了解我需要多少空间。 所以,只是想确认,可以说如果我将所有索引的填充因子应用为90%,那么我的全部索引大小将增加10%? –

回答

0

我在想这个昨晚上和逻辑上它将使意义,所以我决定来测试它:

- 创建测试表

CREATE TABLE TableIndexTest (id INT, id2 INT, var VARCHAR(100)) 

--Populate一些有意义的数据

DECLARE @num  INT = 1000000 
DECLARE @var  VARCHAR(100) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ' 
DECLARE @num2 INT = 1000000 
DECLARE @iter INT = 1000000 
DECLARE @num_curr INT = 1 
WHILE (@num_curr <= @num) 
BEGIN 
    INSERT TableIndexTest (id, id2, var) SELECT @num_curr, @num_curr, @var 
    SELECT @num_curr = @num_curr + 1 
END 

- 用fillfactor创建一些索引

CREATE NONCLUSTERED INDEX ix_test_fillfactor100 ON TableIndexTest ([id], [id2], [var]) 
CREATE NONCLUSTERED INDEX ix_test_fillfactor90 ON TableIndexTest ([id], [id2], [var]) WITH (FILLFACTOR = 90) 
CREATE NONCLUSTERED INDEX ix_test_fillfactor80 ON TableIndexTest ([id], [id2], [var]) WITH (FILLFACTOR = 80) 
CREATE NONCLUSTERED INDEX ix_test_fillfactor70 ON TableIndexTest ([id], [id2], [var]) WITH (FILLFACTOR = 70) 
CREATE NONCLUSTERED INDEX ix_test_fillfactor60 ON TableIndexTest ([id], [id2], [var]) WITH (FILLFACTOR = 60) 
CREATE NONCLUSTERED INDEX ix_test_fillfactor50 ON TableIndexTest ([id], [id2], [var]) WITH (FILLFACTOR = 50) 

- 检查索引大小

SELECT 
    i.name AS IndexName, 
    SUM(s.used_page_count) * 8 AS IndexSizeKB 
FROM sys.dm_db_partition_stats AS s 
JOIN sys.indexes AS i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id 
WHERE s.[object_id] = OBJECT_ID('TableIndexTest') 
GROUP BY i.name 
ORDER BY SUM(s.used_page_count) * 8; 

预期结果将是,该指数将填充因子设置为50将不填充因子集索引的一半大小(Server的默认为0,因此将基本上100) 。

结果:

IndexName    IndexSizeKB 
ix_test_fillfactor100   52008 
ix_test_fillfactor90   57176 
ix_test_fillfactor80   64480 
ix_test_fillfactor70   73952 
ix_test_fillfactor60   85752 
ix_test_fillfactor50   103328 

所以填充因子50 * 2 = 104016时预计将103328但考虑到该指数的最后一页可能只有它的1行,我认为它非常接近这样你可以安全地使用这种计算