【发布时间】:2011-10-07 15:30:09
【问题描述】:
假设我们有 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 分区时,它更像是直接预先选择仅查找的列的数据。
评论?
【问题讨论】:
标签: sql-server-2008 database-partitioning