微软在其 MSDN 中 入口 关于更改 SQL 2005 分区,列出了几种可能的方法:

  • 使用所需的分区函数创建一个新的分区表,然后使用 INSERT INTO...SELECT FROM 语句将旧表中的数据插入到新表中。
  • 在堆上创建分区聚集索引
  • 使用带有 DROP EXISTING = ON 子句的 Transact-SQL CREATE INDEX 语句删除并重建现有分区索引。
  • 执行一系列 ALTER PARTITION FUNCTION 语句。

您知道对于基于记录日期进行分区(例如每月分区)且数据分布超过 1-2 年的大型数据库(数百万条记录)最有效的方法是什么吗?

另外,如果我主要访问(用于读取)最近的信息,那么在过去 X 天保留一个分区是否有意义,而所有其余数据将是另一个分区?或者最好也对其余数据进行分区(对于基于日期范围的任何随机访问)?

有帮助吗?

解决方案

我推荐第一种方法 - 创建一个新的分区表并插入其中 - 因为它使您可以轻松地比较新旧表。您可以针对两种样式的表测试查询计划,并在切换到新的表设计之前查看查询是否确实更快。您可能会发现没有任何改进,或者您可能想在确定最终结果之前尝试几种不同的分区函数/方案。您可能希望按日期范围以外的其他内容进行分区 - 日期并不总是有效。

我已经对 300-500m 行表进行了分区,数据分布超过 6-7 年,而表插入方法是我发现最有用的方法。

您询问如何分区 - 最好的答案是尝试设计分区,以便您的查询将命中单个分区。如果您倾向于将查询集中在最近的数据上,并且如果您在 where 子句中过滤该日期字段,那么是的,对最近 X 天有一个单独的分区。

请注意,您必须在 where 子句中指定分区字段。如果您没有指定该字段,那么查询可能会访问每个分区来获取数据,此时您将不会获得任何性能提升。

希望有帮助!我已经做了很多分区,如果您想发布一些表结构和查询的示例,这将帮助您为您的环境获得更好的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top