从一条 select 语句看 Oracle 数据库查询工作原理
假如,我们现在利用 Select 语句从数据库查询数据,Oracle 数据库是如何运作的呢?从
中我们可以领悟到什么呢?下面,就结合一条简单的 select 语句,看看 Oracle 数据库后台的
运作机制。这对于我们之后的系统管理与故障排除非常有帮助。
第一步:客户端把语句发给服务器端执行。
当我们在客户端执行 select 语句时,客户端会把这条 SQL 语句发送给服务器端,让服
务器端的进程来处理这语句。也就是说,Oracle 客户端是不会做任何的操作,他的主要任
务就是把客户端产生的一些 SQL 语句发送给服务器端。虽然在客户端也有一个数据库进程,
但是,这个进程的作用跟服务器上的进程作用事不相同的。服务器上的数据库进程才会对
SQL 语句进行相关的处理。不过,有个问题需要说明,就是客户端的进程跟服务器的进程
是一一对应的。也就是说,在客户端连接上服务器后,在客户端与服务器端都会形成一个
进程,客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程。所以,由于所
有的 SQL 语句都是服务器进程执行的,所以,有些人把服务器进程形象地比喻成客户端进
程的“影子”。
第二步:语句解析。
当客户端把 SQL 语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个
解析的工作,也是在服务器端所进行的。虽然这只是一个解析的动作,但是,其会做很多
“小动作”。
1、查询高速缓存。服务器进程在接到客户端传送过来的 SQL 语句时,不会直接去数
据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果
在数据高速缓存中,刚好有其他人使用这个查询语句的话,则服务器进程就会直接执行这
个 SQL 语句,省去后续的工作。所以,采用高速数据缓存的话,可以提高 SQL 语句的查
询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一
方面,也是因为这个语句解析的原因。不过这里要注意一点,这个数据缓存跟有些客户端
软件的数据缓存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设
置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若
其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能
及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据
缓存不是一码事。
2、语句合法性检查。
当在高速缓存中找不到对应的 SQL 语句时,则数据库服务器进程就会开始检查这条语
句的合法性。这里主要是对 SQL 语句的语法进行检查,看看其是否合乎语法规则。如果服