方法-在进行下一笔交易之前先检查余额

时间:2018-08-17 12:58:43

标签: sql sql-server

我正在寻找使用SQL表构建简单SMS计费功能的最佳方法。

我有一种将短信购买到表格中的机制:例如+1000。

我将有正在执行的事务,并且随着SMS的使用,每次将减少-1。

我需要有一个流程,在处理交易之前,首先要检查余额是否大于1。

我在这里担心的是,在每-1次SMS交易之前,我需要先检查余额,然后仅在余额高于+1时才处理SMS交易,这可能会对性能产生不利影响。

实现此目标的“绩效”方法是什么?如下所示的“正在运行的总余额”?

TID  amt  balance user_Id
--- ----- ------- -------
1    +100   100     a
2    -1      99     a
3    -1      98     a
4    -1      97     a
5    -1      96     a

一个查询以检查运行总计值,如果该值为正,则执行运行余额更新并继续?

这个比例如何?该表每秒可能有数百个这样的事务执行。

谢谢

2 个答案:

答案 0 :(得分:0)

您可以将运行总计计算为:

select t.*, sum(amt) over (partition by user_id order by tid) as balance
from t;

这是否满足您的性能需求尚不确定。您可能需要添加触发器以维护每个user记录中的余额,以便可以随时访问最新值。

答案 1 :(得分:0)

您的问题很难回答,这取决于许多折衷方案。

每秒数百次的交易不是一个很大的负担,我将以构建“干净”的方式而不用反规范化开始。

很笼统地说,只要您的数据库可以使用索引进行搜索,从许多事务中计算SUM不会比从一条记录中读取SUM明显慢。

在现实世界中,预计算实际上可能较慢。使用触发器来更新预先计算的值可能会较慢(额外的查找/事务),而由于要进行额外的查找和计算工作,更新正在运行的总计可能会较慢。

我将构建一个负载测试环境,并继续针对实际的,可观察到的性能挑战进行优化,而不是预先进行优化。