看了一篇oracle执行顺序滴,感觉挺好滴
转http://blog.csdn.net/wonth/article/details/1598446
1。分析
分析是处理SQL语句的第一步,它是SQL语句处理过程较为重要的一步,它又包含几个方面:
(1)语法分析,oracel是采用数据库常用的自底向上的分析方法,包含检查语法规范,命名规范,它是处理SQL语句中最消耗时间且代价最高的步骤,主要表现在绑定变量和存储过程等方面:
A.绑定变量:这也是为什么使用在某种情况下绑定变量方式会比非绑定方式效率和性能高出几倍,主要是绑定变量只会编译一次,随后就会把查询计划存储在一个共享池里,以便以后获取和重用这个查询计划。
B.存储过程:存储过程比一般的SQL语句要快,就是它不用再次编译,而且还可以利用数据库里许多特性,使得它的速度会比一般SQL语句快很多
(2)语义分析,学过编译原理的都知道,这一步是非常重要的,ORACLE主要是分析SQL语句格式是否正确,各个对象是否存在,以及它是否有足够的权限执行
(3)视图转换,它会将涉及的视图的查询语句转换为较为简单的等效连接表达式,有些人认为视图一定执行速度会比使用表要快,其实不一定的,主要具体情况具体分析,只要把这篇文章真正理解,自己分析是不困难的;
(4)表达式转换。将复杂的SQL表达式转换为相应的对基表的查询语句。写SQL的标准
A.不要再WHERE字句中进行计算,如SELECT AT_ID FROM ARTICLE WHERE AT_ID >10*10000 AND AT_ID<(10+1)*10000是不允许的就是这个原理
B.注意数据类型的匹配
SELECT BK_ID FROM BOOK WHERE BK_PRICE>30 就比不上SELECT BK_ID FROM BOOK WHERE BK_PRICE>30.00好啦
(5)选择优化器,学过编译原理时候就知道,使用不用的优化器是会有不同的执行效率,当然,最好是能根据批量的SQL自己编一个特定的优化器
(6)选择连接方式。INFORMIX就有简单的归并连接 和排序-归并连接技术之分,主要看是否使用索引的问题。
(7)选择连接顺序。多表连接,oracle选择那一个对表先连接,并选择源数据表
(8)选择数据搜索路径,根据以上条件选择合适的数据搜苏路径,如选用全表搜索还是利用索引或是其他方式搜索
(9)到SQL中为该SQL语句找到一个共享SQL区,如已经有共享SQL区,则直接执行共享区内容。
2。执行
主要在于使用UPDATE和DELETE语句时,必须将行锁定,以免其他用户修改。ORACLE先从数据库缓冲区中寻找是否存在所要的数据块,如果存在,就直接读或修改,否则从物理文件中读到数据库缓冲区中。
3。返回结果
对SELECT 语句需要返回结果的语句,首先看是否需要排序,需要,则排序后返回给用户,然后根据内存的大小不同,可以一次取出一行数据,一可以一次取一组数据。这时,可能要用到数据结构中的外部排序,并归排序等算法,所以如内存允许的话,尽量大会提高性能的;
最后总结一下经用使用的SELECT的处理步骤:
打开游标
|
---------查看共享SQL区,是否有相同的SQL语句
| |
| 分析
| |
| 定义
------------------------ |
|
------------------------- 绑定变量
| |
| 捆绑
--------------- ----------- |
|
并行处理
|
执行查询
|
返回结果
|
关闭游标