zoukankan      html  css  js  c++  java
  • ORACLE内存结构:PGA And UGA,ORACLE用户进程、服务器进程

    执行一个SQL语句

    执行查询语句的过程:

    1. 用户进程执行一个查询语句如select * from emp where empno=7839
    2. 用户进程和服务器进程建立连接,把改用户进程的信息存储到PGAUGA
    3. 语句经过PGA处理后传递给实例instance
    4. 实例instance中的共享池处理这条语句
      1. 库缓冲区去判断语句如何分析--软分析(快)或硬分析(慢)
      2. 根据cbo得到执行计划,准备去执行语句.(CBORBOORACLE提供的两种优化器)
      3. 查询语句中的对象(emp表和行)存放在那个表空间,指定的行放在那个块block里?需要到数据字典缓冲区得到这些信息。
      4. 开始执行
    5. 如何执行?在内存中执行
      1. 判断在database buffer cache数据缓存区中是否缓存了需要的block
        1. 如果是,在内存读取数据得到需要的行的结果返回给用户,用户看到执行的结果。
        2. 如果不是,则服务器进程把块从磁盘读入到data bufer cache缓存下来,然后undo缓存块会对该块做镜像,然后读镜像中的数据得到行的结果返回给用户,用户看到执行的结果

     

    执行UPDATE语句的过程:

    1. 用户进程执行一个update语句:UPDATE emp set sal=10 WHERE id=1234
    2. 用户进程和服务器进程建立连接,把该用户进程的信息存储到PGAUGA
    3. 语句经过PGA处理后传递给实例instance
    4. 实例instance中的共享池处理这条语句
      1. 库缓冲区去判断语句如何分析--软分析(快)或硬分析(慢)
      2. 根据cbo得到执行计划,准备去执行语句.(CBORBOORACLE提供的两种优化器)
      3. 查询语句中的对象(emp表和行)存放在那个表空间,需要修改的行放在那个块block里?需要到数据字典缓冲区得到这些信息。
      4. 开始执行
    5. 如何执行?在内存中执行
      1. 判断在database buffer cache数据缓存区中是否缓存了需要修改的block
        1. 如果是,直接在内存中操作。
        2. 如果不是,则服务器进程把块从磁盘读入到data buffer cache缓存下来,然后undo缓存块会对该块做镜像,然后对内存中的block做修改操作。
        3. 由于block发生了修改/变化,redo log buffer会记录块block修改的操作信息,同时,会将修改之前的数据放在undo块镜像,修改之后的数据放在undo块镜像。
        4. 提交的数据要写入磁盘,没有提交的不写入磁盘。如果执行了commitdata buffer chacheundo的块数据就会标记已经提交。

     

    注:服务器进程把块从磁盘读入到data buffer cache缓存下来后,执行的操作:

    1、通过undo把你需要的block做镜像,(这个时候判断操作类型)

    1)、如果是查询语句,执行语句会通过undo中的镜像数据进行游标操作,打开行,取记录,用户可以看到结果.

    2)、如果是更新、删除、插入,执行语句会修改database buffer cache的块,修改之后把修改之后的状态保留在undo中,作为一个新的镜像. 修改之前的镜像是之前就有的,这个镜像是之前数据文件中真实的记录,而后我们将数据进行修改,这个记录成为我们修改之后的状态,而修改之后的状态有2种,第一种是进行了事务提交(修改操作在undo中被标记为已提交),第二种是没有进行事务提交(修改操作在undo中被标记为未提交).

    undo中所保留的镜像数据一直要到什么时候把没有提交的更改呢,要到事务结束,或事务撤销,事务崩溃,才能在undo中把这个没有提交的状态给清空或取消,undo中保存的临时数据有2种状态,对DML语句来说一种是修改之前的(原镜像),一个是修改之后的(新镜像). 如果是需要的数据,会根据事务提交commit,把语句通过CKPT来触发,由于块发生了变化,redo log buffer会记录变化的数据块更改的过程,然后根据需要database buffer cache 数据写入数据文件中.

    • 用户进程

    用户进程是独立出来的,一个数据库中是可以不需要用户进程的。

    当你要访问oracle数据库,执行查询操作时,需要用到用户进程。

    常见用户进程SQLPLUSPL/SQL

     

    • 执行一个查询语句如select * from emp where empno=7839,用户进程访问ORACLE数据库,连接到ORACLE

    用户进程User Process(用来访问oracle数据库的一个方式(工具/应用))

    • 工具使用 SQLPLUSPL/SQL DevelopSQLDeveloptoad….
    • 用户进程如何访问数据库:

    (1)本机直接通过scok方式访问 IPC(UDP协议)

    (2)通过TCP建立连接到ORACLE服务器

    (3)ORACLE网络配置

    sqlplus sys/oracle@ora11g as sysdba

    Ora11g-->必须在$ORACLE_HOME/network/admin/tnsname.ora配置出如何访问到远程数据库服务器

    sqlplus sys/oracle@updba.uplooking.com:1521/ora11g as sysdba

    不需要任何配置,但oracle的服务器必须在$ORACLE_HOME/network/admin/listener.ora定义被远程的方式

     

    • 用户进程通过TCP/IP方式连接到ORACLE后,ORACLE服务器进程会去响应用户进程,并通过TCP/IP协议的三次握手建立连接。连接建立后,会话的信息会存储在PGA(程序全局区)内存中。PGA主要是存储这些信息,方面维护和管理。
      • PGA里面存的信息有
        • 协议,堆栈信息stack space
        • Session information
        • Sort area
        • Hash area
      • UGA用户信息存储(也叫SQL工作区域)包含
        • Session information
        • Sort area
        • Harsh area

     

    • 查询语句会通过服务器进程传给instance。查询语句会在instance共享池中进行判断(软分析或硬分析)。
      • 共享池中的数据字典中查找表的表空间,行放在那个block中,
    • 然后执行取行,在database buffer cache 查询有没有所需要的block
      • 如果有,就database buffer cache内存中直接取数据
      • 如果没有,就通过服务器进程将data files数据文件中对应需要的block读入data buffer cacheDatabase buffer cache中就有了这个block。然后通过一个undo块(undo块的作用是镜像数据块)做镜像,也就是说这个block会被镜像到undo块中。查询语句从undo内存块中取数据,用户就看到输出的结果了。

     

     

    • 服务器进程是响应用户进程的

    问:用户进程和服务器进程之间通过什么方式进行应答的呢?

    答:IPC TCP/IP协议

     

    用户进程和服务器进程之间进行交互,有2种常见方式

     

    1、在用户进程上具备ORACEL NET网络连接,有配置tnsname.ora文件。PL/SQL TOAD工具是需要配置网络连接

    2、用户进程上没有使用tnsname,直接通过访问地址连接。

    DESCRIPTION=(

    ADDRESS=(PORTOCOL=TCP)(HOST=192.168.1.112)(PORT=1521

    (CONNECT_DATA=

    (SERVER=DEDICATED)

    (SERVICE_NAME=gaga01)

    )

    )

     

     

    Oracle 连接(connection)与会话(session)

    • 连接:Communication between a user process and an instance
    • 会话:Specific connection of a user to an instance through a user process

     

    与用户进程相关的参数和视图

    1、相关参数:Show parameter user_

    user_dump_dest :oracle用户进程产生的日志文件的路径

     

    SQL> show parameter user_

     

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    license_max_users                    integer     0

    user_dump_dest                       string      /u01/app/oracle/diag/rdbms/gag

                                                     a01/gaga01/trace

     

    2、相关视图

    v$session:

    查看当前有哪些用户在连接oracle

    SQL> select username,sid from v$session;

    v$process

     select username,pid from v$process;

    V$sql

     

    v$sqltext

     

     

    服务器进程

    跟用户进程进行交互

    服务器进程有个内存区域,叫PGA,私有内存区域,也叫程序全局区,他是一个内存片段,他的作用是保护会话信息、排序信息、用户的私有数据信息.

     

    PGA中的UGA用户全局区,UGA里面主要存放会话信息、排序信息、harsh 信息。

     

    PGA

    • 一个用户进程对应一个PGA。与SGA不同,PGA是非共享的.
    • PGA是在用户进程连接到oracle数据库并创建一个会话时由oracle自动分配,会话结束,PGA被释放.
    • PGA存储如绑定变量,排序区,游标处理的内容
    • SGA存放了SQL PL/SQL的分析信息,但用户要一句执行select update语句的值不能被共享,这些不能共享的就在PGA.

     

     

    • PGA的参数(show parameter pga
    • PGA_aggregate_target

      指定使用内存上限大小,可以动态修改。值10M-(4096G-1)Bytes.

      workarea_size_policy manual | auto参数

      打开和关闭自动管理功能.

      如果手工manual修改,就设置这两个参数sort_area_size hash_area_size 也可以控制PGA使用率

       

    • PGA相关的数据字典

    v$pgastat

    pga的统计信息

    v$pga_target_advice

    预测信息,供修改参考

  • 相关阅读:
    Next.js文档自定义App、Document,getInitialProps翻译
    使用fetch进行数据请求时报json错误
    菜单制作:ul li横向排列
    Django Auth组件->扩展用户
    001.Django_Model.整理
    PyCharm中的django项目的引入
    Css3 里的弹性盒的比例关系
    vue的组件通讯 父传子 -- 子传父-- 兄弟组件的传值 vue的组件传值
    新手如何创建一个vue项目 ---vue---新手创建第一个项目
    如何自学计算机前端开发?精细的自学步骤是什么样的?
  • 原文地址:https://www.cnblogs.com/thescentedpath/p/PGAandUGA.html
Copyright © 2011-2022 走看看