【问题标题】:Database tables duplication guidelines数据库表复制指南
【发布时间】:2009-04-24 19:29:27
【问题描述】:

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

SELECT * FROM TB_TABLE WHERE TIMESTAMP = MAX(TIMESTAMP)

随着这个表变得非常大(千兆字节),我进行了过早的优化,将其拆分为两个表:一个用于所有数据(仅用于插入),另一个用于最新数据(用于插入、删除和选择)。

我想知道这种重复是否是一件好事,因为我没有指标可以证明它提高了我的应用程序性能。作为一般准则,您会推荐我所做的吗?

更新顺便说一句,我使用 MS SQL Server 2005 和 .NET C# Linq-To-Sql

【问题讨论】:

  • 测量结果了吗?
  • 不,我没有测量结果

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您没有提到您使用的是什么数据库,但我可以想到几个可能的快速优化。我们说的是多少 GB?

        1) 考虑到大量行,计算 max(timestamp) 可能会很昂贵。您可能已经知道这个值是什么,将其存储在不同的表或配置文件或其他东西中。这可能是您最大的优化。

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

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

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

        【讨论】:

          猜你喜欢
          • 2017-03-29
          • 2015-11-19
          • 2020-09-20
          • 2015-11-17
          • 2011-04-11
          • 1970-01-01
          • 2015-06-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多