我有一个完全空白的自定义表(DatabaseLogFixLog),其中只有一个名为"refRecId“的字段/列。我加入了SysDatabaseLog (日志)。计划是批量更新SysDatabaseLog,当我更新SysDatabaseLog时,我将插入我更新过的行的recId。我的SysDatabaseLog有370万张唱片。我已经尝试过不存在的连接和外部连接,如下所示。我的密码怎么了?两者都完全锁定了我的系统,调试器不会进入循环。
外连接:
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));不存在连接:
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));发布于 2012-08-08 09:39:02
你的两个连接不是等价的,你的外部连接是完全错误的。
您的存在将加入将工作,但它将必须排序您的日志记录(370万),女巫将需要一些时间。此外,它还必须检查您的logFixLog记录是否存在(对于370万条记录中的每个记录),您将需要在RefRecId字段上建立一个索引来加快速度。
如果您想要速度,那么删除order by子句。
您也可以尝试添加firstfast关键字,它有时会提供更快的初始结果(但很少与order by结合)。
最后,选择要更新的字段,特别是避免容器字段,因为此字段不与其他字段一起存储。
发布于 2012-08-08 06:39:42
我不认为我会使用"forupdate“关键字循环遍历如此庞大的数据集,而是使用一个表缓冲区循环(日志)和另一个表缓冲区进行更新(logUpdate)。
我可以想象,系统在循环遍历3.7磨记录时挂起,当它运行查询时,您将不得不等待它最终进入while-select。
另外,确保RefRecId在表上有一个索引,这样数据库引擎就不会运行试图在databaseLogFixLog中查找一行的完整表扫描。
https://stackoverflow.com/questions/11855120
复制相似问题