执行一个SQL语句
执行查询语句的过程:
-
用户进程执行一个查询语句如
select * from emp where empno=7839
-
用户进程和服务器进程建立连接,把改用户进程的信息存储到
PGA
的
UGA
中
-
语句经过
PGA
处理后传递给实例
instance
-
实例
instance
中的
共享池
处理这条语句
-
库缓冲区
去判断语句如何分析
--
软分析(快)或硬分析(慢)
-
根据
cbo
得到执行计划,准备去执行语句
.(CBO
和
RBO
是
ORACLE
提供的两种
优化器
)
-
查询语句中的对象(
emp
表和行)存放在那个表空间,指定的行放在那个块
block
里?需要到
数据字典缓冲区
得到这些信息。
-
开始执行
-
如何执行?在内存中执行
-
判断在
database buffer cache
数据缓存区中是否缓存了需要的
block
。
-
如果是,在内存读取数据得到需要的行的结果返回给用户,用户看到执行的结果。
-
如果不是,则服务器进程把块从磁盘读入到
data bufer cache
缓存下来,
然后
undo
缓存块会对该块做镜像,然后读镜像中的数据得到行的结果返回给用户,用户看到执行的结果
。
执行
UPDATE
语句的过程:
-
用户进程执行一个
update
语句
:
UPDATE emp set sal=10 WHERE id=1234
-
用户进程和服务器进程建立连接,把该用户进程的信息存储到
PGA
的
UGA
中
-
语句经过
PGA
处理后传递给实例
instance
-
实例
instance
中的
共享池
处理这条语句
-
库缓冲区
去判断语句如何分析
--
软分析(快)或硬分析(慢)
-
根据
cbo
得到执行计划,准备去执行语句
.(CBO
和
RBO
是
ORACLE
提供的两种
优化器
)
-
查询语句中的对象(
emp
表和行)存放在那个表空间,需要修改的行放在那个块
block
里?需要到
数据字典缓冲区
得到这些信息。
-
开始执行
-
如何执行?在内存中执行
-
判断在
database buffer cache
数据缓存区中是否缓存了需要修改的
block
。
-
如果是,直接在内存中操作。
-
如果不是,则服务器进程把块从磁盘读入到
data buffer cache
缓存下来,然后
undo
缓存块会对该块做镜像,然后对内存中的
block
做修改操作。
-
由于
block
发生了修改
/
变化,
redo log buffer
会记录块
block
修改的操作信息,同时,会将修改之前的数据放在
undo
块镜像,修改之后的数据放在
undo
块镜像。
-
提交的数据要写入磁盘,没有提交的不写入磁盘。如果执行了
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
|
预测信息,供修改参考
|