执行一个SQL语句

执行查询语句的过程:

  1. 用户进程执行一个查询语句如 select * from emp where empno=7839
  2. 用户进程和服务器进程建立连接,把改用户进程的信息存储到 PGA UGA
  3. 语句经过 PGA 处理后传递给实例 instance
  4. 实例 instance 中的 共享池 处理这条语句
    1. 库缓冲区 去判断语句如何分析 -- 软分析(快)或硬分析(慢)
    2. 根据 cbo 得到执行计划,准备去执行语句 .(CBO RBO ORACLE 提供的两种 优化器 )
    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. 用户进程和服务器进程建立连接,把该用户进程的信息存储到 PGA UGA
  3. 语句经过 PGA 处理后传递给实例 instance
  4. 实例 instance 中的 共享池 处理这条语句
    1. 库缓冲区 去判断语句如何分析 -- 软分析(快)或硬分析(慢)
    2. 根据 cbo 得到执行计划,准备去执行语句 .(CBO RBO ORACLE 提供的两种 优化器 )
    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. 提交的数据要写入磁盘,没有提交的不写入磁盘。如果执行了 commit data buffer chache undo 的块数据就会标记已经提交。

注:服务器进程把块从磁盘读入到 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数据库,执行查询操作时,需要用到用户进程。

常见用户进程 SQLPLUS PL/SQL

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

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

  • 工具使用 SQLPLUS PL/SQL D evelop SQLDevelop toad….
  • 用户进程如何访问数据库:

(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 cache Database 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

预测信息,供修改参考