我正在研究表分区,我还有一些不清楚的地方。
我创建了一个分区函数来组织过去三个月的数据。
CREATE PARTITION FUNCTION PartitioningBy3meses (datetime)
AS RANGE LEFT FOR VALUES (getdate()-90, getdate()-1);
GO
方案:
CREATE PARTITION SCHEME PartitionByVejes
AS PARTITION PartitioningBy3meses
TO (datosmuyviejos, datosviejos, [PRIMARY]);
GO
我使用向导对现有表进行分区,这是它为我生成的代码:
BEGIN TRANSACTION
ALTER TABLE [dbo].[factura] DROP CONSTRAINT [PK__factura__3213E83F22FEA7FF] WITH ( ONLINE = OFF )
ALTER TABLE [dbo].[factura] ADD PRIMARY KEY NONCLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
CREATE CLUSTERED INDEX [ClusteredIndex_on_PartitionByVejes_637678578300644842] ON [dbo].[factura]
(
[fecha]
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PartitionByVejes]([fecha])
DROP INDEX [ClusteredIndex_on_PartitionByVejes_637678578300644842] ON [dbo].[factura]
COMMIT TRANSACTION
GO
疑点:
- 为了在分区之间传播数据,主索引是否变为非聚集索引?
- 为什么会创建 ClusteredIndex_on_PartitionByVejes_637678578300644842 索引然后删除?
- 随着时间的流逝,数据是否会在分区之间自行移动,还是我必须做一些事情才能使其移动?
不可以。表分区的要求是唯一的聚集索引键必须显式包含分区列。由于
fecha
不是现有主键的一部分,向导通过使用非聚集索引重新创建主键约束,然后创建临时聚集索引来对数据进行分区来保留现有主键。最终结果是分区堆和非分区非聚集主键索引。这可能不是您想要的,但向导不会进行架构更改(例如添加fecha
到您的主键)。您需要在使用向导之前执行此操作,或者直接使用 T-SQL 而不是使用向导。不,滑动窗口分区维护不是自动的。您需要安排一个 T-SQL 脚本来根据需要执行维护。SSMS 包括一个管理分区向导,一旦对表进行分区,右键单击该表即可使用该向导。
请注意,表和索引必须存储对齐才能有效地执行滑动窗口维护。对于您问题中的表,这意味着
fecha
必须是主键的一部分。由于您是表分区的新手,我建议您仔细阅读分区文档以了解限制和性能影响,以确保它适合您的情况。