我有一个关于sql Server 2008表设计的一般问题.我们目前有一张超过600GB的桌子,每天增长约3GB.此表具有适当的indecies,但在运行查询时仅因其大小而成为主要的挂起.问题是我应该按年和月将表拆分成多个表(这适用于其他部门如何拆分其大型数据集),还是应该利用sql Server内置的分区.似乎使用分区将需要更少的代码更改.从我在分区时读到的内容,您仍然只查询一个表,服务器处理如何获取数据.如果我们进入多表路由,我们将不得不处理从多个表中提取数据.
解决方法
“这个表有适当的缺点,但在运行查询时成为主要的挂断”
除非sql Server能够在运行查询时消除分区,否则单独进行分区无助于查询性能.您的WHERE子句需要与您的分区方式对齐.我们只使用一个字段作为分区字段,因此如果WHERE子句中不包含该字段,尽管有分区,您仍然可能会扫描整个表.
“而且仅仅是因为它的大小.”
分区可以使某些维护操作更容易,但仍然有一些我们无法在逐个分区的基础上做的事情.如果索引维护和统计信息更新导致问题,最好将设计拆分为归档表和实时更新表.当您需要定期将数据从实时表移动到存档表时,可以执行此操作,使用100%填充因子重建索引,使用完全扫描更新统计信息,然后将其文件组设置为只读.分区可以帮助归档表加载 – 但是分区活动表可能不会. (我在这里抛出了几个高级概念,好像它快速而简单,但我只是在这里勾勒出一些背景.)
“似乎使用分区将需要更少的代码更改.”
Sorta有点 – 乍一看它看起来很那么,但你进入它的次数越多,你就有了分区视图等选项.您可以重命名现有表,将视图放在其位置,然后您可以对基础表进行自己的更改(并添加多个表),而无需更改应用程序.
我在这里写了更多关于分区的陷阱:
http://www.brentozar.com/archive/2008/06/sql-server-partitioning-not-the-answer-to-everything/