我正在维护一个拥有超过数百万用户的彩票网站。一些活跃用户(可能超过30,000)将在1秒内购买超过1000个彩票。 现在当前的逻辑使用select ....进行更新以确保帐户余额,但同时数据库服务器过载并且处理速度很慢?我们必须实时处理它们。
以前有没有人见过类似的场景?
答案 0 :(得分:5)
首先,您需要设计一个满足业务规则的事务系统。暂时忘记磁盘和内存,以及发生了什么。尝试设计一个尽可能轻量级的系统,它可以满足您的业务规则所需的最小锁定量。
现在,运行系统,会发生什么?如果表现可以接受,恭喜你,你已经完成了。
如果性能不可接受,避免猜测问题的诱惑,并开始进行调整。您需要分析系统。您需要了解花费最多时间的地方,以便了解调整工作的重点领域。最简单的方法是使用SQL_TRACE跟踪它。您没有提及Oracle版本,版本或平台。所以,我假设你至少在某个版本的10gR2上。因此,使用DBMS_MONITOR来开始/结束跟踪。现在,范围界定在这里很重要。我的意思是,启动跟踪,运行要分析的代码然后立即关闭跟踪非常重要。这样,您只跟踪您感兴趣的内容,并且配置文件不会包含任何无关的信息。获得跟踪文件后,需要对其进行处理。有几种工具。最常见的是TkProf,它由Oracle提供,但实际上并没有做得很好。我所知道的最好的免费分析器是OraSRP。下载OraSRP的副本,并检查您的结果。报告中的数据应指向正确的方向。
完成所有这些后,如果您仍有疑问,请在此处提出新问题,我相信我们可以帮助您解释OraSRP的输出,以帮助您了解瓶颈所在。
希望有所帮助。
答案 1 :(得分:2)
就个人而言,我会锁定/更新内存中的帐户并将数据库更新为后台任务。使用此方法,您可以轻松支持数千个更新和帐户。
答案 2 :(得分:2)
:一种。无需修改代码即可加快速度:
1 - 您可以将表完全保留在内存中(即SGA - 因为它也在磁盘上):
alter table t storage ( buffer_pool keep )
(在做之前与你的dba讨论)
2 - 如果表格太大并且您反复更新相同的行,可能只需使用缓存属性即可:
alter table t cache
此命令在LRU列表中以最佳优先级使用时放置表的块,因此从SGA中老化的机会较少。 这是对差异的一种解释:ask tom
3 - 另一个需要更多分析和资源的高级解决方案是TimesTen
B.加快数据库操作:
识别顶级查询并:
您是否确定了一个热门查询?