写出高效的SQL所需要注意的

近期面试不少,有一点感触比较明显。可能面试官所期望你回答的不在一个层面上,比如他问如何写SQL如何高效,我开始说索引的应用,何时可用上索引 等;比如说线程的实现,我开始谈1.5的Concurrent包的新方法。我以为这是亮点,可惜别人只是想考研一下你的基本功,然后由浅入深吧。既然这 样,还是将细节一一列举,虽然写出来可能像程序员面试宝典的内容,但是也算是一次归纳总结吧。

进入正题:

  1. Where子句中的连接顺序:
    ORACLE采用自下而上的顺序解析WHERE子句。
    根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
  2. Select子句中避免使用 “ * ”
    当你想在select子句中列出所有的column时,使用动态SQL列引用 ‘*' 是一个方便的方法。
    不幸的是,这是一个非常低效的方法。
    实际上,ORACLE在解析的过程中,会将 '*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
  3. 拒绝复杂的SQL,若SQL太复杂可能由于模型设计不当导致,可以用冗余,临时表等方案解决。
  4. 尽量减少对于数据库的访问次数。当执行每条SQL语句时,ORACLE在内部执行了许多工作:
    解析SQL语句、估算索引的利用率、绑定变量、读数据块等等。
    由此可见,减少访问数据库的次数,就能实际上减少ORACLE的工作量。
  5. 用exists代替in,用left join 代替 not exists和not in
  6. union 会删除重复的,因此两个结果集合并的时候会涉及重排序,而union all则不会

 

下面是一些索引相关:

  1. is (not) null 用不到索引
  2. like ‘ATA%’ 可以用上索引,‘%ATA’相反
  3. <>等非操作用不到索引
  4. 联合索引的第一个属性没有用上,也不会触发索引

 

先写这么多吧,想到再补。

 

洗了个澡又想了下,其实谈论技术的时候应该是一个由浅入深,或者概要到细节的过程。谈到数据库,主要是谈及SQL,然后写SQL应该注意的一些基本原 则,如不用in,不用select *;再谈到优化,例如建模的时候考虑到可能的数据量和数据使用常见,而确定在哪些字段建立索引,然后就是用上索引的条件;还可以谈谈一般优化过程,通过 oracle的EM分析,看顶级活动,再进行执行分析调优;调优可以改变实现逻辑,可以技术调优等等。

posted on 2011-11-07 23:12  死写代码的  阅读(480)  评论(0)    收藏  举报

导航