我正在寻找使用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
一个查询以检查运行总计值,如果该值为正,则执行运行余额更新并继续?
这个比例如何?该表每秒可能有数百个这样的事务执行。
谢谢
答案 0 :(得分:0)
您可以将运行总计计算为:
select t.*, sum(amt) over (partition by user_id order by tid) as balance
from t;
这是否满足您的性能需求尚不确定。您可能需要添加触发器以维护每个user
记录中的余额,以便可以随时访问最新值。
答案 1 :(得分:0)
您的问题很难回答,这取决于许多折衷方案。
每秒数百次的交易不是一个很大的负担,我将以构建“干净”的方式而不用反规范化开始。
很笼统地说,只要您的数据库可以使用索引进行搜索,从许多事务中计算SUM不会比从一条记录中读取SUM明显慢。
在现实世界中,预计算实际上可能较慢。使用触发器来更新预先计算的值可能会较慢(额外的查找/事务),而由于要进行额外的查找和计算工作,更新正在运行的总计可能会较慢。
我将构建一个负载测试环境,并继续针对实际的,可观察到的性能挑战进行优化,而不是预先进行优化。