CREATE TABLE DBO.TEST_INDX(id int, bla varchar(255));
CREATE INDEX IX1 ON dbo.TEST_INDX(id) WITH (DATA_COMPRESSION = PAGE);
检查压缩
SELECT i.name, p.data_compression_desc
FROM sys.partitions P
INNER JOIN sys.indexes I ON I.object_id = P.object_id AND I.index_id = P.index_id
WHERE P.data_compression > 0 and I.name = 'IX1';
结果
name data_compression_desc
IX1 PAGE
重建索引
ALTER INDEX IX1 on DBO.TEST_INDX rebuild
检查压缩
SELECT i.name, p.data_compression_desc
FROM sys.partitions P
INNER JOIN sys.indexes I ON I.object_id = P.object_id AND I.index_id = P.index_id
WHERE P.data_compression > 0 and I.name = 'IX1'
结果
name data_compression_desc
IX1 PAGE
禁用它们然后重建会产生不同的结果,因为禁用会删除索引,同时保留索引定义。
alter index IX1 on DBO.TEST_INDX DISABLE ;
alter index IX1 on DBO.TEST_INDX REBUILD ;
结果
name data_compression_desc
压缩丢失,在不调整索引创建脚本的情况下通过 SSMS 删除和创建索引时,压缩定义也会丢失。
为什么?
因为在编写索引创建语句时不会保留 data_compression 选项。
但是,如果我们禁用索引,则使用压缩重建,然后再次重建:
alter index IX1 on DBO.TEST_INDX DISABLE ;
alter index IX1 on DBO.TEST_INDX REBUILD WITH (DATA_COMPRESSION = PAGE);
alter index IX1 on DBO.TEST_INDX REBUILD;
结果
name data_compression_desc
IX1 PAGE
使用 Ola hallengren 的维护解决方案测试重建
为测试目的修改参数。
添加一些数据以到达一页,因为 MinNumberOfPages 参数需要这些数据。
INSERT INTO dbo.TEST_INDX(id,bla)
VALUES(5,'test');
go 10
Command: ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)
Comment: ObjectType: Table, IndexType: NonClustered, ImageTex
t: No, NewLOB: No, FileStream: No, ColumnStore: No, AllowPageLocks: Yes, PageCount: 1, Fragmentation: 0
Outcome: Not Executed
Duration: 00:00:00
Date and time: 2019-01-09 14:48:12
执行生成的命令
ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)
保留压缩
name data_compression_desc
IX1 PAGE
使用维护计划测试重建(我强烈主张 ola 的解决方案)
重建索引
选择测试台
添加一些测试碎片级别。
插入一些值以使碎片继续进行
INSERT INTO dbo.TEST_INDX(id)
SELECT id from TEST_INDX
go 4
检查碎片百分比
SELECT
I.[name] AS INDX ,
IPS.avg_fragmentation_in_percent,
IPS.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), object_id('[dbo].[TEST_INDX]'), NULL, NULL, NULL) AS IPS
INNER JOIN sys.indexes AS I ON I.[object_id] = IPS.[object_id]
AND IPS.index_id = I.index_id
WHERE IPS.database_id = DB_ID()
and I.name = 'IX1'
Command:USE [TestDB]
GO
ALTER INDEX [IX1] ON [dbo].[TEST_INDX] REBUILD PARTITION = ALL WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, RESUMABLE = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80, DATA_COMPRESSION = PAGE)
重建/重组索引时索引保持压缩。
创建表和压缩索引
检查压缩
结果
重建索引
检查压缩
结果
禁用它们然后重建会产生不同的结果,因为禁用会删除索引,同时保留索引定义。
结果
压缩丢失,在不调整索引创建脚本的情况下通过 SSMS 删除和创建索引时,压缩定义也会丢失。
为什么?
因为在编写索引创建语句时不会保留 data_compression 选项。
但是,如果我们禁用索引,则使用压缩重建,然后再次重建:
结果
使用 Ola hallengren 的维护解决方案测试重建
为测试目的修改参数。
添加一些数据以到达一页,因为 MinNumberOfPages 参数需要这些数据。
执行索引优化过程以打印出语句。
结果:
执行生成的命令
保留压缩
使用维护计划测试重建(我强烈主张 ola 的解决方案)
重建索引
选择测试台
添加一些测试碎片级别。
插入一些值以使碎片继续进行
检查碎片百分比
结果
运行计划
在查看计划报告时,有趣的部分是该
DATA_COMPRESSION = PAGE
选项已添加到生成的REBUILD
命令中!分片:
压缩: