oracle session_id在* _scheduler_job_run_details

时间:2019-06-10 10:06:37

标签: oracle

我无法理解SESSION_ID中的*_scheduler_job_run_details代表什么。

有两个用逗号分隔的值。第一,变化很大,第二,更少。看下面的例子:

+------+------------+
| sid  | session_id |
+------+------------+
| 6072 | 6072,8980  |
+------+------------+

这是通过以下查询选择的:

SELECT s.sid
    , j.SESSION_ID
FROM
   v$session s
LEFT OUTER JOIN
    (select SESSION_ID
        , CAST(SUBSTR(SESSION_ID, 0, INSTR(SESSION_ID, ',')-1) as NUMBER) as ID1
        , CAST(SUBSTR(SESSION_ID, INSTR(SESSION_ID, ',')+1, LENGTH(SESSION_ID) - INSTR(SESSION_ID, ',')) AS NUMBER) as ID2
    from all_scheduler_job_run_details) j
ON j.ID1 = s.sid
    OR j.ID2 = s.sid
;

似乎第一个数字代表sid的{​​{1}},与Oracle docs一致的是v$session,但是Session identifier的{​​{1}}也是如此}根据this Oracle docs。但这似乎与SESSION_ID中的*_scheduler_job_run_details没有关联-如果我为此sql_textv$sql中提取sql_id,则似乎该会话是用户的会话执行了一些操作,而不是我的工作

== EDIT ==

我发现v$session可以重复使用,因此可以正确连接。 sid仅与较新的查询(然后是作业运行的查询)结合在一起。不过,这个其他“ id”是否意味着一切……?它可以链接到旧查询的某个参数,例如序列号吗?

1 个答案:

答案 0 :(得分:1)

是的,session_id为sid,serial#-组合是v $ session中会话的唯一标识符(在数据库实例的生存期内)。您可以在其他地方看到它,例如如果需要运行ALTER SYSTEM KILL SESSION,则必须为其提供sid + serial#组合。

因此,如果您的工作上周是与session_id = '6072,8980'一起运行的,但是当前有人在v $ session中与sid = 6072 and serial# = 9504相关联,那么您可以说这是一个不同的会话,而不是您的工作所来自的那个会话

v $ session中的

sql_id仅显示该会话当前正在运行的SQL -因此,对于INACTIVE会话,该字段将为空,因为它们目前尚未运行。如果您的工作完成,则在v $ session中的任何地方都不会看到它的sql_id。