2009年(18)
分类: Oracle
2009-05-25 01:07:53
第一步:客户端将SQL查询语句发送给服务器进程
当客户端执行select语句时,客户端会把这条SQL查询语句发送给服务器端。客户端不会做任何的操作。
第二步:解析(Parse)
客户端将SQL查询语句传送到服务器后,服务器进程会对该语句进行解析。
1、服务器进程在接到客户端传送过来的SQL查询语句时,不会直接去数据库查询。而是会先在共享池的库高速缓存中进行查找,是否存在相匹配SQL查询语句的执行计划。如果在共享池的库高速缓存中,刚好有相匹配SQL查询语句的话,则服务器进程就会直接执行这个SQL查询语句,省去后续的工作。因此,采用高速数据缓存的话,可以提高SQL语句的查询效率。(两方面原因:一方面是从内存中读取数据要远比从磁盘中的数据文件中读取数据的效率要高的多,另一方面,是因为此SQL查询语句解析的原因)
2、语句合法性检查。
当在共享池的库高速缓存中找不到相匹配的SQL查询语句时,服务器进程会开始检查这条SQL查询语句的合法性。这里主要是对SQL查询语句的语法进行检查,看看其SQL查询语句是否符合语法规则。如果服务器进程认为这条SQL查询语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。
3、语言含义检查。
若此SQL查询语句符合语法上的定义的话,服务器进程接下来对SQL查询语句中的字段、表等内容进行检查。看看这些字段、表是否存在于数据库中。如果表名与列名不准确的话,则数据库会就错误信息反馈给客户端。
4、获得对象解析锁。
当语法、语义都正确后,系统就会对我们需要查询的对象加锁。其目的是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的表、表结构发生改变。
5、数据访问权限的核对。
当语法、语义通过检查之后,此时客户端还不一定能够取得数据。服务器进程还会检查,当前所连接的用户是否有这个数据访问的权限。若你连接上服务器的用户不具有数据访问权限的话,则客户端就不能够取得这些数据。数据库服务器进程是先检查相关SQL查询语句的语法与语义,最后才会检查其访问权限。
6、确定最佳执行计划。
当语句与语法都没有问题,权限也匹配的话,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的规则,对这条SQL查询语句进行优化。不过要注意,这个优化是有限的。一般在应用软件开发的过程中,需要对数据库的sql语言进行优化,这个优化的作用要大大地大于服务器进程的自我优化。所以,一般在应用软件开发的时候,数据库的优化是少不了的。
当服务器进程的优化器确定这条查询语句的最佳执行计划后,就会将这条SQL查询语句与执行计划保存到数据高速缓存。因此,以后如有相同的查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行SQL查询语句,提高SQL语句处理效率。
第三步:执行(Execute)
语句执行可分两种情况。一是若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给客户端,而不是从数据库文件中去查询数据。若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中。
第四步:提取(Fetch)
当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作。