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

Sql server 2008 将伪分区表合并到单个视图中,sql-server-2008,database-partitioning,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 * FRO

假设我们有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\u 2010
表中提取所有列,然后过滤到最终用户正在选择的一列,而使用MSSQL分区时,这将更多地是一个直接的预先选择,只寻求专栏的数据


评论?

我在SQL Server 2000上成功地实现了分区视图

确保在每个表上都有一个检查约束,该约束将年份列限制为年份。因此,在事实_2010表上,它将是检查年份=2010年

然后还要使视图成为并集,而不仅仅是并集

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

如果没有适当的检查约束,它将接触视图中的所有表

这种真正的分区将具有明显的优势,因为 伪分区首先必须执行视图以收回所有 从Fact_2010表中选择列,然后向下筛选到 最终用户正在选择的列


如果您有适当的约束条件,那么优化器就足够聪明,只需访问您需要的表

假设您的“确保”评论为真(我希望是这样):-),这是一个需要了解的大量信息,对我来说,这是一个令人惊讶的事实!事后想一想:在所有事实表的并集上按年索引不是比在每个物理表上按年单独索引更合适吗?此外,虽然UNION ALL更明确,是更好的选择,但我不认为UNION如何在给定约束的情况下返回不同的结果。评论?非常感谢你的回答。我喜欢它。必须维护索引视图,这样所有更新、删除和插入都会变慢。此外,您的数据库中需要更多空间来存储这些内容view@Chad当前位置关于UNION ALL vs UNION,这不是关于结果是否不同,而是关于摆脱UNION所做的绝对不必要的排序(因为隐含的区别)。