将伪分区表合并到单个视图中

时间:2011-10-07 15:30:10

标签: sql-server-2008 database-partitioning

让我们说我们有5张桌子

Fact_2011
Fact_2010
Fact_2009
Fact_2008
Fact_2007

每个只存储表名称扩展所指示的年份的事务。

然后,我们在每个表上创建一个单独的索引,并将“Year”列作为索引的第一列。

最后,我们创建一个视图vwFact,它是所有表的并集:

SELECT * FROM Fact_2011
UNION
SELECT * FROM Fact_2010
UNION
SELECT * FROM Fact_2009
UNION
SELECT * FROM Fact_2008
UNION
SELECT * FROM Fact_2007

然后执行如下查询:

SELECT * FROM vwFact WHERE YEAR = 2010

或在不太可能的情况下,

SELECT * FROM vwFact WHERE YEAR > 2010 

将这些查询与按年度实际分区数据进行比较的效率是多少还是基本相同?对于这些伪分区表中的每一个都有Year的索引,需要防止SQL引擎浪费超过一小部分时间来确定包含所寻找日期范围之外的记录的物理表是不值得扫描?或者,这种伪分区方法究竟是MS分区(按年)正在做什么?

在我看来,如果执行的查询是

SELECT Col1Of200 FROM vwFact WHERE YEAR = 2010 

真正的分区具有明显的优势,因为伪分区首先必须执行视图以从Fact_2010表中拉回所有列,然后过滤到最终用户所在的一列选择,同时使用MSSQL分区,它将更多地直接选择所搜索列的数据。

评论

1 个答案:

答案 0 :(得分:3)

我已经在SQL Server 2000上实现了分区视图并取得了巨大成功

确保您对每个表都有一个检查约束,将年份列限制为年份。所以在Fact_2010表上,它将是Check Year = 2010

然后还使视图UNION ALLs不仅仅是UNION

现在当您查询视图一年时,它应该只访问1个表,您可以使用执行计划验证这一点

如果您没有检查约束,它将触及属于视图的所有表

  

真正的分区会有明显的优势,因为   伪分区首先必须执行视图以撤回所有   Fact_2010表中的列然后过滤到一个列   最终用户正在选择的列

如果你有约束,那么优化器足够智能,只需要你需要的表