SQL大表设计


17

我对SQL Server 2008表设计有一个一般性问题。我们目前有一张桌子,容量超过600GB,每天增长约3GB。该表具有适当的索引,但由于其大小而在运行查询时正成为主要的挂断。问题是我应该按年和月将表拆分为多个表(这将适合其他部门如何拆分其大数据集),还是应该利用SQL Server内置的分区。看来使用分区将需要较少的代码更改。从我在分区时读取的内容来看,您仍然仅查询一张表,服务器处理如何获取数据。如果我们使用多表路由,则必须处理从多个表中提取数据。


1
是否需要进行任何优化:数据类型太宽,索引重叠或未使用等?
gbn

可能的是,我还没有考虑过其他优化方面的问题。你有建议吗?
HunterX3 2011年

Answers:


11

“该表具有适当的索引,但在运行查询时将成为主要的挂断”

除非SQL Server能够在运行查询时消除分区,否则单独进行分区不会帮助提高查询性能。您的WHERE子句需要与您的分区方式保持一致。我们只有一个字段可以用作分区字段,因此,如果您的WHERE子句中不包含该字段,那么即使有分区,您仍然有可能扫描整个表。

“而且仅仅是因为它的大小。”

分区可以使某些维护操作更加容易,但是仍然存在无法逐分区进行的事情。如果索引维护和统计信息更新导致您遇到问题,则最好将设计分为归档表和实时更新表。当您需要定期将数据从实时表移动到存档表时,可以这样做,以100%的填充因子重建索引,使用完全扫描更新统计信息,然后将其文件组设置为只读。分区可以帮助存档表加载-但对活动表进行分区可能没有帮助。(我在这里抛弃了一些高级概念,好像它是快速而简单的,但是我只是在这里勾勒出一些背景知识。)

“看来使用分区将需要更少的代码更改。”

Sorta kinda-乍一看就是这样,但是您越深入,就会有诸如分区视图之类的选项。您可以重命名现有表,将其放置在视图中,然后可以对基础表进行自己的更改(并添加多个表),而无需更改应用程序。

我在这里写了更多关于分区的陷阱:

http://www.brentozar.com/archive/2008/06/sql-server-partitioning-not-the-answer-to-everything/


3
该文章最喜欢引用的肯定是“分区函数和方案易于错误设计”。
Mark Storey-Smith,

7

隔离分区可能就足够了,但结合分区视图和多个表可能会获得更好的结果。这在很大程度上取决于查询和增长的模式。

当前分区的局限性在于,列统计信息仅在表中维护,而不是分区级别。如果您有一种查询模式可以从更准确的统计信息中受益,那么将表分区与分区视图结合使用可以带来显着的性能优势。

当数据的性质每月,每年,每年变化时,分区视图也可以提供帮助。想象一下,零售商不断地改变其产品线,以至于每年使用的Product.ProductId范围几乎没有一致性。由于只有一个订单/订单明细表,因此也只有一个统计直方图,因此,这些统计信息对查询优化器的作用很小。每年一个表(Order_2010,Order_2011,OrderLine_2010,OrderLine_2011)按月分区,并与分区视图(Order,OrderLine)结合,将为优化器提供更细化且可能有用的统计信息。

您可以比较轻松地引入表分区,因此从这里开始,衡量影响,然后评估分区视图是否值得进行额外的工作。

金伯利·特里普(Kimberly Tripp)发布了许多有关分区指南和白皮书,这些指南和白皮书通常被视为该主题的必读内容。肯德拉·利特尔(Kendra Little)也有一些不错的材料和其他文章的有用参考清单

性能通常是人们寻求分区的第一大原因。就个人而言,我认为使用VLDB可以将恢复时间的缩短带来相同或更大的收益。在开始之前,请花一些时间来了解部分可用性和部分还原,因为这可能会影响您采用的方法。

如果您有通过网络发送备份的不理想但并非不常见的过程,则可能需要为当前的600GB磁盘恢复3小时。在您突破1.5TB的一年中,您遇到了问题。


1
+1对于“列统计信息仅保留在一个表中”,我希望我可以再次+1以链接到Kimberly和Kendra。
Matt M

1

如您所说,您有两种选择:

  1. 使用多个表
  2. 利用分区

使用1,您可以创建一个将所有这些表合并在一起的VIEW,并对其进行更新以包括新创建的表。我认为这确实是一种模拟分区的方法。这种方法的优点包括不需要SQL Server企业版。

使用2,您可以将索引与分区对齐,并将分区与其他存储对齐。设置分区功能和分区方案后,在拆分或合并分区时便会完成此操作。此方法的优点包括不需要手动将记录移动到新表中。由于分区功能和分区方案可以为您解决这一问题。而且,正如您所说,访问数据几乎不需要更改代码。

如果您有企业版,我肯定会给您分区的外观。尽管它看起来很复杂,但确实还不错。如果没有,分区甚至不是您的选择。

创建分区表

修改分区表

设计分区以管理数据子集

希望这可以帮助,

马特


0

从您的问题来看,您似乎正在存储历史数据(日志),而您的限制似乎来自查询速度,而不是存储空间问题。对我来说分区将无济于事。

当您说自己有适当的索引时,它是否在日期字段中包含索引?使用Postgres对trunc(timestamp,day)进行索引时,我获得了良好的结果。然后,您必须确保所有查询在当天进行选择,然后再进行其他操作。请注意,带有时区的时间戳字段不可索引(因为它“移动”取决于时区),因此您需要对“固定”时间戳进行索引。


我们的判断依据是最常使用哪些字段。我们有1个群集和2个非群集,它们似乎都像广告中那样工作。我认为这更多的是问题所在。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.