Как оптимизировать это или сделать это без AL oop в Oracle SQL - PullRequest
1 голос
/ 29 марта 2020

У меня есть следующий код, этот код должен дать нам, сколько блоков данных в данной таблице не имеет одной строки. У меня есть ограничение по времени в 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();

Не могли бы вы показать мне, как это может быть оптимизировать? Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Это сканирует таблицу только один раз, поэтому должно быть быстрее.

Он генерирует каждый block_id, генерируя фиктивный набор строк для каждой строки в dba_extents (cross apply требует Oracle 12.1), затем исключает блоки, которые существуют в таблице.

select count(*)
from   dba_extents x
       cross apply (select x.block_id + rownum - 1 as block_id from dual connect by rownum <= x.blocks) x2
where  owner = 'TABLE_OWNER'
and    segment_name = 'TABLE_NAME'
and    ( x.relative_fno, x2.block_id )
       not in
       ( select distinct dbms_rowid.rowid_relative_fno(rowid) as rowid_relative_fno
              , dbms_rowid.rowid_block_number(rowid) as rowid_block_number
         from  table_owner.table_name );
0 голосов
/ 29 марта 2020

Если вам разрешено динамическое c SQL, go для него. Вы можете добиться переписывания 2FORL OOP -2SELECT в один запрос, что повысит производительность.

...