добавление к курсору в оракуле - PullRequest
0 голосов
/ 23 марта 2010

Вчера я задал вопрос , который получил ответы, но не ответил на основную мысль. Я хотел сократить время, необходимое для выполнения операции MINUS.

Теперь я думаю о выполнении операции MINUS в блоках по 5000, добавлении результатов каждой итерации к курсору и, наконец, возвращении курсора. У меня есть следующее:

V_CNT           NUMBER :=0;
V_INTERVAL      NUMBER := 5000;

begin
  select count(1) into v_cnt from TABLE_1
while (v_cnt > 0)
loop
open cv_1 for
    SELECT  A.HEAD,A.EFFECTIVE_DATE,
    FROM   TABLE_1 A
    WHERE  A.TYPE_OF_ACTION='6' AND A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)  
    AND A.ROWNUM <= V_INTERVAL
    MINUS
    SELECT  B.head,B.EFFECTIVE_DATE,
    FROM  TABLE_2 B
    AND B.ROWNUM <= V_INTERVAL

V_CNT := V_CNT - V_INTERVAL;
END LOOP; 
end;

Однако, как вы видите ... на каждой итерации курсор перезаписывается. Как я могу изменить код так, чтобы в каждой итерации он добавлялся к cv_1 курсору, а не перезаписывал?

Ответы [ 2 ]

1 голос
/ 23 марта 2010

Вы четко не указали требование. Итак, я предполагаю, что вы хотите сделать МИНУС на двух столах, А и В. т.е. вы хотите найти кортежи в A, которых нет в B.

Принимая это, логика, которую вы написали, не совсем верна, так как вы выполняете МИНУС на соответствующих (длиной 5000) партиях A и B.

Например: ваша логика вернет кортеж в 4000-й строке таблицы A, который присутствует, скажем, в 6000-й строке таблицы B.

Я предлагаю вам использовать левое внешнее соединение для выполнения своих задач. (То же, что и пост Питера Ланга). Я думаю, этого должно хватить и для ваших требований к производительности.

0 голосов
/ 23 марта 2010

Это не так, как работают курсоры, вам придется хранить значения в какой-то коллекции.

Ваш текущий запрос получает 5000 случайных строк из Table_1 и удаляет строки, которые также существуют в 5000 случайных строк, выбранных из Table_2.


Вы пытались сделать это без MINUS?

Как я понимаю, запрос должен выдать то же, что и этот:

Select  a.head, a.effective_date,
From table_1 a
Left Join table_2 b On (b.head = a.head And b.effective_date = a.effective_date )
Where a.type_of_action='6' And a.effective_date >= ADD_MONTHS(SYSDATE,-15)  
  And b.head Is Null;

Наличие составного индекса на TABLE_1 (type_of_action, head, effective_date) и TABLE_2 (head, effective_date) должно помочь вам с производительностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...