Каков наилучший способ найти текущее время активных запросов для указанного c пользователя / машины в Oracle SQL Разработчик для всех запущенных запросов? - PullRequest
0 голосов
/ 25 апреля 2020

Я знаю, как узнать, какие запросы я выполняю с помощью OSUSER, но у меня возникают проблемы с настройкой логики c для разработки поля истекшего времени, и я мог бы использовать некоторую помощь. Вот что я смотрел:

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ

MONITOR_ACTIVE_QUERIES VIEW AS 
SELECT 
  USERNAME
, SCHEMANAME
, OSUSER
, MACHINE
, PROGRAM
, SID
, SERIAL#
, TO_CHAR(SYSDATE, 'MM-DD-YYYY HH24:MI:SS') AS CurrentTime
, FIRST_LOAD_TIME AS LoadTime
--, USER_IO_WAIT_TIME << not really sure what this is.
, SQL_TEXT

FROM V$SESSION a JOIN V$SQL b
ON a.SQL_ADDRESS = b.ADDRESS
WHERE a.OSUSER IN ('<USER1>', '<USER2>','<USER3>')
AND a.STATUS = 'ACTIVE'

Я хочу сделать что-то, где я могу взять логику c CurrentTime - LoadTime для вычисления RunTime, но продолжайте сталкиваться с проблемами. Это похоже на тип данных.

Я пробовал это для CurrentTime: TO_DATE ((

SELECT MM || '-' || DD || '-' || YYYY || ' ' || HH24 || ':' || MI || ':' || SS 
   FROM (
    SELECT
      EXTRACT(MONTH FROM SYSTIMESTAMP) AS MM
    , EXTRACT(DAY FROM SYSTIMESTAMP) AS DD
    , EXTRACT(YEAR FROM SYSTIMESTAMP) AS YYYY
    , EXTRACT(HOUR FROM SYSTIMESTAMP) AS HH24
    , EXTRACT(MINUTE FROM SYSTIMESTAMP) AS MI
    , ROUND(EXTRACT(SECOND FROM SYSTIMESTAMP),0) AS SS
    FROM DUAL)),'MM-DD-YYYY HH24:MI:SS') AS CurrentTime

И это для LoadTime:

SUBSTR(FIRST_LOAD_TIME,6,5) || '-' || SUBSTR(FIRST_LOAD_TIME,0,4) || ' ' || SUBSTR(FIRST_LOAD_TIME,12,8) AS LoadTime

Я даже пытался быть умным с TO_DATE и функции TO_CHAR, но я все еще не могу понять это. У кого-нибудь есть какие-нибудь умные идеи?

Ответы [ 4 ]

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

Вы можете преобразовать время загрузки в дату как:

to_date(first_load_time, 'YYYY-MM-DD/HH24:MI:SS')

Я не уверен, как вы хотите представить разницу во времени, но вы можете использовать:

(sysdate - to_date(first_load_time, 'YYYY-MM-DD/HH24:MI:SS')) 

должно работать.

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

У меня сработало нижеприведенное, вам нужно сделать что-то подобное на основе вашего NLS_DATE_FORMAT, который даст время работы в минутах

        SELECT username,
           schemaname,
           osuser,
           machine,
           program,
           sid,
           serial#,
           To_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS CurrentTime,
           first_load_time                           AS LoadTime,
           (To_date(To_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),
           'YYYY-MM-DD HH24:MI:SS')
           - To_date(Replace(first_load_time, '/', ' '), 'YYYY-MM-DD HH24:MI:SS')*24*60
                                                     running_time,
           sql_text
    FROM   v$session a
           join v$sql b
             ON a.sql_address = b.address
    WHERE  a.osuser IS NOT NULL
           AND a.status = 'ACTIVE' 
0 голосов
/ 27 апреля 2020

Я действительно нашел лучший способ сделать это, представив его в единицах времени. Смотрите ниже:

CREATE OR REPLACE VIEW MONITOR_ACTIVE_QUERIES AS
--ALTER SESSION SET NLS_date_format =  'YYYY-MM-DD HH24:MI:SS';
SELECT
  USERNAME
, SCHEMANAME
, OSUSER
, MACHINE
, PROGRAM
, SID
, SERIAL#
, TO_DATE(REPLACE(FIRST_LOAD_TIME, '/', ' '), 'YYYY-MM-DD HH24:MI:SS') AS LoadTime
, lpad(TO_CHAR(TRUNC(24*(sysdate-TO_DATE(REPLACE(FIRST_LOAD_TIME, '/', ' '), 'YYYY-MM-DD HH24:MI:SS'))) ) || TO_CHAR(TRUNC(sysdate) + (sysdate-TO_DATE(REPLACE(FIRST_LOAD_TIME, '/', ' '), 'YYYY-MM-DD HH24:MI:SS')) , ':MI:SS' ) , 10, ' ') AS RunTime
, SQL_TEXT

FROM v$session a JOIN v$sql b
ON a.SQL_ADDRESS = b.ADDRESS

LEFT JOIN (
SELECT SQL_ADDRESS, logon_time
FROM gv$session) s
ON a.SQL_ADDRESS = s.SQL_ADDRESS

WHERE a.OSUSER IN ('<User1>', '<User2>','<User3>')
AND a.STATUS = 'ACTIVE'
ORDER BY RunTime;

--SELECT * FROM MONITOR_ACTIVE_QUERIES;
0 голосов
/ 25 апреля 2020

Спасибо, psaraj12! Это помогло. Я запустил ваш код, и он все еще не работал, но комментарий к NLS_DATE_FORMAT напомнил мне, когда я в последний раз изменял сессию, чтобы не вызывать время, необходимое для получения разницы между ними. Выполнение этого (см. Ниже) решило проблему.

ALTER SESSION SET NLS_date_format =  'YYYY-MM-DD HH24:MI:SS';

SELECT 
  USERNAME
, SCHEMANAME
, OSUSER
, MACHINE
, PROGRAM
, SID
, SERIAL#
, TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS CurrentTime
, FIRST_LOAD_TIME                           AS LoadTime
, ROUND((TO_DATE(To_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') - TO_DATE(REPLACE(FIRST_LOAD_TIME, '/', ' '), 'YYYY-MM-DD HH24:MI:SS'))*24*60,2) RunTime
, SQL_TEXT

FROM v$session a JOIN v$sql b
ON a.SQL_ADDRESS = b.ADDRESS
WHERE a.OSUSER IN ('<User1>', '<User2>','<User3>')
AND a.STATUS = 'ACTIVE'

Все еще существует проблема с форматом RunTime. Он отображается в формате «1,94», что означает 194 секунды времени выполнения, а не «1,34» для формата в 1 минуту и ​​34 секунды, но сейчас я могу с этим смириться.

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