1

我有一个完全空白的自定义表(DatabaseLogFixLog),只有一个名为“refRecId”的字段/列。我将它加入到 SysDatabaseLog(日志)。计划是批量更新SysDatabaseLog,当我更新SysDatabaseLog时,我会插入我更新的行的recId。我的 SysDatabaseLog 中有 370 万条记录。我已经尝试过如下所示的notexists join 和outer join。我的代码有什么问题?两者都只是完全锁定了我的系统,调试器不会进入循环。

外联:

updateCounter = 10;
while select forupdate log
    order by CreatedDateTime, RecId
    outer join databaseLogFixLog
    where databaseLogFixLog.RefRecId != log.RecId
{
    counter++;

    if (counter > updateCount)
        break;

    info(strfmt("%1", counter));
}

info(strfmt("Done updating %1", counter));

Notexists 加入:

updateCounter = 10;
while select forupdate log
    order by CreatedDateTime, RecId
    notexists join databaseLogFixLog
    where databaseLogFixLog.RefRecId == log.RecId
{
    counter++;

    if (counter > updateCount)
        break;

    info(strfmt("%1", counter));
}

info(strfmt("Done updating %1", counter));
4

2 回答 2

1

我认为我不会使用“forupdate”关键字循环遍历如此庞大的数据集,而是使用一个表缓冲区进行循环(日志)和另一个表缓冲区进行更新(logUpdate)。

我可以想象系统在循环 3.7 条磨机记录时挂起,并且在运行查询时,您必须等到它最终进入 while-select。

此外,请确保 RefRecId 在表上有索引,这样数据库引擎就不会运行全表扫描来尝试在 databaseLogFixLog 中查找行。

于 2012-08-08T06:39:42.457 回答
1

你的两个连接是不等价的,你的外连接是完全错误的。

你存在加入会起作用,但它必须对你的日志记录(370 万)进行排序,这需要一些时间。它还必须检查您的logFixLog记录是否存在(对于 370 万中的每一个),您需要在该RefRecId字段上建立一个索引以加快速度。

如果您想要速度,请删除该order by子句。

您也可以尝试添加firstfast关键字,它有时会给出更快的初始结果(但很少与 结合使用order by)。

最后,选择要更新的字段,尤其要避免容器字段,因为该字段不与其他字段一起存储。

于 2012-08-08T09:39:02.210 回答