数据库性能:对列与单独表进行过滤

Sem*_*mez 9 database postgresql performance database-design

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

我在数据库中有一个显然包含所有订单的Orders表.但这些都是字面上的所有订单,因此包括刚刚标记为"完整"的完整/已完成订单.从所有未结订单我想要计算一些东西(如开放金额,未清项目等).什么会更好的表现明智:

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

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

这些方法中是否有(明确的)性能差异?

(顺便说一下,我在PostgreSQL数据库上.)

sle*_*ske 7

这是数据库设计中的常见问题:是否要分离或"归档"不再"活动"的记录的问题.

最常见的方法是:

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

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

注意:

仅存储"存档"数据的表通常称为"存档表".有些DBMS甚至为这些表(例如MySQL)提供了特殊的存储引擎,这些表经过优化,可以快速检索和提高存储效率,但代价是缓慢的更改/插入.


S.L*_*ott 6

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

是.他们称之为数据仓库.人们这样做是因为它加速了交易系统,以消除几乎没有用过的历史.首先,表格在物理上更小,处理速度更快.其次,长期运行的历史报告不会干扰事务处理.

这些方法中是否有(明确的)性能差异?

是.奖金.您可以重新构建历史记录,使其不再是3NF(用于更新),而是用于星型模式(用于报告).优点是巨大的.

购买Kimball的The Data Warehouse Toolkit一书,了解有关星型模式设计的更多信息,并将历史记录从活动表迁移到仓库表中.