针对数据库运行计算的可扩展且高效的方法

时间:2010-03-11 00:12:48

标签: sql sql-server database performance postgresql

供telsales代理使用的多租户数据库,一个包含潜在客户的表。一次向代理显示一条记录供他呼叫,在呼叫之后,代理用从结果表中取得的编码呼叫结果更新记录。在此表中,某些结果具有循环时间,之后应将记录显示给代理(任何代理)以再次调用。在实践中,80%的呼叫将导致记录像这样被回收。还会检查以限制所呼叫的总时间,呼叫的总天数以及一天内的总呼叫数。代理还可以指定在设定的日期和时间自行调用记录。

草案架构说明

展望表
PK
{联系方式}
{XML字段以启用自定义字段}
最后通话结果
最后通话日期时间
总时间称为 今天被召的时间
record_in_use_flag
(我正在考虑让前端只更新此表与潜在客户信息更新,调用结果和代理,然后触发器更新称为字段/调用日期的时间,并更新调用表。)

调用表
PK
FK到Prospect PK
呼叫结果
呼叫日期时间
代理人叫 (代理商可以更新潜在客户记录,不会跟踪这些更改,但会存储呼叫和结果的记录)

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

预定回拨表
PK
FK到Prospect PK
日期时间
代理人

我的问题

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

a)每个数据库请求记录是否应将呼叫结果循环时间添加到最后一个呼叫日期,然后过滤掉TOP 1(认为这样会慢得多)

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

1)一个单独的程序,说每10分钟一次?循环时间已经改变的结果需要重新计算

2)在一个结果更新后运行的潜在客户表上的触发器中。循环时间已经改变的结果需要重新计算 (如果结果的循环时间发生变化,这个新表将会更新)

1 个答案:

答案 0 :(得分:1)

我遇到这种情况的问题是确保两个运营商不会选择拨打同一个电话。所以OUTPUT子句可以提供帮助。

您可以创建一个能够计算下一个呼叫时间的函数,然后使用OUTPUT子句将呼叫详细信息返回给运营商。

类似的东西:

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子句的好处是它返回正在更改的行,因此它只能提供给单个运算符。