写出高效的SQL所需要注意的
近期面试不少,有一点感触比较明显。可能面试官所期望你回答的不在一个层面上,比如他问如何写SQL如何高效,我开始说索引的应用,何时可用上索引 等;比如说线程的实现,我开始谈1.5的Concurrent包的新方法。我以为这是亮点,可惜别人只是想考研一下你的基本功,然后由浅入深吧。既然这 样,还是将细节一一列举,虽然写出来可能像程序员面试宝典的内容,但是也算是一次归纳总结吧。
进入正题:
- Where子句中的连接顺序:
ORACLE采用自下而上的顺序解析WHERE子句。
根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。 - Select子句中避免使用 “ * ”:
当你想在select子句中列出所有的column时,使用动态SQL列引用 ‘*' 是一个方便的方法。
不幸的是,这是一个非常低效的方法。
实际上,ORACLE在解析的过程中,会将 '*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。 - 拒绝复杂的SQL,若SQL太复杂可能由于模型设计不当导致,可以用冗余,临时表等方案解决。
- 尽量减少对于数据库的访问次数。当执行每条SQL语句时,ORACLE在内部执行了许多工作:
解析SQL语句、估算索引的利用率、绑定变量、读数据块等等。
由此可见,减少访问数据库的次数,就能实际上减少ORACLE的工作量。 - 用exists代替in,用left join 代替 not exists和not in
- union 会删除重复的,因此两个结果集合并的时候会涉及重排序,而union all则不会
下面是一些索引相关:
- is (not) null 用不到索引
- like ‘ATA%’ 可以用上索引,‘%ATA’相反
- <>等非操作用不到索引
- 联合索引的第一个属性没有用上,也不会触发索引
先写这么多吧,想到再补。
洗了个澡又想了下,其实谈论技术的时候应该是一个由浅入深,或者概要到细节的过程。谈到数据库,主要是谈及SQL,然后写SQL应该注意的一些基本原 则,如不用in,不用select *;再谈到优化,例如建模的时候考虑到可能的数据量和数据使用常见,而确定在哪些字段建立索引,然后就是用上索引的条件;还可以谈谈一般优化过程,通过 oracle的EM分析,看顶级活动,再进行执行分析调优;调优可以改变实现逻辑,可以技术调优等等。
浙公网安备 33010602011771号