存储过程永远不会完成执行 - Oracle

时间:2018-04-02 01:35:19

标签: loops random oracle11g sql-delete

我有桌子,有26列,大小为1TB。我试图使用以下存储过程随机删除此表中的记录:

declare cnt number;
BEGIN
    FOR x IN 1 .. 2 LOOP
         SELECT RUN_VER_ISSUE_ID into cnt FROM MV_RUN_VER_IES SAMPLE (0.00091) WHERE ROWNUM <=1;
         DELETE FROM MV_RUN_VER_IES WHERE RUN_VER_ISSUE_ID = cnt;
    END LOOP;
    commit;
END;
/

但问题是上面的循环只是进入无限执行循环而永远不会完成。我不确定我在这里做错了什么。我之所以这么说,当我执行这个SQL时:

SELECT RUN_VER_ISSUE_ID FROM MV_RUN_VER_IES SAMPLE (0.00091) WHERE ROWNUM <=1;

它在几分之一秒内执行。此列 RUN_VER_ISSUE_ID 也是表格中的主键列。

更新

不确定原因,但是这个脚本正在完成工作而没有任何问题:

VARIABLE cnt integer;
BEGIN
    FOR x IN 1 .. 4000 LOOP
         SELECT RUN_VER_ISSUE_ID into :cnt FROM MV_RUN_VER_IES SAMPLE (0.00091) WHERE ROWNUM <=1;
         DELETE FROM "ABHINAV"."MV_RUN_VER_IES" WHERE "RUN_VER_ISSUE_ID" = :cnt;
    END LOOP;
    commit;
END;

1 个答案:

答案 0 :(得分:0)

请获取cnt的实际值,

监视执行计划(不要真正执行sql)

您可以使用解释计划

然后从表中查询select *(dbms_xplan.display());

执行计划。 如果执行计划真的显示了主要关键

请真正执行sql,

然后查询v $ session_wait以获取此会话的等待事件