oracle функция сна в операторе выбора - PullRequest
1 голос
/ 18 апреля 2020

У меня есть одно сложное задание ETL, которое зависает большую часть времени, когда оно выполняется (обычно в пиковое время, не в пиковое время, оно выполняется в 10 мин).

Имеет около 15 сложных SQL, все триггеры работают параллельно. функционально я могу выполнить несколько запросов последовательно, а не все сразу (помогает сократить потребление ресурсов).

, поскольку задания ETL сложны, перепроектирование займет время. Есть ли способ, как я могу установить время для некоторых запросов, чтобы начать поздно (например, SLEEP). ETL будет запускать все сразу, но когда он достигнет БД, запрос следует ждать, а не выполнять.

отл. Запрос 1:

select col1, col2 from table1 -- start after 2min

Запрос 2:

select col1, col2 from table2 -- start after 5min

Я знаю, что это очень странный вопрос. извиняюсь за это.

1 Ответ

1 голос
/ 18 апреля 2020

Вы можете использовать процедуру DBMS_LOCK.SLEEP для приостановки сеанса на указанное количество секунд.

Например, я добавлю 10 seconds сна между двумя запросами:

SQL> set time on timing on
01:12:45 SQL> SELECT * FROM DUAL;

D
-
X

Elapsed: 00:00:00.00
01:12:45 SQL> EXEC DBMS_LOCK.sleep(10); --> sleep for 10 seconds

PL/SQL procedure successfully completed.

Elapsed: 00:00:10.00 --> You could see it paused for 10 seconds
01:12:55 SQL> SELECT * FROM DUAL;

D
-
X

Elapsed: 00:00:00.00

Начиная с 18 c и далее, процедура SLEEP добавляется в пакет DBMS_SESSION и устарела из пакета DBMS_LOCK. Это действительно очень полезно, поскольку DBMS_SESSION является доступным для всех сеансов без дополнительных грантов, необходимых в отличие от пакета DBMS_LOCK, который по умолчанию не имеет права на выполнение.

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