您的位置:首页 > 其它

关于会话的一些总结

2013-12-27 15:42 316 查看
摘要:

只要一个进程以某种用户登陆数据库(之后即可操作数据库),就会产生一个会话用于记录该进程

以该用户登陆时的操作记录,故一个进程可有多个会话,如进程A两次都以sys登陆就有两个会话(

内存)。会话是一个进程操纵数据库时的操作历史的记录,它与该进程是否存在与客户端的连接无

关。故而前台进程(即oracle服务器进程)可有会话,后台进程(如pmon等)也可有会话。

从V$session视图上,也可看出,前台进程(即oracle服务器进程)可有会话,后台进程(如pmon等)也可有会话。

即select type from V$session;得type有两个值,即background和user(即前台进程)。

当然,不是说oracle数据库软件上的所有进程都有会话这个属性,只有前台进程(即oracle服务器进程)和后台进程(如pmon等)这两类才有。

正文:






会话的四个属性就是四个变量,用于描述该会话的。用于区分与其他会话?不同会话的属性值可以完全一样的,因为属性值都是人为随意加的。
会话的属性表现在v$session视图里有module和action两个字段。

V$SESSION



MODULE
Foot
1
VARCHAR2(48)
Name of the currently executing module as set by calling the
DBMS_APPLICATION_INFO.SET_MODULE
procedure
ACTION
Footref
1
VARCHAR2(32)
Name of the currently executing action as set by calling the
DBMS_APPLICATION_INFO.SET_ACTION
procedure
module 即模块或说是组件,例如sqlplus.exe和sqldeveloperw.exe等客户端。

要建立一个会话,就需要借助一个客户端软件来连接到服务端,这样就形成了一条服务端的服务器进程和客户端的客户进程间的连线。(客户端要连接到服务端,就需要接受服务端的验证,故在客户端发出连接请求时(或前)要发出用户名和密码等信息来验证通过,通过才能连接成功)连接成功后,就会在服务端的内存上开辟一块区域,即就是会话区域,来记录一些该会话时操作的信息等,该会话可以通过服务器进程和客户端进程间的这条连线向客户端的操作用户(人)发送一些信息,如SQL语句执行的结果集等,客户端的操作用户也可以通过该条连线向会话(区域)发送如执行某个SQL语句的请求等信息。会话也可以是无存在连接的会话,例如并行操作时的并行服务器进程(不是协调者进程)对应有一个自己的会话,但是该并行服务器进程没有与客户端形成一条连接,所以称它的会话为无连接的会话。一个服务端的服务器进程可以有多个自己的会话,如在一个会话窗口中开启set
autotrace on功能时,就会为该会话的服务器进程开启(开辟出)一块会话区域。
也就是说客户端软件与会话有关的,而客户端软件就是一个程序,一个功能模块,一个组件。所以,会话就有一个模块名的属性。
操作是指一个会话(窗口)里的每一条SQL语句操作。故也与会话有关。

注释:

1、连接和会话的区别

连接(connection):连接是从客户到Oracle 实例的一条物理路径。连接可以在网络上建立,或者通过IPC 机制建立。通常会在客户进程与一个专用服务器或一个调度器之间建立连接。

会话(session):会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),也就是表示特定会话的一组内存中的数据结构.也就说,会话就是一块内存区域。提到"数据库连接"时,大多数人首先想到的就是“会话”。你要在服务器中的会话上执行SQL、提交事务和运行存储过程(斜体字部分说明了会话的作用)。

2、set autotrace 完成的动作

当启用set autotrace功能后,通常会创建一个新的会话用于监控当前的操作并返回统计信息,下面描述其过程
a.在session1执行一个查询,则此时原来创建的会话(159,5)执行DML或DQL操作
b.新创建的会话(139,25)会话则开始查询V$SESSTAT 视图来记住实际会话(即运行DML 的会话)的初始统计值
c.原会话(139,25)中得DML或DQL操作执行
d.新会话(139,25)将再次查询V$SESSTAT 视图,根据与上次的差值计算统计信息并生成执行时的执行计划以及统计信息予以返回

参考:

[title3]进程、会话、连接之间的差异[/title3]

3、

SQL> set autotrace trace exp

SQL> select * from t2;

Execution Plan

———————————————————-

Plan hash value: 1216610266

——————————————————————————–
。。。。。。。

SQL> set autotrace off

SQL> select process from v$pq_tqstat;

no rows selected

可以看到 用set autotrace 后 查v$pq_tqstat norows ,这是2个原因造成的

1.set autotrace的原理

开启autotrace时候 一个process对应 2个 session

通常情况下是一个 session对应一个 server processs,但SErVER PORCESSS 可以对应多个session

2.v$pq_tqstat只提供当前session最后一次并行执行sql语句的信息

综合2点可以看出set autotrace 最后一个session 是 执行计划的,所以v$pq_tqstat为no rows

参考:

oracle 并行(并行度)

由上面例子说明:同一个服务器进程的多个会话可以共同使用可视化的界面窗口进行输入输出。上面例子中窗口里的执行计划的内容是来自set autotracetrace exp时新建的会话。

还有一个系统里的当前会话只有一个。上面例子中set autotrace off后,当前会话还是新建的那个会话,而v$pq_tqstat只提供当前session最后一次并行执行sql语句的信息,所以查v$pq_tqstat
的结果为no rows。不知道该例子用的oracle的什么版本做实验的。在oracle 11g R2上时,上述过程,查v$pq_tqstat 是有结果的。估计因为set autotrace off后,当前会话会切换到老的那个会话。

一个会话的各个属性中,模块名和操作名可以随便取名的。
通过DBMS_APPLICATION_INFO.SET_MODULE和DBMS_APPLICATION_INFO.SET_ACTION就可以将执行该函数的会话任意取一个名。

由上述总结会话与服务器进程、窗口间的关系如下图:





图上注释1的前半句和2后半句的根据:

set autotrace 完成的动作

当启用set autotrace功能后,通常会创建一个新的会话用于监控当前的操作并返回统计信息,下面描述其过程
a.在session1执行一个查询,则此时原来创建的会话(159,5)执行DML或DQL操作
b.新创建的会话(139,25)会话则开始查询V$SESSTAT 视图来记住实际会话(即运行DML 的会话)的初始统计值
c.原会话(139,25)中得DML或DQL操作执行
d.新会话(139,25)将再次查询V$SESSTAT 视图,根据与上次的差值计算统计信息并生成执行时的执行计划以及统计信息予以返回

注释:

你要在服务器中的会话上执行SQL、提交事务和运行存储过程(斜体字部分说明了会话的作用)。

/article/1444765.html

图上注释2后半句的根据:

是对当前会话,而不是当前的sql*plus窗口。即如果你这样修改之后,又使用connect命令以其他用户连接到数据库或者是连接到其他的数据库,则这个日期格式就失效了,又恢复到缺省的日期格式。

/article/1822858.html

图上注释前后半句的根据:

比如:pl/sqldeveloper 登录oracle。pl/sql developer 可以设置是否每个窗口共用同一个session.如果想在调试窗口调试存储过程或函数,则必须设置为共享session。如果设置为非共享, www.linuxidc.com则每次打开一个操作窗口,pl/sqldeveloper 会利用最初输入的帐户和口令建立新的connection 和session.

/article/9460997.html

注释:

在sql*plus中修改当前会话的日期格式

SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

将当前会话的时间格式修改为这种格式:2003-01-28 15:23:38,即四位年-两位月-两位日,空格,24小时的制的小时:分钟:秒。

这种修改方法,只对当前会话有效。

注意,是对当前会话,而不是当前的sql*plus窗口。即如果你这样修改之后,又使用connect命令以其他用户连接到数据库或者是连接到其他的数据库,则这个日期格式就失效了,又恢复到缺省的日期格式。

/article/1822858.html

PROCESSES与SESSIONS之间关系: --

11g 推荐会话数:sessions=1.5*processes + 22

10g 推荐会话数:sessions=1.1*processes + 5

/article/9460997.html

使用SQLPLUS测试: --实验环境,现在没有连接到数据库。

[oracle@bys3 ~]$ ps -ef |grep LOCAL |grep -vgrep ---查询无返回,当前系统中没有ORACLE的连接信息

然后另开一窗口2,SSH到数据库所在服务器,启动SQLPLUS登陆数据库。再查询:

[oracle@bys3 ~]$ ps -ef |grep LOCAL |grep -v grep

oracle 30305 30302 3 21:10? 00:00:00 oraclebys3 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) --这一条就是窗口2中新打开SQLPLUS连接的信息LACAL=YES,表明不是通过监听连接的--本地IPC。

http://blog.csdn.net/haibusuanyun/article/details/16922457

当前会话 oracle 窗口 谷歌

当前会话 sql*plus窗口 谷歌

若是将用户这一因素考虑进去,则用户和进程、会话、窗口间的关系如下图:





另见:

《v$session中user#为0或username为空时代表的意思》

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: