【问题标题】:Sql Server 2008 partition table based on insert date基于插入日期的 Sql Server 2008 分区表
【发布时间】:2014-01-24 13:49:23
【问题描述】:

我的问题是关于 SQL Server 2008 中的表分区。

我有一个程序每 10 分钟左右将数据加载到一个表中。每天大约 4000 万行。

数据被 bcp'ed 到表中,需要能够非常快速地加载。

我想根据数据插入表的日期对该表进行分区。每个分区将包含某一天加载的数据。

该表应该保存最近 50 天的数据,所以我每天晚上都需要删除任何超过 50 天的分区。

我想要一个流程,将每小时加载到当前分区的数据聚合到一些聚合表中。汇总只会在最新的分区上运行(因为所有其他分区都已经汇总了),因此在 insert_date 进行分区很重要。

一般查询数据时,指定插入日期(或多个插入日期)。详细数据是从汇总数据中向下钻取查询的,由于是根据插入日期汇总的,所以查询分区表中的详细数据时总是指定插入日期。

我可以在“Insert_date”表中创建一个默认列,获取 Getdate() 的值,然后以某种方式对其进行分区吗?

我可以在“insert_date”表中创建一个列,并输入今天日期的硬编码值。

分区函数会是什么样子?

单独的表和分区视图会更适合吗?

【问题讨论】:

  • 既然没有人足够勇敢,我会发表评论。您的分区计划听起来可行,但会产生很高的管理开销,确保及时创建分区并清除(删除?)旧分区。我不确定当 Partition 列采用默认值时数据库将如何反应;可能需要在插入语句中指定它。问题一:为什么要分区呢?是因为空间还是性能原因?
  • 嗨,萨尔瓦多。感谢您的回复。两者兼而有之。这是一个非常大的数据量,需要滚动 60 天。所以每天我们都需要删除一天的数据。还有很多聚合只在最新的分区上运行。查询此数据时,通常只查询不同的分区。感谢您的 cmets,非常感谢!
  • 您所描述的正是分区策略的设计目的;这是一个很棒的教程,但我认为这个问题应该被关闭,因为它很广泛。 brentozar.com/archive/2013/01/…

标签: sql sql-server database bulkinsert partitioning


【解决方案1】:

我都试过了,尽管我认为分区表更酷。但是在尝试教后如何维护代码之后,它就是不合理的。在那种情况下,我们使用了插入语句中的硬编码字段日期字段。

现在我使用不同的表(31 天 / 31 表)+ 聚合表,并且有一个丑陋的 union all 查询将月度数据连接在一起。 优势。超级简单的 sql,以及用于 bcp 的简单 c# 代码,没有人抱怨过复杂性。

但是,如果您有基础设施和一群 .net / sql 专家,我会选择分区策略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多