情况
- Sql Server 2008 Enterprise 上的数据仓库
- 36+ 百万行堆(不要问),60+ 列
- 每月增加 750k
- 没有定义主键(我现在已经确定了一个)
- 无压缩
我在想做什么(按此顺序)
- 添加页面级压缩
- 添加PK
- 添加多个非聚集索引
- 尽快执行此操作
问题
- 最终:我是先添加PK还是页面压缩?(有关系吗?)
- 如果我先将压缩添加到表中,那么任何索引都会继承表级压缩设置吗?这个特定问题的答案是“不,压缩不是继承的”,可在 dba.stackexchange 上找到
我现在倾向于什么
-- Add page level compression
alter table dbo.TableName
rebuild with (data_compression = page)
;
go
-- Add primary key
alter table dbo.TableName
add constraint PK_TableName
primary key clustered (<Columns>)
;
go
-- Add NC_IXs here
...
...
我看过这里(PK 创建文档)和这里(ALTER TABLE 文档),但看不到任何关于任何索引是否继承表压缩设置的明确信息。 这个特定问题的答案是“不,压缩不是继承的”,可在 dba.stackexchange 上找到
聚集索引实际上就是表。假设您的主键是集群的,那么我将创建一个具有页面级压缩的集群主键,而不是尝试分两步完成。
我还将大约 100k 行复制到临时(临时物理而不是#temporary)表并运行一些测试。尝试先运行压缩,先运行集群密钥,然后尝试将它们作为一个步骤进行。看看什么跑得最快。我想这将是个人的一步:)。
无论哪种方式,页面压缩都会对大量数据进行洗牌。我估计首先进行压缩会导致整体 I/O 减少,因为集群操作将读取压缩页面。