sql - 针对数据库运行计算的可扩展和高性能方式

标签 sql sql-server database performance postgresql

供电话销售代理使用的 Multi-Tenancy 数据库,一个表包含潜在客户的电话。一次向代理显示一条记录供他调用,在调用之后,代理使用从结果表中获取的编码调用结果更新记录。在这个表中,一些结果有一个循环时间,之后记录应该显示给代理(任何代理)以再次调用。实际上,80% 的调用将导致记录像这样被回收。还有检查限制总通话次数、总通话天数、一天总通话次数。代理还可以指定在设定的日期和时间自己回拨记录。

用于说明的架构草案

前景表
对战
{联系方式}
{启用自定义字段的 XML 字段}
最后通话结果
最后通话日期时间
总通话次数
今天的时代
record_in_use_flag
(我正在考虑让前端仅使用潜在客户信息更新、调用结果和代理来更新此表,然后触发器更新称为字段/调用日期的时间并更新调用表。)

调用表
对战
FK到前景PK
调用结果
调用日期时间
调用代理
(代理可能会更新潜在客户记录,这些更改不会被跟踪,但会存储调用和结果的记录)

结果表
结果代码(PK)
以分钟为单位的回收时间

计划回调表
对战
FK到前景PK
日期时间
代理

我的问题

选择下一个应调用的记录的最佳方式是什么?我已经决定在潜在客户表中存储最后一次通话的详细信息和一些计算信息(通话时间等),因此不需要连接到通话表。

a) 每个数据库请求记录是否应将调用结果循环时间添加到上次调用日期,然后筛选出 TOP 1(认为这会很慢)

b) 我是否应该为潜在客户表中需要再次调用的每条记录创建另一个具有潜在客户 PK、到期调用日期时间的表。可以通过以下方式更新:

1) 每 10 分钟运行一次的单独程序?回收时间发生变化的结果需要重新计算

2) 在结果更新后运行的潜在客户表上的触发器中。循环时间发生变化的结果需要重新计算 (如果结果的回收时间发生变化,将更新此新表)

最佳答案

我遇到这种情况的问题是确保两个运算符(operator)不会选择调用相同的电话。所以 OUTPUT 子句可以提供帮助。

您可以创建一个计算下一次通话时间的函数,然后使用 OUTPUT 子句将通话详细信息返回给运算符(operator)。

类似于:

UPDATE c SET NextCallTime = dbo.GetNextCallTime(CallID)
OUTPUT deleted.* --Which returns the copy of the row before the change is made
FROM 
(SELECT TOP 1 * FROM Calls ORDER BY NextCallTime) c
;

我不喜欢认可标量函数,但它会在这种情况下起作用,因为您只会调用它一次。在函数中添加注释以明确表示永远不会在 ORDER BY 子句或 WHERE 子句等中调用它...

使用 OUTPUT 子句的好处是它返回正在更改的行,因此它只能提供给单个运算符(operator)。

关于sql - 针对数据库运行计算的可扩展和高性能方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2421667/

相关文章:

c# - 找不到对象 "dbo.course",因为它不存在或您没有权限

mysql - MySQL创建表时出现错误1604

.net - 为什么 SqlConnection 在交易中途关闭?

mysql - 将 LEFT JOIN 分成一些列

sql - SQL 中的 ddmmyyyy 到 sql 日期时间

sql - 如何在 Visual FoxPro 中插入多行?

sql-server - 从远程服务器上的另一个作业调用 SQL 代理作业?

node.js - 在 OSX 上安装和运行 MongoDB

mysql - 无PK表

SQL Server 具有相同架构的多个数据库