当前位置:七道奇文章资讯数据防范Oracle防范
日期:2011-01-25 22:55:00  来源:本站整理

<b>Oracle中SQL语句解析的步骤-入门底子</b>[Oracle防范]

赞助商链接



  本文“<b>Oracle中SQL语句解析的步骤-入门底子</b>[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

    我们都知道在Oracle中每条SQL语句在履行之前都需求经过解析,这里面又分为软解析和硬解析.那么这两种解析有何差别之处呢?它们又辨别是若何举行解析呢?Oracle内部解析的步骤又是若何举行的呢?下面我们就这些话题举行共同探究.

    在Oracle中存在两种范例的SQL语句,一类为DDL语句,他们是历来不会同享利用的,也就是每次履行都需求举行硬解析.还有一类就是DML语句,他们会按照情形挑选要末举行硬解析,要末举行软解析.在Oracle 8i OCP教材的023中1-12有阐明SQL语句的解析步骤,当一条SQL语句从客户端进程传送到服务器端进程后,需求履行以下步骤:

    • 在同享池中搜索 SQL 语句的现有副本
    • 考证 SQL 语句的语法能否精确
    • 履行数据字典查找来考证表和列的定义
    • 获得对象的解析锁以便在语句的解析历程中对象的定义不会改变
    • 查抄用户拜候引用筹划对象的权限
    • 肯定语句的最佳履行筹划
    • 将语句和履行筹划载入同享的 SQL 区

    这个先入为主的概念一向占据着我的脑海,我认为硬解析就是上面几个步骤.相关于硬解析,软解析的步骤就是上面第一步找到现有SQL语句的副本后,只需求考证用户能否有权限履行就是了,这样省略上面好几个步骤,相对硬解析来说性能开销就非常小了.即便是在论坛上和大家谈论时,我也一向保持这个见解.直到前一天看了Tom的《Effective Oracle By Design》中关于语句处理的章节后,我才知道这个自己一向保持的概念事实上是错误的.

    事实上,在Oracle中SQL语句的解析步骤以下:

    1、 语法检测.判断一条SQL语句的语法能否符合SQL的标准,比方履行:SQL> selet * from emp;我们便可以看出由于Select关键字少了一个"c",这条语句就无法通过语法查验的步骤了.

    2、 语义查抄.语法精确的SQL语句在解析的第二个步骤就是判断该SQL语句所拜候的表及列能否精确?用户能否有权限拜候或更改呼应的表或列?比方以下语句:

SQL> select * from emp;
select * from emp
*
ERROR at line 1:
ORA-00942: table or view does not exist

    由于查询用户没有可供拜候的emp对象,因此该SQL语句无法通过语义查抄.

    3、 查抄同享池中能否有相同的语句存在.假定履行的SQL语句已经在同享池中存在一样的副本,那么该SQL语句将会被软解析,也就是可以重用已解析过的语句的履行筹划和优化筹划,可以忽视语句解析历程中最耗费资源的步骤,这也是我们为什么一向夸大避免硬解析的缘由.这个步骤又可以分为两个步骤:

    (1)考证SQL语句能否完好一致.在这个步骤中,Oracle将会对传送进来的SQL语句利用HASH函数运算得出HASH值,再与同享池中现有语句的HASH值举行对比看能否一一对应.现有数据库中SQL语句的HASH值我们可以通过拜候v$sql、v$sqlarea、v$sqltext等数据字典中的HASH_VALUE列查询得出.假如SQL语句的HASH值一致,那么ORACLE事实上还需求对SQL语句的语义举行再次检测,以决意能否一致.那么为什么Oracle需求再次对语句文本举行检测呢?不是SQL语句的HASH值已经对应上了?事实上就算是SQL语句的HASH值已经对应上了,并不能阐明这两条SQL语句就已经可以同享了.我们首先参考以下一个例子:假定用户A有自己的一张表EMP,他要履行查询语句:select * from emp;用户B也有一张EMP表,一样要查询select * from emp;这样他们两条语句在文本上是一模一样的,他们的HASH值也会一样,但是由于触及到查询的相关表不一样,他们事实上是无法同享的.假定这时刻用户C又要查询一样一条语句,他查询的表为scott下的公有同义词,还有就是SCOTT也查询一样一张自己的表emp,情形会是若何呢?

SQL> connect a/a
Connected.
SQL> create table emp ( x int );

Table created.

SQL> select * from emp;

no rows selected
SQL> connect b/b
Connected.
SQL> create table emp ( x int );

Table created.

SQL> select * from emp;

no rows selected

SQL> conn scott/tiger
Connected.
SQL> select * from emp;
SQL> conn c/c
Connected.
SQL> select * from emp;
SQL> conn/as sysdba
Connected.
SQL> select address,hash_value, executions, sql_text
2 from v$sql
3 where upper(sql_text) like 'SELECT * FROM EMP%'
4 /

ADDRESS HASH_VALUE EXECUTIONS SQL_TEXT
-------- ---------- ---------- ------------------------
78B89E9C 3011704998 1 select * from emp
78B89E9C 3011704998 1 select * from emp
78B89E9C 3011704998 2 select * from emp

    我们可以看到这四个查询的语句文本和HASH值都是一样的,但是由于查询的对象差别,只有背面两个语句是可以同享的,差别情形的语句还是需求硬解析的.因此在查抄同享池共同SQL语句的时刻,是需求按照具体情形而定的.


  以上是“<b>Oracle中SQL语句解析的步骤-入门底子</b>[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .