【发布时间】:2020-03-29 02:42:34
【问题描述】:
我有下面的代码,这个代码应该告诉我们给定表有多少数据块没有一行。我有 15 秒的时间限制,但是当我第一次运行它时,它需要 103 秒才能运行。我试图通过消除循环进行优化,但我做不到,我什至想不出没有循环的解决方案。
create or replace procedure num_of_rows IS
cnt NUMBER;
total NUMBER;
BEGIN
total := 0;
FOR rec IN (select file_id, block_id, blocks from dba_extents
where owner='TABLE_OWNER' and segment_name='TABLE_NAME')
LOOP
FOR i in 1..rec.blocks LOOP
SELECT count(*) into cnt FROM TABLE_OWNER.TABLE_NAME
WHERE dbms_rowid.rowid_relative_fno(ROWID) = rec.file_id
AND dbms_rowid.rowid_block_number(ROWID) = rec.block_id+i-1;
IF cnt = 0 THEN total := total + 1; END IF;
END LOOP;
END LOOP;
dbms_output.put_line(total);
END num_of_rows;
set serveroutput on
execute num_of_rows();
能否请您告诉我可以优化的方法? 在此先感谢:)
【问题讨论】:
-
我可以,但这不是您需要考虑的重点吗?
标签: sql database oracle plsql query-optimization