【发布时间】: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