论文部分内容阅读
摘要:在IT技术高速发展的今天,数据库技术的地位越来越重要。Oracle以其卓越的性能获得了广泛的应用。成为国内高端数据库市场的主流产品和众多行业信息化系统的主要支柱。本文分析了Oracle数据查询语句执行过程。
关键词:Oracle 语法分析 SQL
在IT技术高速发展的今天,数据库技术的地位越来越重要。任何大型信息系统,都需要有数据库管理系统作为支撑。其中,Oracle以其卓越的性能获得了广泛的应用。成为国内高端数据库市场的主流产品和众多行业信息化系统的主要支柱。无论是ERP、CRM、SCM,还是MIS、OA、和电子商务,Oracle数据库都是首选产品之一。如何充分利用Oracle的各种功能来提高数据库的可用性已经成为不断提高Oracle应用水平和提高Oracle数据库应用系统性能的关键。本文分析了Oracle数据查询语句执行过程
一、SQL查询语句的执行过程
SQL语句在Oracle中是自动执行的,绝大多数用户不需要关心各个阶段的执行细节。但是,对执行的各个阶段的了解会有助于我们快速找到性能低下的SQL语句,帮助我们书写出更高效的SQL语句,进而解决问题。几乎所有的SQL语句都分为语法分析、执行、读取数据三个大阶段进行处理。
1.语法分析
语法分析阶段在SQL语句的执行过程中是最耗时间的阶段,其中要执行的操作较多,可分为以下步骤进行:
·创建游标
游标(cursor)是由程序接口调用自动创建的,不需要开发人员干预。任何的SQL语句都会创建它。在预编译程序(pro*c)和存储过程中创建的游标可能是隐式的,也可能是显式的。
·分析语句
SQL语句从用户进程传送到Oracle分析后.语句本身和分析的信息都被装入到共享SQL区。在这个阶段要执行下列操作以解决一些错误:
验证SQL语句书写的正确性,类似语法检查。
在数据字典中查找对比,以验证SQL中表和列等对象定义的合法性。
在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变对些对象的定义。
验证为存取所涉及的模式对象所需的权限是否满足。
决定该语句的最佳执行计划。
将它装入共享SQL区。
对分布的语句而言,把语句的全部或部分路由到包含所涉及数据的远程节点。
以上任何一步出现错误,都将导致语句报错,中止执行。语法分析需要花费较多的资源,如果在共享池中不存在等价的SQL语句时,就会对SQL语句进行语法分析,对于相同的语句不管要执行多少次,只要该语句还在共享SQL区中,就可以不用重新分析而直接使用其对应的执行计划对数据进行存取。要提高语句的共享程度,主要通过绑定变量(Bind Variable)实现.另外,对于查询语句,因为涉及到返回一行或多行结果集,我们可以采用批量Fetch数据的方式降低网络开销,提高查询效率。
·定义查询的输出数据
指定与查询出的列值对应的接收变量的位置、大小和数据类型。Oracle会将接收变量的类型与对应的列类型相比较以自动实现数据类型的转换。
2.执行语句
在Oracle得到所有需要的信息与资源后,就可以真正运行SQL语句了。对于SELECT语句或INSERT语句,因为没有发生数据改变,所以不需要锁定任何行,但对于UPDATE或DELETE语句,这些语句影响到的所有行都将被锁定,防止用户提交或回滚之前,别的用户对这些数据进行修改,保证数据的一致性。
3.读取数据
符合条件的行数据被取出来,每个后续的存取操作检索结果集中的下一行数据,直到最后一行被取出来。可以采用批量Fetch的方式优化性能。SQL语句处理的最后一步就是关闭游标。
二、Oracle查询优化器
SQL是一种非过程化的语言,用户只需要发出取出数据的命令,对于数据的取出方式,比如是通过索引还是全表扫描,则由数据库的优化器决定。Oracle的优化器用来决定SQL访问数据的有效路径,使语句执行所需要的开销最小。在Oracle的发展过程中,~共开发过两类优化器:基于规则的优化器和基于成本的优化器。它们的不同之处主要在于取得代价的方法与衡量代价的大小不同。
1、基于规则优化器(RBO)
基于规则优化器检查SQL语句语法,使用所引用对象结构的数据字典信息,然后采用一组规则,确定最佳计划。基于规则优化器用15种不同访问路径和相关等级确定执行计划。由于低等级的访问路径比高等级的访问路径快,所以当有多个访问路径时,优化器采用最低等级的访问路径。具体执行时,基于规则优化器采用Where子句中的谓词来确定访问路径,如果谓词中的某一列上有索引,那么优化器将采用这个索引访问表,而不考虑其他因素。另外,基于规则优化器在From子句中按从右到左来决定表的访问顺序,由于大多数查询都将受益于可以返回少量行或只返回一行的有选择或唯一判定联合条件的使用。RBO使用固定的排列顺序,因此当使用RBO时,就必须在From子句中正确排列表的顺序。
2、基于成本优化器(CBO)
基于成本的优化方法是用一个集成到数据库内核中的成本估算器来估算每个可能的执行计划需要的成本,成本的大小是根据执行该SQL语句的资源使用量(CPU和I/O)与运行时间等因素估算得到的。优化器选择成本最小的一个执行计划作为SQL语句的真正执行计划。使用基于成本优化器时,需要有表和索引的分析数据作为基础数据,这些分析数据用ANALYZE命令或DBMS STATS包进行收集。在Oracle 9i中,如果没有统计数据,则会使用缺省值,这可能会导致优化器选择错误的执行计划,影响查询性能。Oracle l0g以后,分析工作变成自动的了,减轻了DBA的负担,不过在一些特殊情况下,也需要进行一些手工分析。随着Oracle版本的不断提高,基于成本优化器已经足够强大与智能,OracleI0g以后,Oracle自己开发的应用系统也使用基于成本优化器了。一般来说,应当使用基于成本优化器而不用基于规则优化器。
三、结论
总之,Oracle要实现许多步骤才能完成SQL查询语句的执行,优化器将这些步骤组合在一起就称为SQL查询语句的执行计划。从执行计划中我们可以看出数据库是如何执行查询语句,判断出查询语句的执行是否高效,从而制定查询的优化方案。
参考文献
[1]蔡柳萍. SQL查询语句的优化[J]. 经营管理者. 2011(01)
[2]王韦,王颖. 基于对象的RDBS查询优化研究[J]. 中国电力教育. 2008(S1)
[3]胡皓. SQL查询语句优化研究[J]. 舰船电子对抗. 2007(04)
[4]李可可. 浅析Oracle数据库的性能优化方法[J]. 硅谷. 2011(02)
关键词:Oracle 语法分析 SQL
在IT技术高速发展的今天,数据库技术的地位越来越重要。任何大型信息系统,都需要有数据库管理系统作为支撑。其中,Oracle以其卓越的性能获得了广泛的应用。成为国内高端数据库市场的主流产品和众多行业信息化系统的主要支柱。无论是ERP、CRM、SCM,还是MIS、OA、和电子商务,Oracle数据库都是首选产品之一。如何充分利用Oracle的各种功能来提高数据库的可用性已经成为不断提高Oracle应用水平和提高Oracle数据库应用系统性能的关键。本文分析了Oracle数据查询语句执行过程
一、SQL查询语句的执行过程
SQL语句在Oracle中是自动执行的,绝大多数用户不需要关心各个阶段的执行细节。但是,对执行的各个阶段的了解会有助于我们快速找到性能低下的SQL语句,帮助我们书写出更高效的SQL语句,进而解决问题。几乎所有的SQL语句都分为语法分析、执行、读取数据三个大阶段进行处理。
1.语法分析
语法分析阶段在SQL语句的执行过程中是最耗时间的阶段,其中要执行的操作较多,可分为以下步骤进行:
·创建游标
游标(cursor)是由程序接口调用自动创建的,不需要开发人员干预。任何的SQL语句都会创建它。在预编译程序(pro*c)和存储过程中创建的游标可能是隐式的,也可能是显式的。
·分析语句
SQL语句从用户进程传送到Oracle分析后.语句本身和分析的信息都被装入到共享SQL区。在这个阶段要执行下列操作以解决一些错误:
验证SQL语句书写的正确性,类似语法检查。
在数据字典中查找对比,以验证SQL中表和列等对象定义的合法性。
在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变对些对象的定义。
验证为存取所涉及的模式对象所需的权限是否满足。
决定该语句的最佳执行计划。
将它装入共享SQL区。
对分布的语句而言,把语句的全部或部分路由到包含所涉及数据的远程节点。
以上任何一步出现错误,都将导致语句报错,中止执行。语法分析需要花费较多的资源,如果在共享池中不存在等价的SQL语句时,就会对SQL语句进行语法分析,对于相同的语句不管要执行多少次,只要该语句还在共享SQL区中,就可以不用重新分析而直接使用其对应的执行计划对数据进行存取。要提高语句的共享程度,主要通过绑定变量(Bind Variable)实现.另外,对于查询语句,因为涉及到返回一行或多行结果集,我们可以采用批量Fetch数据的方式降低网络开销,提高查询效率。
·定义查询的输出数据
指定与查询出的列值对应的接收变量的位置、大小和数据类型。Oracle会将接收变量的类型与对应的列类型相比较以自动实现数据类型的转换。
2.执行语句
在Oracle得到所有需要的信息与资源后,就可以真正运行SQL语句了。对于SELECT语句或INSERT语句,因为没有发生数据改变,所以不需要锁定任何行,但对于UPDATE或DELETE语句,这些语句影响到的所有行都将被锁定,防止用户提交或回滚之前,别的用户对这些数据进行修改,保证数据的一致性。
3.读取数据
符合条件的行数据被取出来,每个后续的存取操作检索结果集中的下一行数据,直到最后一行被取出来。可以采用批量Fetch的方式优化性能。SQL语句处理的最后一步就是关闭游标。
二、Oracle查询优化器
SQL是一种非过程化的语言,用户只需要发出取出数据的命令,对于数据的取出方式,比如是通过索引还是全表扫描,则由数据库的优化器决定。Oracle的优化器用来决定SQL访问数据的有效路径,使语句执行所需要的开销最小。在Oracle的发展过程中,~共开发过两类优化器:基于规则的优化器和基于成本的优化器。它们的不同之处主要在于取得代价的方法与衡量代价的大小不同。
1、基于规则优化器(RBO)
基于规则优化器检查SQL语句语法,使用所引用对象结构的数据字典信息,然后采用一组规则,确定最佳计划。基于规则优化器用15种不同访问路径和相关等级确定执行计划。由于低等级的访问路径比高等级的访问路径快,所以当有多个访问路径时,优化器采用最低等级的访问路径。具体执行时,基于规则优化器采用Where子句中的谓词来确定访问路径,如果谓词中的某一列上有索引,那么优化器将采用这个索引访问表,而不考虑其他因素。另外,基于规则优化器在From子句中按从右到左来决定表的访问顺序,由于大多数查询都将受益于可以返回少量行或只返回一行的有选择或唯一判定联合条件的使用。RBO使用固定的排列顺序,因此当使用RBO时,就必须在From子句中正确排列表的顺序。
2、基于成本优化器(CBO)
基于成本的优化方法是用一个集成到数据库内核中的成本估算器来估算每个可能的执行计划需要的成本,成本的大小是根据执行该SQL语句的资源使用量(CPU和I/O)与运行时间等因素估算得到的。优化器选择成本最小的一个执行计划作为SQL语句的真正执行计划。使用基于成本优化器时,需要有表和索引的分析数据作为基础数据,这些分析数据用ANALYZE命令或DBMS STATS包进行收集。在Oracle 9i中,如果没有统计数据,则会使用缺省值,这可能会导致优化器选择错误的执行计划,影响查询性能。Oracle l0g以后,分析工作变成自动的了,减轻了DBA的负担,不过在一些特殊情况下,也需要进行一些手工分析。随着Oracle版本的不断提高,基于成本优化器已经足够强大与智能,OracleI0g以后,Oracle自己开发的应用系统也使用基于成本优化器了。一般来说,应当使用基于成本优化器而不用基于规则优化器。
三、结论
总之,Oracle要实现许多步骤才能完成SQL查询语句的执行,优化器将这些步骤组合在一起就称为SQL查询语句的执行计划。从执行计划中我们可以看出数据库是如何执行查询语句,判断出查询语句的执行是否高效,从而制定查询的优化方案。
参考文献
[1]蔡柳萍. SQL查询语句的优化[J]. 经营管理者. 2011(01)
[2]王韦,王颖. 基于对象的RDBS查询优化研究[J]. 中国电力教育. 2008(S1)
[3]胡皓. SQL查询语句优化研究[J]. 舰船电子对抗. 2007(04)
[4]李可可. 浅析Oracle数据库的性能优化方法[J]. 硅谷. 2011(02)