今天看到有人发帖问“为什么在select语句中用字段代替*的查询效率会高一些”,我也知道使用*时oracle会去查询数据字典来获取指定表的字段,而如果写上具体字段,则不需要这一步。
oracle执行查询语句的步骤大致分为:
 1、语法检查(syntax check):检查此sql的拼写是否语法。
 2、语义检查(semantic check):诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。
 3、对sql语句进行解析(prase):利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan)。
 4、执行sql,返回结果(execute and return)
其中语义检查是检查sql涉及的表和字段是否存在,以及用户是否具备访问权限,这个操作应该是从数字字典中获取信息的。我想知道使用select *时查询数据字典获取表对应的字段这个操作在什么时候执行的?是在语义检查之前,还是语义检查的过程中,如果在语义检查之前那么多访问一次数据字典肯定会对性能造成影响,但是如果在语义检查的过程中同样是访问数据字典那么影响就不大了。这是我个人的一点理解,期待高手解答oracle解析select * 的详细流程,非常感谢!

解决方案 »

  1.   

    个人认为,列名检查应该属于语义检查,select *与具体列名从微观上说,
    性能肯定是有区别,从宏观上说,区别不大。几乎可以忽略不记。
    关键还是select * 对程序维护、扩展、健壮性上的影响。
      

  2.   

    个人也觉得select * 对性能的影响很小,但是对于从数据字典获取字段信息的时间不清楚,还是希望懂的人解释一下,谢谢。
      

  3.   

    http://tech.it168.com/a2011/0415/1178/000001178768.shtml
      

  4.   

    我的意见:
    1、在固定业务的情况下不要用*号。
    2、sql语句最好用大写字符。
    3、sql解析,首先查询hash值是否与要执行的sql一致的,如果有直接调用,没有解析,解析后执行。
    4、因为解析需要占用数据库服务器的内存和cpu的资源,所以提倡sql语句以变量绑定的形式来请求数据库服务。
      

  5.   

    ----select *时查询数据字典获取表对应的字段这个操作在什么时候执行的
    select本身不是最先的执行的。
    ----从语义上是有区别的
    从大体上没有什么区别,细节还是有区别的。
      

  6.   

    支持6楼的观点,oracle SQL对大小写是不敏感的,大小写只是规范而已,然而SQL执行过程中确实会存在解析过程,
    首先:检查SQL语句的语法和语义,生成SQL语句的执行计划。存放在共享池中。
    服务器进程按SQL语句执行计划执行SQL。提取数据:将被选择行数据返回到客户端。下面是两种解析类型:
    第一种是硬解析(hard parse),数据库实例第一次解析查询时完成的就是硬解析,其中包括查询计划的生成和优化。
    第二种解析是软解析(soft parse),在此会跳过硬解析的许多步骤还盼大牛给个精准的解析