1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
- where子句连接顺序,DB2采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.表存在分区时,分区在条件使用中排在第一位,概率最大的条件放在最后。
- select 子句中避免使用 “*” 说明:当想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*' 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,DB2在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
- 减少关联表的数量,不必要的维表先不要关联
- 尽量多使用commit;提交
2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
假设有TAB1、TAB2两个表,其中TAB1表数据量较小,而TAB2表数据量很大,适用exists 。
如:
select *
from tab1
where exists(select 1 from tab2 where tab1.col=tab2.col) ;
若TAB2表数据量较小,而TAB1表数据量很大,适用in 。
如:
select *
from tab1
where tab1.col in (select tab2.col from tab2) ;
3.如何查看到效率低的SQL?
使用执行计划进行查看,确认那一步骤最耗时间,然后再进行优化。
4.请简要总结下,您的SQL语句优化技巧(至少写3点)
- 尽量多使用COMMIT
- in、exists使用规范
- 避免不必要的排序
- 用Where子句替换HAVING子句
- 用UNION-ALL 替换UNION ( 如果有可能的话)
- 尽量使用DB2的内建函数。如:replace,substr,instr等等