添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

执行一个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

预测信息,供修改参考