大家好号我是晓彬今天和大家分享一下SQL执行过程。
1 、用户在客户端执行 SQL 语句时,客户端把这条 SQL 语句发送给服务端,服务端的进程,会处理这条客户端的SQL语句。
2 、服务端进程收集到SQL信息后,会在进程全局区PGA 中分配所需内存,存储相关的登录信息等。
3 、客户端把 SQL 语句传送到服务器后,服务器进程会对该语句进行解析。这个解析的工作是在服务器端所进行的,解析过程又可细化。
(1 )查询高速缓存
服务器进程在接到客户端传送过来的 SQL 语句时,不会直接去数据库查询。服务器进程把这个 SQL 语句的字符转化为 ASCII 等效数字码,接着这个 ASCII 码被传递给一个 HASH 函数,并返回一个 hash 值,然后服务器进程将到 共享池shared pool 中的 高速缓存中去查找是否存在相同的 hash 值。如果存在,服务器进程将使用这条语句已高速缓存在 共享池shared pool 的 高速缓存中的已分析过的版本来执行,这就是是软解析。如果高速缓存中不存在,则需要进行上图后面的步骤,这就是硬解析。硬解析通常占整个 SQL 执行的 60% 左右的时间,硬解析会生成执行树,执行计划,等等。所以,采用高速数据缓存可以提高 SQL 语句的查询效率。主要是因为:一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高很多,另一方面也是因为避免语句解析而节省大量时间。
(2)语法检查
当在高速缓存中找不到对应的 SQL 语句时,则服务器进程就会开始检查这条语句的合法性。这里主要是对 SQL 语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条 SQL 语句不符合语法规则的时候,就会把这个错误信息反馈给客户端。在这个语法检查的过程中,不会对 SQL 语句中所包含的表名、列名等等进行检查,只是检查语法。
(3)语义检查
如果SQL 语句符合语法上的定义的话,则服务器进程接下去会对语句中涉及的表、索引、视图等对象进行解析,并对照数据字典检查这些对象的名称以及相关结构,看看这些字段、表、视图等是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。
(4)获得对象解析锁
为了保证数据的一致性&