хранимая процедура oracle 12c, увеличивающая время выполнения при цикле - PullRequest
0 голосов
/ 28 августа 2018

Привет, у меня Oracle 12c db с общим SGA 12 ГБ и целевой областью общего пула, установленной на 4 ГБ.

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

путь выполнения, который использует хранимая процедура, был идентифицирован, и для одного запроса по этому пути предусмотрен план с низкими затратами.

Я запускаю сохраненный процесс в цикле 100 и вижу, что он начинается со времени выполнения 74 мс, а в конце 100-го цикла время выполнения процедуры составляет около 5000 мс.

Ищите указатели на то, почему это может быть?

запрос в процедуре похож на

 SELECT a, b
  FROM (  SELECT a, b
            FROM tab
        ORDER BY c)
 WHERE ROWNUM = 1;

Oracle, как было отмечено в этом случае, не создала несколько планов для одного и того же выполнения запроса. Я установил режим оптимизатора first_rows, а также проверил индексы в предложении where без особого эффекта.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Растет ли TAB (то есть, что-нибудь делает INSERT INTO TAB между исполнениями SELECT, которые вы опубликовали)? Если так, то понятно, почему он замедляется, если SELECT выполняет полное сканирование таблицы TAB. По мере роста TAB это будет занимать все больше и больше времени.

Если у вас есть INDEX в столбце c, попробуйте переписать ваш SELECT следующим образом:

SELECT a, b 
FROM (  SELECT a, b
        FROM tab
        WHERE c = ( SELECT min(c) FROM tab )
        ORDER BY c)
WHERE ROWNUM = 1;

Индекс позволит Oracle очень быстро найти min(c), используя метод доступа INDEX FULL SCAN (MIN/MAX). Затем это минимальное значение будет найдено очень быстро с использованием того же индекса через INDEX RANGE SCAN доступ.

Производительность этого запроса не должна значительно снижаться по мере увеличения размера TAB.

Ваше сообщение намекает на другие возможные оптимизации в общем процессе, но это, вероятно, даст вам большую часть пути туда, где вы хотите быть.

0 голосов
/ 28 августа 2018

Если вы не выполняете коммит внутри цикла, то, что вы наблюдаете, может быть вызвано тем, что запись транзакции в сегменте отката .

занимает все больше и больше времени.

Но в целом вам следует избегать выполнения циклов в PL / SQL . Хорошей производительности можно достичь только с помощью SQL-запросов, а «циклы» обрабатываются Oracle, а не вы.

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