表分区的SQL拆分/合并:实现的最佳方法是什么?

时间:2008-10-01 22:51:01

标签: sql-server partitioning

Microsoft在其MSDN entry中有关更改SQL 2005分区的信息,列出了一些可能的方法:

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

根据记录的日期(如月分区),数据在1 - 2年内传播,任何想法对于具有分区的大规模数据库(数百万条记录)最有效的方法是什么?

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

1 个答案:

答案 0 :(得分:2)

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

我已经完成了300-500m行表的分区,数据传播时间超过6 - 7年,表格插入方法是我发现最有用的方法。

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

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

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