数百万条记录的单表与多表

时间:2011-04-15 03:40:48

标签: sql-server-2008 sql-server-2008-r2 database-partitioning

这是场景,旧数据库有这种设计

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

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

现在它们都被“应用程序编号”索引并且具有相同数量的列(实际上是56列..)

现在我尝试了

select * from Table1998

select * from TableAllYears where Year=1998 

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

所以对你们这些人来说,我只是缺少一些东西,或者是比单桌更好的多桌?

4 个答案:

答案 0 :(得分:2)

您应该按年对表进行分区,这几乎相当于每年都有不同的表。这样,当您按年查询时,它将针对单个分区进行查询,性能会更好。

答案 1 :(得分:0)

如果您正在寻找1998年的数据,那么在一张表中只有1998年的数据是可行的方法。这是因为数据库不必“搜索”记录,但知道此表中的所有记录都来自1998年。尝试将“WHERE Year = 1998”子句添加到Table1998表中,你应该得到一个比较好一点。

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

答案 2 :(得分:0)

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

因此,在这种情况下,为字段Year添加新索引。

答案 3 :(得分:0)

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

无论如何,140k行都不算什么,将它分成多个表可能会过早优化,如果需要跨多年查询数据,甚至会造成重大的性能损失。