2017-11-18 82 views
0

考虑以下情形,SQL复杂的计算和更新批量记录

我有 表A,表 B和 表C.

在这些上面的表格需要得到更新其记录为每计算公式在规则时间间隔的各栏中。 (例如24小时一次。)

所以我尝试了存储过程,并在作业调度程序中通过编写查询来更新记录。

当我执行过程时,由于每个表中有5000条记录,执行并完成SQL Server管理工作室将被吊死15到20分钟。

因此,我将更新过程拆分为3个独立的过程,并根据记录数将每个过程的执行时间记录为1分钟。

即使该过程的优化后,

  1. 什么样的交易提供所需要的更新,以避免异常的数据?
  2. 是否有任何其他的可能性来保持服务器超时问题?

我的DB计划信息:

我开发租赁系统产品。 在该房间信息将在表1中提供。 已租用客户信息将在表2中提供。 租用房间及其租客发票将在表3中提供 租用房间及其租客收据将在表4中可用

第1步:需要计算所有承租人的总到期金额,以天为单位的费用,在表中记录中更新的while循环中的每个发票的月份费用。

步骤2:需要定期计算每张发票的总滞纳金。 (注:后期费用将根据同一发票的每天计算基础而变化。)

因此,我将所有租赁的公用表格存储在表5中,并以其各自的计算值为基础。 为此,我创建了一个用于计算所有数据的通用存储过程,并基于用户定义的函数将它更新到表5.

我从表5中获取所有报告和网格。

问题说明: 即使我已经优化了程序,当我执行它时,它大约需要大约150秒。

问题:如何实现此操作的事务以及如何通过避免同一表中的任何死锁和其他数据必须同时访问时以正确的方式进行操作?

+1

您是否需要每次更新所有记录?如果您需要更新已更改的记录,请在上次更新后添加日期时间列,如“LastModifiedOn”。然后,您可以只更新这些“LastModifiedOn”日期大于上次更新的记录。 – gotqn

+0

我有最后修改的列,基于它必须每天运行更新记录 –

+1

请向我们显示您的存储过程,5000条记录根本不考虑巨大。还请解释存储过程正在做什么 – Squirrel

回答

0

如果您正在使用游标,我有这个建议

试图改变它的加入(如果可能)

,如果你使用的是“交易”和你的光标,如果它不会损坏您的数据尝试将其带入游标并在光标处提交而不是结束查询后