数据库性能 : filtering on column vs. 分表

标签 database performance database-design postgresql

我想知道以下情况的最佳方法是什么:

我在数据库中有一个订单表,显然包含所有订单。但这些实际上是所有订单,因此包括刚刚标记为“完成”的完整/完成的订单。我想从所有未清订单中计算一些东西(如未清金额、未清项目等)。什么是更好的性能明智:

保留 1 个包含所有订单的订单表,包括完整/存档的订单,并通过过滤“完成”标志进行计算?

或者我应该创建另一个表,例如'Orders_Archive',以便订单表仅包含我用于计算的未结订单?

这些方法有任何(明显的)性能差异吗?

(顺便说一句,我在 PostgreSQL 数据库上。)

最佳答案

这是数据库设计中的一个常见问题:是否分离或“归档”不再“活跃”的记录的问题。

最常见的方法是:

  • 所有内容都在一张表中,根据需要将订单标记为“完成”。优点:最简单的解决方案(代码和结构方面),良好的灵 active (例如易于“恢复”订单)。缺点:表可能会变得非常大,这对于查询和例如查询都是一个问题。备份。
  • 将旧资料归档到单独的表格中。解决了第一种方法中的问题,但代价是更加复杂。
  • 使用基于值的分区表。这意味着逻辑上(对应用程序而言)一切都在一个表中,但在幕后,DBMS 根据某些列的值将内容放入不同的区域。您可能会使用“完成”列或“订单完成日期”进行分区。

最后一种方法结合了前两种方法的优点,但需要 DBMS 的支持并且设置起来更复杂。

注意:

只存储“归档”数据的表通常称为“归档表”。一些 DBMS 甚至为这些表提供特殊的存储引擎(例如 MySQL),这些引擎经过优化以允许快速检索和良好的存储效率,但代价是缓慢的更改/插入。

关于数据库性能 : filtering on column vs. 分表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4032078/

相关文章:

python - 忽略旧的UDP数据包Python

database - Facebook 隐私权限设计

sql - 在 Sql Server Azure 中的用户之间共享表行

mysql - 无法连接到mysql数据库[phpmyadmin]

sql-server - 仅当为空时才在表中的字段上设置默认值

c - 使 C 代码运行得更快

performance - SSE2 : How To Load Data From Non-Contiguous Memory Locations?

mysql - Facebook 风格的消息系统架构设计

mysql - 科学实验时间序列数据库

c++ - (链接)Visual Studio 2010 中 Berkeley DB 的问题