2

这里的情景多个表,旧的数据库具有这种设计单表,相较于数百万条记录

dbo.Table1998 
dbo.Table1999 
dbo.Table2000 
dbo.table2001 
... 
dbo.table2011 

的,我合并所有的数据1998年至2011年在此表中dbo.TableAllYears

现在他们都通过“申请号”现在索引,具有列数相同(实际上是56列。)

当我试图

select * from Table1998 

select * from TableAllYears where Year=1998 

第一查询有139669行@13秒 而第二个查询具有相同的行数,但@30秒

所以对于你们,我是,我只是失去了一些东西或者多个表比单个表好?

+0

如果你能告诉我们你正在使用哪个数据库服务器?和版本可以让你很好的答案。首先,您可以查看按年份或月份对表进行分区,并可能在要运行的查询类型上添加非聚集索引。对于SQL Server [从这里开始](http://msdn.microsoft.com/en-us/library/ms345146(SQL.90).aspx) – 2011-04-15 03:47:49

+0

MS SQL Server 2008 r2 – Leary 2011-04-15 04:19:58

+0

@ Sanjeevakumar - 对于迟到的回复抱歉,我没有注意到你的评论... – Leary 2011-04-15 04:20:44

回答

2

您应该每年对表格进行分区,这几乎相当于每年有不同的表格。通过这种方式,当您按年份查询时,它将针对单个分区进行查询,并且性能会更好。

+0

谢谢,我会尝试这种方法。我从来没有想过这个... – Leary 2011-04-15 04:08:17

0

如果你正在寻找1998年的数据,那么只有1998年的数据是一个表格。这是因为数据库不必“搜索”记录,但知道该表中的所有记录都是从1998年开始的。尝试将“WHERE Year = 1998”子句添加到Table1998表中,并且应该得到比较好一点。

就我个人而言,我会将数据保存在多个表中,特别是如果它是一个特别大的数据集,并且您不必频繁地对旧数据进行查询。即使你这样做了,你也可能想要创建一个包含所有表数据的视图并运行报表,而不必查询多个表。

+0

哇!那很快......我期待着得到我的答案汤姆。 – Leary 2011-04-15 03:47:10

+0

哇!你是对的!当我添加一个条件,TableAllYears提取更快... – Leary 2011-04-15 03:48:38

+0

Table1998 = 10秒@ 139669行,而TableAllYears 8秒@ 139969 ... – Leary 2011-04-15 03:49:45

0

尝试在您搜索的每个列上删除索引(where子句)。这应该会加快查询的速度。

所以在这种情况下,为字段Year添加一个新的索引。

+0

yup的索引。我尝试过...但是有时候,多张桌子仍然赢... – Leary 2011-04-15 04:05:31

+0

你能举一个例子,它的速度更快吗? – 2011-04-15 04:11:24

+0

选择TableAllYears *从Table1998 = 7秒@ 139669行 和 选择*其中年份= 1998 = 13秒@ 139669行 – Leary 2011-04-15 04:17:47

0

我相信你应该使用一张表。不可避免地,您需要跨多年查询数据,并将其分隔成多个表格是一个问题。可以优化查询和表结构,以便表中可以有数百万行,并且仍然具有出色的性能。请确保您的年份列已编入索引,并包含在您的查询中。如果你确实遇到了数据大小的限制,你可以在MySQL 5中使用分区功能,允许它将表数据存储在多个文件中,就像它是多个表一样,同时使它看起来像是一个表。

无论如何,140k行不算什么,它可能会过早地将其分割成多个表格,如果您需要跨多年查询数据,甚至会对性能造成严重影响。