У меня есть следующий код, этот код должен дать нам, сколько блоков данных в данной таблице не имеет одной строки. У меня есть ограничение по времени в 15 секунд, но когда я его запустил, мне понадобилось 103 секунды. Я пытался оптимизировать с помощью устранения петель, но я не могу сделать это, я даже не мог придумать решение без al oop.
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();
Не могли бы вы показать мне, как это может быть оптимизировать? Заранее спасибо:)