Поскольку вы говорите, что nplate
и odatetime
являются первичными ключами observations
, то я предполагаю, что проблема здесь:
SELECT * FROM (
SELECT *
FROM observations
ORDER BY DBMS_RANDOM.VALUE)
WHERE ROWNUM<=cuantos;
Нет способа предотвратить полное сканирование observations
, плюс много сортировки, если это большая таблица.
Вам нужно изменить код, который работает. По far самый простой способ изменить код - это изменить исходный код и перекомпилировать его.
Однако, есть способы изменить код, который выполняется без изменения исходного кода. Вот два:
(1) Используйте DBMS_FGAC
, чтобы добавить политику, которая определяет, участвуете ли вы в этой процедуре, и, если это так, добавьте предикат в таблицу observations
, например:
AND rowid IN
( SELECT obs_sample.rowid
FROM observations sample (0.05) obs_sample)
(2) Используйте DBMS_ADVANCED_REWRITE
, чтобы переписать ваш запрос, изменив:
FROM observations
.. до ..
FROM observations SAMPLE (0.05)
Использование текста вашего запроса в политике перезаписи должно предотвратить его влияние на другие запросы к таблице observations
.
Ничего из этого не легко (вообще), но стоит попробовать, если вы действительно застряли.