数据库表复制指南

时间:2009-04-24 19:29:28

标签: .net sql-server database linq-to-sql

我有一个恒定的数据流量。必须使用时间戳将所有数据存储到数据库中。数据以5分钟为间隔,在伪SQL代码中以相同的间隔选择最新数据:

SELECT * FROM TB_TABLE WHERE TIMESTAMP = MAX(TIMESTAMP)

随着这个表变得非常大(千兆字节),我做了一个过早的优化,将它分成两个表:一个用于所有数据(仅用于插入),另一个用于最新数据(用于插入,删除和选择)。 / p>

我想知道这种重复是否是一件好事,因为我没有指标来证明它提高了我的应用程序性能。作为一般指导方针,你会推荐我做的吗?

更新 BTW我使用MS SQL Server 2005和.NET C#Linq-To-Sql

4 个答案:

答案 0 :(得分:2)

将具有高输入卷的表拆分为写优化的“最近”表和读取优化的“存档”表通常是非常好的优化。它确实增加了复杂性,因此您不希望在不需要的地方执行此操作,但如果您确定相关表格将获得大量数据,那么这是合理的。

答案 1 :(得分:2)

我不推荐你采取的方法。如果目的是提高应用程序性能,那么首先收集性能指标会更合适。如果随着数据量的增长趋势表明性能下降,那么很明显一些数据库更改是合适的。

假设您主要关心的是针对大型表的选择性能,那么应用好的索引和将“select *”替换为您想要的列等步骤可能比在多个表中复制数据更好。如果您的查询有大量连接,我可以看到对您的性能产​​生负面影响。在这种情况下,创建一个不需要在查询中加入联接的附加表将是一个很好的优化。

答案 2 :(得分:1)

您没有提到您正在使用的数据库,但我可以想到几种可能的快速优化。我们在谈论几千兆字节?

1)在给定大量行的情况下,计算max(时间戳)可能很昂贵。您可能已经知道这个值是什么,将它存储在不同的表或配置文件中。这可能是你最大的优化。

2)添加另一列以标记最近的更新。当您开始更新SET recent = false WHERE recent = true时,请使用recent = true写入所有记录。您可以通过向其添加where条件来限制索引的大小 “TB_TABLE”上的CREATE INDEX foo_index(最近)WHERE recent = true;

3)确保您的数据库服务器已正确优化。确保您的密钥和排序缓冲区的大小适合您的数据集。大多数开源数据库都是为开发人员的工作站预先调整的,而不是生产工作负载。

4)重新考虑您的架构。您确定需要所有记录吗?您是否记录了所有数据而不仅仅是更改的数据?在这种情况下,我已经很好地利用了两个时间戳,一个是最后一次加载的时间戳,另一个是最后一次更改的时间戳。

答案 3 :(得分:1)

我想知道表分区是否有用。我没有亲自使用它,所以不能从经验中说话,但这听起来像是使用它的适当情况。