从多个表和数据库查询数据的最佳方法是什么?

时间:2009-04-15 15:02:06

标签: sql sql-server sql-server-2000

我有5个数据库,代表该国的不同地区。在每个数据库中,有几百个表,每个表有10,000-2,000,000个事务记录。每个表都是相应区域中客户的表示。这些表中的每一个都具有相同的模式。

我想查询所有表,就好像它们是一个表一样。我能想到的唯一方法是创建一个联合所有表的视图,然后只针对它运行我的查询。但是,客户表将一直在变化(因为我们获得和失去客户),因此我必须更改我的视图的查询以包括新表(或删除不再使用的表)。

有更好的方法吗?

修改

回应评论时,(我也将此作为对答案的回复):

在大多数情况下,我不会删除任何表格,它们将保留用于历史目的。正如我在一篇回复中发表评论时,其想法是减少较小客户(一个只有10,000条记录)的时间来查询自己的历史记录。大约有1000个客户平均有1,000,000行(并且正在增长)。如果我要将所有记录添加到一个表中,那么该表中将有近十亿条记录。我还以为我正在计划未来,因为当我们说5000个客户时,我们没有一个包含所有交易记录的巨型表(这可能是我的想法中的错误)。那么,最好不要像我一样划分记录吗?我应该将它们全部混合到一张桌子里吗?对客户ID进行索引是否可以防止向小客户查询数据的延迟?

5 个答案:

答案 0 :(得分:7)

我认为您的设计可能会被打破。为什么不将一个表与区域和客户列一起使用?

如果我是你,我会考虑重构一个表,如果有必要(例如反向兼容),我会使用视图提供与前面表格相同的信息。


编辑以回复此帖子的OP评论:

如果你使用正确的索引,一个包含10 000 000 000行的表就可以了。构建数据库服务器是为了应对这种卷。

性能绝对不是将一个这样的表分成数千个小表的正当理由!

答案 1 :(得分:2)

同意Brann,

这是一个疯狂的DB Schema Design。为什么不选择(或者可以选择更改)单个规范化结构,其中列按区域过滤,并且区域数据库中的每个表分隔的条件。

在这种结构中,你会遇到一些非常大的(~500个表)联合视图,你必须像系统中出现新表一样定期动态重新生成。

答案 2 :(得分:2)

如果几百个表并且每个具有相同的架构

,该系统的体系结构闻起来需要一种截然不同的方法。

为什么要添加或删除表?这不应该在任何正常情况下发生。

答案 3 :(得分:0)

2种解决方案 1.通过解析5个数据库中的所有表名来编写一个为您构建视图的存储过程,并像手工一样构建带有union的视图。

  1. 使用一个表创建一个新数据库,并在每个示例中每晚导入该表中所有表的所有记录。

答案 4 :(得分:0)

听起来像是卡在多租户和单租户数据库之间的某个地方。具体来说,您将其存储为“轻型”多租户(单独的表与单独的数据库),但查询为单租户,一个查询来统治它们。

在短期内,您的数据访问层会动态选择要查询的表,而不是将所有内容组合在一起进行一次超级查询。

从长远来看,选择一种方法并坚持下去。一个数据库和一个表或许多数据库。

以下是有关该主题的一些帖子。

What are the advantages of using a single database for EACH client?

http://msdn.microsoft.com/en-us/library/aa479086.aspx