如果数据跨越多个表而不修改查询,SQL Server是否可以自动从多个表中读取?

时间:2011-07-07 18:16:56

标签: sql sql-server tsql sql-server-2008

我有一张名为'customer'的表,其行数太多而且决定通过名为InsertedDate的日期列将表拆分为多个表。数据跨越2009-2011。

我想把每年都放在自己的桌子上。因此,2009年的客户会进入一个名为“customer2009”的表格,依此类推。

我说我有一个类似的查询:

SELECT LastName
  FROM Customer 
 WHERE InsertedDate BETWEEN '12/20/2009' 
                        AND '01/15/2010'

SQL Server中是否有一个功能(在Enterperise版本中?),如果它得到这样的查询,它会智能地知道从不同的表中获取数据。我问的原因是我不想将查询修改为:(有数百个查询)

SELECT LastName 
  FROM Customer2009
 WHERE InsertedDate >= '12/20/2009' 
UNION
SELECT LastName 
  FROM Customer2010 
 WHERE InsertedDate <= '01/15/2010'

如果存在良好的资源,我想阅读白皮书以及最佳实践和架构来完成此类事情。

增加:

我的问题的要点是我想知道SQL Server中是否存在内置的企业功能。不要手动破解需要由人修改和维护的解决方案。

5 个答案:

答案 0 :(得分:12)

查看SQL Server 2005 +中的table partitioning

答案 1 :(得分:3)

您可以创建一个视图:

create view vCustomer
as
SELECT LastName 
FROM Customer2009
WHERE InsertedDate >= '12/20/2009' 
UNION
SELECT LastName 
FROM Customer2010 
WHERE InsertedDate <= '01/15/2010'

当然,你仍然需要更新你的存储过程,但这会更容易一些。

SELECT LastName
FROM vCustomer 
WHERE InsertedDate BETWEEN '12/20/2009' AND '01/15/2010'

答案 2 :(得分:0)

可能是view - 是解决方案吗?为什么不这样呢?

答案 3 :(得分:0)

我认为你最好的选择(假设你坚持使用这个有点奇怪的架构)正在构建一个查看所有这些表的视图。

CREATE OR REPLACE VIEW vw_all_customers AS
SELECT * FROM Customer2009
UNION
SELECT * FROM Customer2010
...
;

这个视图让你有能力做这样的事情:

SELECT LastName
FROM vw_all_customers
WHERE InsertedDate >= '12/20/2009' 
AND InsertedDate <= '01/15/2010'

答案 4 :(得分:0)

您可以考虑两个选项:内置分区功能(由 Joe Stefanelli 提出)和手动分区,其中涉及创建分区视图。分区视图有一些限制,但它们也使您可以使用其他硬件资源,例如在不同的SQL Server实例之间拆分数据。您可以找到一些有用的信息here