从一条select语句看Oracle数据库查询工作原理

从一条select语句看Oracle数据库查询工作原理,第1张

假如 我们现在利用Select语句数据库查询数据 Oracle数据库是如何运作的呢从中我们可以领悟到什么呢下面 就结合一条简单的select语句 看看Oracle数据库后台的运作机制 这对于我们之后的系统管理与故障排除非常有帮助

第一步 客户端把语句发给服务器端执行

当我们在客户端执行select语句时 客户端会把这条SQL语句发送给服务器端 让服务器端的进程来处理这语句 也就是说 Oracle客户端是不会做任何的 *** 作 他的主要任务就是把客户端产生的一些SQL语句发送给服务器端 虽然在客户端也有一个数据库进程 但是 这个进程的作用跟服务器上的进程作用事不相同的 服务器上的数据库进程才会对SQL语句进行相关的处理 不过 有个问题需要说明 就是客户端的进程跟服务器的进程是一一对应的 也就是说 在客户端连接上服务器后 在客户端与服务器端都会形成一个进程 客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程 所以 由于所有的SQL语句都是服务器进程执行的 所以 有些人把服务器进程形象地比喻成客户端进程的 影子

第二步 语句解析

当客户端把SQL语句传送到服务器后 服务器进程会对该语句进行解析 同理 这个解析的工作 也是在服务器端所进行的 虽然这只是一个解析的动作 但是 其会做很多 小动作

查询高速缓存 服务器进程在接到客户端传送过来的SQL语句时 不会直接去数据库查询 而是会先在数据库的高速缓存中去查找 是否存在相同语句的执行计划 如果在数据高速缓存中 刚好有其他人使用这个查询语句的话 则服务器进程就会直接执行这个SQL语句 省去后续的工作 所以 采用高速数据缓存的话 可以提高SQL语句的查询效率 一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高 另一方面 也是因为这个语句解析的原因

不过这里要注意一点 这个数据缓存跟有些客户端软件的数据缓存是两码事 有些客户端软件为了提高查询效率 会在应用软件的客户端设置数据缓存 由于这些数据缓存的存在 可以提高客户端应用软件的查询效率 但是 若其他人在服务器进行了相关的修改 由于应用软件数据缓存的存在 导致修改的数据不能及时反映到客户端上 从这也可以看出 应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事

语句合法性检查

当在高速缓存中找不到对应的SQL语句时 则数据库服务器进程就会开始检查这条语句的合法性 这里主要是对SQL语句的语法进行检查 看看其是否合乎语法规则 如果服务器进程认为这条SQL语句不符合语法规则的时候 就会把这个错误信息 反馈给客户端 在这个语法检查的过程中 不会对SQL语句中所包含的表名 列名等等进行SQL他只是语法上的检查

语言含义检查

若SQL语句符合语法上的定义的话 则服务器进程接下去会对语句中的字段 表等内容进行检查 看看这些字段 表是否在数据库中 如果表名与列名不准确的话 则数据库会就会反馈错误信息给客户端

所以 有时候我们写select语句的时候 若语法与表名或者列名同时写错的话 则系统是先提示说语法错误 等到语法完全正确后 再提示说列名或表名错误 若能够掌握这个顺序的话 则在应用程序排错的时候 可以节省时间

获得对象解析锁

当语法 语义都正确后 系统就会对我们需要查询的对象加锁 这主要是为了保障数据的一致性 防止我们在查询的过程中 其他用户对这个对象的结构发生改变 对于加锁的原理与方法 我在其他文章中已经有专门叙述 在这里就略过不谈了

数据访问权限的核对

当语法 语义通过检查之后 客户端还不一定能够取得数据 服务器进程还会检查 你所连接的用户是否有这个数据访问的权限 若你连接上服务器的用户不具有数据访问权限的话 则客户端就不能够取得这些数据 故 有时候我们查询数据的时候 辛辛苦苦地把SQL语句写好 编译通过 但是 最后系统返回个 没有权限访问数据 的错误信息 让我们气半死 这在前端应用软件开发调试的过程中 可能会碰到 所以 要注意这个问题 数据库服务器进程先检查语法与语义 然后才会检查访问权限

确定最佳执行计划

当语句与语法都没有问题 权限也匹配的话 服务器进程还是不会直接对数据库文件进行查询 服务器进程会根据一定的规则 对这条语句进行优化 不过要注意 这个优化是有限的 一般在应用软件开发的过程中 需要对数据库的sql语言进行优化 这个优化的作用要大大地大于服务器进程的自我优化 所以 一般在应用软件开发的时候 数据库的优化是少不了的

当服务器进程的优化器确定这条查询语句的最佳执行计划后 就会将这条SQL语句与执行计划保存到数据高速缓存 如此的话 等以后还有这个查询时 就会省略以上的语法 语义与权限检查的步骤 而直接执行SQL语句 提高SQL语句处理效率

第三步 语句执行

语句解析只是对SQL语句的语法进行解析 以确保服务器能够知道这条语句到底表达的是什么意思 等到语句解析完成之后 数据库服务器进程才会真正的执行这条SQL语句

这个语句执行也分两种情况 一是若被选择行所在的数据块已经被读取到数据缓冲区的话 则服务器进程会直接把这个数据传递给客户端 而不是从数据库文件中去查询数据 若数据不在缓冲区中 则服务器进程将从数据库文件中查询相关数据 并把这些数据放入到数据缓冲区中

这里仍然要注意一点 就是Oracle数据库中 定义了很多种类的高速缓存 像上面所说的SQL语句缓存与现在讲的数据缓存 我们在学习数据库的时候 需要对这些缓存有一个清晰的认识 并了解各个种类缓存的作用 这对于我们后续数据库维护与数据库优化是非常有用的

第四步 提取数据

当语句执行完成之后 查询到的数据还是在服务器进程中 还没有被传送到客户端的用户进程 所以 在服务器端的进程中 有一个专门负责数据提取的一段代码 他的作用就是把查询到的数据结果返回给用户端进程 从而完成整个查询动作

从这整个查询处理过程中 我们在数据库开发或者应用软件开发过程中 需要注意以下几点

一是要了解数据库缓存跟应用软件缓存是两码事情 数据库缓存只有在数据库服务器端才存在 在客户端是不存在的 只有如此 才能够保证数据库缓存中的内容跟数据库文件的内容一致 才能够根据相关的规则 防止数据脏读 错读的发生 而应用软件所涉及的数据缓存 由于跟数据库缓存不是一码事情 所以 应用软件的数据缓存虽然可以提高数据的查询效率 但是 却打破了数据一致性的要求 有时候会发生脏读 错读等情况的发生 所以 有时候 在应用软件上有专门一个功能 用来在必要的时候清除数据缓存 不过 这个数据缓存的清除 也只是清除本机上的数据缓存 或者说 只是清除这个应用程序的数据缓存 而不会清除数据库的数据缓存

lishixinzhi/Article/program/Oracle/201311/17595

在故障发生时,尝试用下面的语句抓取数据库引起故障的点。

//

在oracle中监控死锁

//

SELECT snusername,

mSID,

snSERIAL#,

mTYPE,

DECODE(mlmode,

0,

'None',

1,

'Null',

2,

'Row Share',

3,

'Row Excl',

4,

'Share',

5,

'S/Row Excl',

6,

'Exclusive',

lmode,

LTRIM(TO_CHAR(lmode, '990'))) lmode,

DECODE(mrequest,

0,

'None',

1,

'Null',

2,

'Row Share',

3,

'Row Excl',

4,

'Share',

5,

'S/Row Excl',

6,

'Exclusive',

request,

LTRIM(TO_CHAR(mrequest, '990'))) request,

mid1,

mid2

FROM v$session sn, v$lock m

WHERE (snSID = mSID AND mrequest != 0) --存在锁请求,即被阻塞

OR (snSID = mSID --不存在锁请求,但是锁定的对象被其他会话请求锁定

AND mrequest = 0 AND lmode != 4 AND

(id1, id2) IN (SELECT sid1, sid2

FROM v$lock s

WHERE request != 0

AND sid1 = mid1

AND sid2 = mid2))

ORDER BY id1, id2, mrequest;

//

定位引起oracle死锁的sql

//

select sql_text from v$sql where hash_value in

(select sql_hash_value from v$session where sid in

(select session_id from v$locked_object))

//

下面的SQL查询可以用于确定锁住数据库对象的锁:

//

select

cowner,

cobject_name,

cobject_type,

bsid,

bserial#,

bstatus,

bosuser,

bmachine

from

v$locked_object a ,

v$session b,

dba_objects c

where

bsid = asession_id

and

aobject_id = cobject_id;

//

显示哪些会话被锁住

//

/ showlocksql /

COLUMN o_name format a10

COLUMN lock_type format a20

COLUMN object_name format a15

SELECT RPAD (oracle_username, 10) o_name, session_id SID,

DECODE (locked_mode,

0, 'None',

1, 'Null',

2, 'Row share',

3, 'Row Execlusive',

4, 'Share',

5, 'Share Row Exclusive',

6, 'Exclusive'

) lock_type,

object_name, xidusn, xidslot, xidsqn

FROM v$locked_object, all_objects

WHERE v$locked_objectobject_id = all_objectsobject_id;

//

显示所有的TM和TX锁

//

/ showalllocksql /

SELECT SID, TYPE, id1, id2,

DECODE (lmode,

0, 'None',

1, 'Null',

2, 'Row share',

3, 'Row Exclusive',

4, 'Share',

5, 'Share Row Exclusive',

6, 'Exclusive'

) lock_type,

request, ctime, BLOCK

FROM v$lock

WHERE TYPE IN ('TX', 'TM');

//

在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:

被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程

我们发现当一个session被kill掉以后,该session的paddr被修改,如果有多个session被kill,那么多个session

的paddr都被更改为相同的进程地址:

//

alter system kill session 'sid,serial#' ;

//

在oracle中kill掉的进程有时还需要等待pmon回滚数据库已经占有的资源

有时候我们需要使用下面的脚本找出那些已经在oracle中kill掉的进程,在 *** 作系统中在kill一次

//

select paddr from v$process p where pid <> 1

minus

select spaddr from v$session s;

$ kill -9 &paddr

如何检查oracle数据库性能

oracle的性能判断需要综合数据库的多个运行指标来判断:

1、进程数量和占用cpu:这个主要看有没有长时间占用cpu的进行。通常会判断大出sql,需要优化;这个可以用执行计划或者awr报告查看;

2、内存占用:主要用系统命令查看ora_占用和系统总内存的比例,swap的使用率;通常swap使用率低就没事;这个主要使用系统命令;

3、磁盘占用率:防止磁盘空间不足,需要的主要在系统和用户表空间、RMAN等 *** 作上;这个主要使用系统命令;RMAN命令查看

dllhostexe是微软Windows *** 作系统的一部分。dllhostexe用于管理DLL应用。这个程序对你系统的正常运行是非常重要的。

perlexe是一个Perl语言解释器程序。

knownsvrexe是瑞星卡卡上网安全助手60的相关进程,每次启动卡卡时即出现。

cmdexe是微软Windows系统的命令行程序,类似与微软的DOS *** 作系统。cmdexe是一个32位的命令行程序,运行在Windows NT/2000/XP/2003/Vista上。这不是纯粹的系统程序,但是如果终止它,可能会导致未知的问题。

emagentexe是Oracle数据库企业管理器的一个进程,被用来维护你的电脑的稳定和安全的,不能被关闭。

oracle表被锁,找到的进程ID在系统里面找不到这是为什么

ORACLE EBS *** 作某一个FORM界面,或者后台数据库 *** 作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续 *** 作

复制代码 代码如下:--锁表查询SQLSELECT object_name, machine, ssid, sserial#

FROM gv$locked_object l, dba_objects o, gv$session s

WHERE lobject_id = oobject_id

AND lsession_id = ssid;

以上就是关于从一条select语句看Oracle数据库查询工作原理全部的内容,包括:从一条select语句看Oracle数据库查询工作原理、oracle 中查询占用session最多的进程、如何检查oracle数据库性能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9275848.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存