从Select语句看Oracle查询原理

Select语句能够说是DBA和数据库开发者在工做中使用最多的语句之一,但这条语句是如何执行?在Oracle数据库中又是如何运做的呢?今天咱们就从一条简单的Select语句开始,看看Oracle数据库后台的运做机制。这对于咱们以后的系统管理与故障排除很是有帮助。前端

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

  当咱们在客户端执行select语句时,客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle客户端是不会作任何的操做,他的主要任务就是把客户端产生的一些SQL语句发送给服务器端。虽然在客户端也有一个数据库进程,可是,这个进程的做用跟服务器上的进程做用事不相同的。服务器上的数据库进程才会对SQL语句进行相关的处理。不过,有个问题须要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端链接上服务器后,在客户端与服务器端都会造成一个进程,客户端上的咱们叫作客户端进程;而服务器上的咱们叫作服务器进程。因此,因为全部的SQL语句都是服务器进程执行的,因此,有些人把服务器进程形象地比喻成客户端进程的“影子”。sql

  第二步:语句解析。

  当客户端把SQL语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个解析的工做,也是在服务器端所进行的。虽然这只是一个解析的动做,可是,其会作不少“小动做”。数据库

  一、查询高速缓存。

服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。若是在数据高速缓存中,恰好有其余人使用这个查询语句的话,则服务器进程就会直接执行这个SQL语句,省去后续的工做。因此,采用高速数据缓存的话,能够提升SQL语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另外一方面,也是由于这个语句解析的缘由。缓存

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

  二、语句合法性检查。

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

  三、语言含义检查。

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

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

  四、得到对象解析锁。

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

      五、数据访问权限的核对。

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

  六、肯定最佳执行计划。

  当语句与语法都没有问题,权限也匹配的话,服务器进程仍是不会直接对数据库文件进行查询。服务器进程会根据必定的规则,对这条语句进行优化。不过要注意,这个优化是有限的。通常在应用软件开发的过程当中,须要对数据库的sql语言进行优化,这个优化的做用要大大地大于服务器进程的自我优化。因此,通常在应用软件开发的时候,数据库的优化是少不了的。

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

  第三步:语句执行。

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

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

  这里仍然要注意一点,就是Oracle数据库中,定义了不少种类的高速缓存。像上面所说的SQL语句缓存与如今讲的数据缓存。咱们在学习数据库的时候,须要对这些缓存有一个清晰的认识,并了解各个种类缓存的做用。这对于咱们后续数据库维护与数据库优化是很是有用的。

  第四步:提取数据。

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

  从这整个查询处理过程当中,咱们在数据库开发或者应用软件开发过程当中,须要注意如下几点:

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

  二是绝大部分SQL语句都是按照这个处理过程处理的。咱们DBA或者基于Oracle数据库的开发人员了解这些语句的处理过程,对于咱们进行涉及到SQL语句的开发与调试,是很是有帮助的。有时候,掌握这些处理原则,能够减小咱们排错的时间。特别要注意,数据库是把数据查询权限的审查放在语法语义的后面进行检查的。因此,有时会若光用数据库的权限控制原则,可能还不能知足应用软件权限控制的须要。此时,就须要应用软件的前台设置,实现权限管理的要求。并且,有时应用数据库的权限管理,也有点显得繁琐,会增长服务器处理的工做量。所以,对于记录、字段等的查询权限控制,大部分程序涉及人员喜欢在应用程序中实现,而不是在数据库上实现。

相关文章
相关标签/搜索