如何确定何时创建一个新表来保存可以从查询中获取的数据?


8

我们有一个付款表,代理商可以得到付款佣金。佣金基于几个不同的因素,例如获得付款所花的时间,因此在确定代理人获得的佣金率时需要进行一些计算,但是没有什么复杂的事情。

例如,它可能永远不会比这更复杂:

SELECT Payments.Amount * CASE 
    WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 1 THEN Rates.Rate1
    WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 2 THEN Rates.Rate2
    ELSE Rates.Rate3 END

建立第二个表来保存此数据而不是在需要时查询它是否有意义?还是我应该坚持使用运行时查询来在需要时提取数据?

更重要的是,在确定是否需要查询数据时是否应该运行查询,或者是否应该将数据存储在自己的单独表中时,应使用哪些因素?


2
一个关键问题是“人们多久查询一次此数据?” 它是报告,还是应用程序中流量大的屏幕?
ConcernedOfTunbridgeWells

@ConcernedOfTunbridgeWells在这种情况下,该报告每月运行几次,如果我们让代理商自己运行报告以查看其佣金,则可能会更频繁。
雷切尔

最好将其构建为一个通宵的报告表,而佣金是“截至昨晚”。如果您有需要关闭然后需要报告的关闭流程,则可以在应用程序中提供强制重新构建的功能。
ConcernedOfTunbridgeWells

根据我的经验,“ AsOf”日期在财务环境中与这类操作相当普遍。因此,具有这样的“ AsOf”日期的表(如@ConcernedOfTunbridgeWells注意)应该是完全可以接受的。
swasheck 2012年

Answers:


8

如果查询很少运行(例如,报告),则动态构建表可能会更好1。如果查询经常运行,并且性能需要临时表,则可能存在问题。

  • 如果该表的构建成本很低,则可以将其作为临时表使用。只要数据库足够快,您就可以摆脱它。但是,您将需要密切注意性能。

  • 如果该表不必完全是最新的,而是将成为相对频繁的报告活动的主题,那么定期重建可能是最好的方法。

  • 如果该表的构建成本很高,但需要更新,则可能需要将其作为非规范化结构进行管理,既可以作为索引视图维护,也可以通过触发器维护。这相当复杂,并且给写操作增加了负担。

    在更极端的情况下(即,大数据量),您可能需要一种混合方法,其中从针对性能优化的非规范化结构中查询历史数据,并从实时应用程序中查询当前数据。

    最极端的情况可以让您进入低延迟数据集市提要和混合OLAP解决方案,因此就兔子洞的深度而言,这是迄今为止最复杂的。除非您有真正的要求,否则最好避免。

在上述情况下,定期重建报告表听起来很合适。如果您需要在一天中关闭以运行报告,则可以提供一种从应用程序强制进行更新的功能。否则,将其运行在一个通宵的过程中,代理商可以“在前一个工作日的午夜时分”看到其佣金。

select into在SQL Server上,创建临时表的1条查询非常快,因为插入操作的日志记录最少。

因此,总而言之,您使用以下因素来确定是否应该为数据创建一个新表:

  • 多久需要一次数据
  • 获取数据有多昂贵
  • 数据需要如何更新

1
因此,基本上,用于确定是否需要永久数据表而不是在需要时查询数据的两个因素是how often the data is neededhow expensive the query is
雷切尔2012年

2
@Rachel-而且,“数据需要如何更新?”
ConcernedOfTunbridgeWells

9

公认的答案中未涉及的一个问题是“您是否会随着时间的推移需要此值”和“公式可能会更改”。

例如,考虑委员会的例子。如果支付了佣金,则应存储该金额,因为这是实际支付金额的历史数字。计算佣金的方式可能在下个月发生变化(并且经常发生),但这不会改变必须单独存储的实际支付金额。

这与存储客户实际为产品支付的价格(在计算折扣等之后)的想法相同,而不是依靠价格表的公式进行除初始计算之外的任何操作,因为下个月的产品价格可能不会与客户订购时的价格相同。

如果您需要历史记录,说明某个时间点的值是什么,请始终在使用公式进行初始计算后存储该值。


谢谢,做出此类决定时绝对要考虑这一点。这次,该值不会改变,因为在获得客户后,每个代理商和每个客户都会设置一次佣金率,并且所使用的费率基于付款日期和我们收到客户的日期,而这两者都不是是变化的价值。
拉切尔

@Rachel-您当前都不打算更改这些值。当然,如果它们确实发生了变化,那么只要您不忘记该问题,就可以随时在需要时创建历史数据表。
psr 2012年

0

如果您被锁定在一个特定的数据库中,可能不会引起您的兴趣,但是MariaDB(基于MySQL的工作方式)具有一种称为“虚拟列”的奇妙功能,可以即时计算或缓存在实际存储中,但可以自动进行根据需要重新计算。自多年前离开FileMaker Pro进入SQL世界以来,我就一直错过此功能...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.