Sql优化思路

553 阅读2分钟

SQL优化

一.单表访问

单表访问一般就是走全表扫描或者是走索引 1.如果 SQL查询 返回表中大量数据,一般是走全表扫描 2.如果 SQL查询 返回表中少量数据,一般走索引

二.多表访问

1.两表关联 两表关联方式有,嵌套循环,hash,排序合并连接

1.1.NL嵌套循环,一般用于两表关联,返回少量数据

1.2.HASH,一般用于处理多表关联,返回大量数据

1.3.排序合并连接,一般用于处理两表,非等值连接 根据这些理论,我会先看两个表关联返回多少行数据,返回少走NL,返回多走HASH

2.多表关联,原理一样

三.SQL写法规范

1.sql避免带有标量子查询

2.sql避免带有自定义函数

3.UPDATE后面需要跟子查询

4.注意执行计划是否走了Filter,笛卡尔积等

5.注意执行计划 ,表是不是缺索引分区表有没有做分区裁剪

6.表的统计信息是否过期,有没有收集

四.业务场景

1.分析业务逻辑 你所在业务SQL属于ETL,还是属于报表的 ETL,SQL一般走hash居多,因为处理数据量大 BI,SQL一般走嵌套循环居多,因为返回的结果集小

五.SQL写法

1.SQL里面不能有标量子查询,原因后续补充

2.SQL里面不能有自定义函数,原因后续补充

3.大表join大表容易产生性能问题

4.FROM后面视图和子查询,单独查询快不快,单独查询慢,需要要单独优化

5.WHERE 条件要注意 会不会产生 filter(表示谓词条件只会起到过滤作用,不会影响数据的访问路径),隐式转换导致不走索引 在查看Oracle执行计划的时候经常会遇到Access和filter Access:表示对应的谓词条件会影响数据的访问路径(是按照索引还是表) Filter:表示谓词条件只会起到过滤作用,不会影响数据的访问路径。

6.看表统计信息收集,过期没

7.看表有没有时间过滤字段,有没有对时间过滤字段建分区

8.分析执行计划 ,嵌套循环的驱动表,E-Rows(预估的返回记录数),A-Rows(真实返回的记录数)条目是否正常,大表是否走索引等等

案例后续补充