`
bluethink
  • 浏览: 97895 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

从oracle临时表理解会话与链接

阅读更多
用oracle时间比较长了,但只是单纯的使用,很少关心一些基本的东西,比如oracle中会话和链接的区别,我懒得看一大堆的介绍,只是看了oracle临时表的用法,实际测试了一下,之后才明白了这二者的区别,我想用这种方法理解这两者的区别比看N篇介绍更加印象深刻。

这里先不说会话和链接的区别和关系,首先看看oracle的会话级临时表,会话级临时表有这样的特性:当你当前SESSION 不退出的时候,临时表中的数据是存在的,而当你退出当前SESSION 之后,临时表中的数据就全部被清空了,换句话说,如果你不退出当前SESSION(这里简称 session a)而是用另一个SESSION(这里简称 session b)登录,是看不到session a中插入到临时表中的数据的,如果session a不退出,它里面建立的临时表的数据就会一直存在,直到它退出会话才被清除。

一个简单的例子即可印证,在这个例子中清楚的体现了链接和会话的关系和区别。

我们用sys用户登录并记录下当前有哪些会话,我使用的是plsqldev这种数据库工具,显示查询结果比较美观,方便

在plsqldev中打开一个命令窗口执行:
select sid,logon_time,username,machine from v$session order by logon_time

得到的结果是:

    SQL> select sid,to_char(logon_time,'yyyy-mm-dd hh24:mi:ss'),username,machine from v$session order by logon_time desc;
    ;

           SID TO_CHAR(LOGON_TIME,'YYYY-MM-DD USERNAME                       MACHINE
    ---------- ------------------------------ ------------------------------ ----------------------------------------------------------------
           316 2011-03-10 00:56:37                                           6AA448B035B94BC
           308 2011-03-10 00:56:22            SYS                            WORKGROUP\6AA448B035B94BC
           317 2011-03-10 00:56:09            SYS                            WORKGROUP\6AA448B035B94BC
           303 2011-03-09 21:32:50            DBSNMP                         WORKGROUP\6AA448B035B94BC
           297 2011-03-09 21:31:59                                           6AA448B035B94BC
           301 2011-03-09 21:31:51            SYSMAN                         6AA448B035B94BC
           298 2011-03-09 21:31:51            SYSMAN                         6AA448B035B94BC
           313 2011-03-09 21:31:50                                           6AA448B035B94BC
           306 2011-03-09 21:31:50            SYSMAN                         6AA448B035B94BC
           319 2011-03-09 21:31:39                                           6AA448B035B94BC
           334 2011-03-09 21:31:16                                           6AA448B035B94BC
           333 2011-03-09 21:31:16                                           6AA448B035B94BC
           332 2011-03-09 21:31:16                                           6AA448B035B94BC
           331 2011-03-09 21:31:16                                           6AA448B035B94BC
           330 2011-03-09 21:31:16                                           6AA448B035B94BC
           329 2011-03-09 21:31:16                                           6AA448B035B94BC
           328 2011-03-09 21:31:16                                           6AA448B035B94BC
           327 2011-03-09 21:31:16                                           6AA448B035B94BC
           326 2011-03-09 21:31:16                                           6AA448B035B94BC
           335 2011-03-09 21:31:16                                           6AA448B035B94BC
           325 2011-03-09 21:31:16                                           6AA448B035B94BC

    21 rows selected

    SQL>
并且我记录了我打开plsqldev并登录的时间是2011-03-10 00:56,所以我想上面查询结果中的307、308和316会话就是我打开plsqldev并登录成功,并且执行了查询时,创建的两个会话。

然后我开始创建oracle会话级临时表

    SQL> insert into tst_session_table values (1,'name1');

    1 row inserted
    SQL> insert into tst_session_table values (2,'name2');

    1 row inserted

    SQL> commit;

    Commit complete

在当前命令窗口中查一下结果:


    SQL> select * from tst_session_table;

                                       F_ID F_NAME
    --------------------------------------- --------------------
                                          1 name1
                                          2 name2

    SQL>

可以看到这个表中以经有数据了,暂且认为这是当前会话中保存的数据。
在plsqldev中重新打开一个命令窗口执行刚才的查询:

    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
    Connected as SYS

    SQL>  select * from tst_session_table;

                                       F_ID F_NAME
    --------------------------------------- --------------------

    SQL>

可以看到表里没有数据,我再切回到刚才的那个窗口,执行查询仍然可以查到数据,明显这两个窗口各有一个不同的会话,符合了oracle会话级临时表的特性。

这是再看一下当前会话表的情况


    SQL> select sid,to_char(logon_time,'yyyy-mm-dd hh24:mi:ss'),username,machine from v$session order by logon_time desc;

           SID TO_CHAR(LOGON_TIME,'YYYY-MM-DD USERNAME                       MACHINE
    ---------- ------------------------------ ------------------------------ ----------------------------------------------------------------
           311 2011-03-10 01:00:05            SYS                            WORKGROUP\6AA448B035B94BC
           316 2011-03-10 00:59:52                                           6AA448B035B94BC
           308 2011-03-10 00:56:22            SYS                            WORKGROUP\6AA448B035B94BC
           317 2011-03-10 00:56:09            SYS                            WORKGROUP\6AA448B035B94BC
           303 2011-03-09 21:32:50            DBSNMP                         WORKGROUP\6AA448B035B94BC
           297 2011-03-09 21:31:59                                           6AA448B035B94BC
           298 2011-03-09 21:31:51            SYSMAN                         6AA448B035B94BC
           301 2011-03-09 21:31:51            SYSMAN                         6AA448B035B94BC
           313 2011-03-09 21:31:50                                           6AA448B035B94BC
           306 2011-03-09 21:31:50            SYSMAN                         6AA448B035B94BC
           319 2011-03-09 21:31:39                                           6AA448B035B94BC
           325 2011-03-09 21:31:16                                           6AA448B035B94BC
           326 2011-03-09 21:31:16                                           6AA448B035B94BC
           327 2011-03-09 21:31:16                                           6AA448B035B94BC
           328 2011-03-09 21:31:16                                           6AA448B035B94BC
           329 2011-03-09 21:31:16                                           6AA448B035B94BC
           335 2011-03-09 21:31:16                                           6AA448B035B94BC
           331 2011-03-09 21:31:16                                           6AA448B035B94BC
           332 2011-03-09 21:31:16                                           6AA448B035B94BC
           333 2011-03-09 21:31:16                                           6AA448B035B94BC
           334 2011-03-09 21:31:16                                           6AA448B035B94BC
           330 2011-03-09 21:31:16                                           6AA448B035B94BC

    22 rows selected

    SQL>

发现311会话是新增的,明显这和新打开的sql窗口有关.
如果不查询一下 v$session,猛然看起来是有点奇怪,明明没有退出plsqldev,只是打了一个新的命令窗口而已,其实这个结果恰恰解释了链接和会话的关系以及区别,看看下面的分析:
当用plsqldev工具sys用户成功登录之后会建立一个连接,每当我在plsqldev打开一个窗口就并且执行了DDL或DML操作就会创建1个新的会话,不清楚其他的操作是否也是如此,但是推想一下,如果是关于数据库的操作,不建立会话,客户端如何操作oracle呢,所以肯定也是要建立新的会话,这个有待以后求证。

现在我关闭了最后打开的命令窗口,再查一下当前所有会话情况:
发现311会话不见了。因此可以断定以下结果:
1.  311会话是一个新的会话
2.  316会话中向临时表插入了数据
3.  317和308这两个会话是plsqldev工具自己建立的会话,可能有别的用途

  316会话和317会话两个不同的会话,tst_session_table表数据的有无明显的体现了这一点。

总结一下:

当oracle客户端和服务端的链接建立之后,会在链接的基础上建立若干的会话,之后oracle客户端与oracle服务端都会在一个连接(不一定是在同一个会话中)中进行交互,因此链接和会话是1对多的关系。有的资料上将oracle允许存在失去了物理链接的会话,这个需要抽个时间测试一下,眼见为实,呵呵。
   
    今天就先写到这里,这只是我对链接和会话在实验的基础上的粗略理解,欢迎各位提出自己的高见,在此先行谢过。
0
5
分享到:
评论

相关推荐

    oracle临时表(事务级、会话级).docx

    "Oracle 临时表(事务级、会话级)" Oracle 临时表是 Oracle 数据库中的一种特殊类型的表,它可以保存一个会话或事务中的数据。当会话或事务结束时,临时表中的数据自动清空,但是临时表的结构和元数据还存储在...

    Oracle 临时表用法

    本文将详细介绍Oracle临时表的创建方法、使用场景以及优缺点,帮助读者更好地理解和运用这一特性。 #### 二、Oracle临时表概述 Oracle临时表是一种特殊的表,用于存储临时数据,通常用于事务处理或特定会话期间的...

    Oracle 临时表之临时表的应用问题

     临时表本质上是一种cache的表现形式,Oracle的临时表都是事先建好的,一旦用了临时表,存放的是和本会话相关的数据,没有人会傻乎乎地用临时表来保存本应该共享的数据。  with子查询实际上也是用了临时表,...

    oracle临时表用法

    Oracle 中的临时表有两种:事务级别的临时表和会话级的临时表。事务级别的临时表在事务结束时自动清空记录,而会话级的临时表在会话结束时自动清空。 临时表的特点 临时表有以下特点: * 临时表可以在多用户并发...

    ORACLE中临时表

    1. 提供与Oracle会话级临时表类似的功能。 2. 支持SDO_GEOMETRY等LOB数据类型。 3. 支持基于会话的主外键连接。 4. 允许高级用户访问全局数据以实现复杂功能。 创建临时表的语法如下: ```sql CREATE GLOBAL ...

    Oracle临时表

    理解Oracle临时表的概念及其工作原理对于优化应用程序的性能至关重要。合理使用临时表可以帮助提高数据处理的速度,同时减少不必要的资源消耗。无论是事务临时表还是会话临时表,都有各自的应用场景和限制。在实际...

    Oracle存储过程中使用临时表

    总结来说,Oracle存储过程中使用临时表是优化数据处理和提高性能的有效手段,正确理解和运用会话级和事务级临时表,能更好地满足复杂的业务需求。在设计和实现存储过程时,应根据具体的应用场景选择合适的临时表类型...

    oracle自增长与临时表

    **二、Oracle临时表** 临时表在Oracle中用于在单个会话中存储临时数据,这些数据只对创建它们的会话可见,会话结束时,临时表及其数据都会被自动删除。 1. **创建临时表**:使用`CREATE GLOBAL TEMPORARY TABLE`...

    oracle临时表

    Oracle临时表是数据库管理系统...通过学习和理解Oracle临时表,我们可以更有效地管理短暂的、会话级别的数据,优化数据库性能,提升应用的响应速度。在实际工作中,适时使用临时表能为我们的数据库操作带来极大的便利。

    oracle临时表操作学习资料

    Oracle数据库中的临时表是一种特殊的表类型,主要用于存储在特定会话或事务期间产生的临时数据。与常规的永久表相比,临时表的数据不会永久保存,而是会在会话结束或事务完成时自动清除,无需用户手动删除。 1. **...

    Oracle 临时表用法汇总

    临时表的应用 1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。 2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个...

    Oracle中临时表的创建

    #### 二、Oracle临时表概述 临时表是Oracle提供的一种特殊类型的表,用于存储临时数据。它们通常用于执行复杂的计算任务或暂存中间结果,以减少对主表的访问次数,从而提升整体性能。根据生命周期的不同,临时表...

    oracle-临时表空间

    与永久表空间不同的是,临时表空间中的数据不会被持久化保存,在会话结束时会被自动清除。因此,临时表空间非常适合用于那些不需要长期保留的数据处理场景。 #### 三、查询与管理临时表空间 ##### 1. 查询用户及其...

    OracleTemporaryTables(Oracle临时表).docx

    Oracle Temporary Tables,也称为Oracle临时表,是Oracle数据库系统中用于存储临时数据的特殊类型表。它们主要用于处理会话级别的数据,这些数据在特定会话或事务结束后会被自动清理,从而减少了对永久表的负担和...

    主流数据库中临时表的使用

    在 Oracle 中,临时表用来保存事务或会话期间的中间结果。在临时表中保存的数据只有对当前会话是可见的,任何会话都不能看到其他会话的数据,即使在当前会话 COMMIT 数据以后也是不可见的。多用户并行不是问题,一个...

    Oracle特性临时表

    在Oracle数据库中,临时表是一种特殊类型的表,它主要用于存储那些仅对当前会话或事务有意义的数据。与普通表不同的是,临时表的数据不会持久化存储,而是根据特定条件进行管理。这使得临时表非常适合用于中间结果的...

    oracle 临时表使用例子并用CURSOR返回结果集的例子

    本篇文章将深入探讨Oracle临时表的使用,并通过一个使用游标(CURSOR)返回结果集的例子来进一步理解其用法。 首先,让我们了解如何创建Oracle临时表。临时表的创建语法与普通表类似,但我们需要使用`GLOBAL ...

    OracleTemporaryTables(Oracle临时表).pdf

    Oracle Temporary Tables,也称为Oracle临时表,是在Oracle数据库中用于临时存储数据的特殊表。它们主要用在处理大型数据集时提高性能,特别是在复杂的查询和存储过程中。临时表的生命周期和可见性根据创建时指定的...

    oracle11g创建临时表空间组

    与传统的单个临时表空间相比,临时表空间组允许多个临时表空间协同工作,从而提高并发性能和资源利用率。下面将详细介绍如何在Oracle 11g R2中创建临时表空间组,并解释使用该功能的优势。 #### 临时表空间组的优点...

    Oracle中的临时表讲解

    Oracle中的临时表是一种特殊的数据表,用于存储在特定会话或事务期间产生的临时数据。它们在数据库中存在,但其生命周期受到严格的限制,以确保数据的隔离性和安全性。临时表主要分为两类:事务级别的临时表和会话...

Global site tag (gtag.js) - Google Analytics