我有一张名为'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中是否存在内置的企业功能。不要手动破解需要由人修改和维护的解决方案。
答案 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