- 避免复杂的多表关联。
- 避免使用*:只提取你所要使用的列;使用别名加快解析速度。
- 避免使用耗费资源的操作,例如DISTINCT/UNION/MINUS/INTERSECT/ORDER BY:通常UNIONS、MINUS、INTERSECT都可以用其他方式重写。
- 自动选择索引:如果表中唯一性索引和非唯一性索引共同存在,ORACLE将使用唯一性索引而完全忽略非唯一性索引。
- 至少要包含组合索引的第一列:如果索引是建立在多个列上,只有在它第一列被where字句引用时,优化器才会选择使用该索引。
- 避免在索引列上使用函数:避免在where子句中对索引字段进行计算,使用WHERE SAL>25000/12替代SAL*12>25000。
- 避免使用前置通配符,如'%23423‘,索引将失效。
- 避免在索引列上使用NOT,例如NOT=0,可以使用>0替代。
- 避免在索引列上使用IS NULL和IS NOT NULL,空值不存在于索引列中。
- 避免出现索引列自动转换,避免将字符串类型和数字类型进行比较。
- 在查询时尽量少用格式转换,尽量直接进行比较。
- 减少访问数据库的次数。
- 使用DECODE减少处理时间,P17。
- 减少对表的查询,可以使用WHERE (col1,col2)=(SELECT col1,col2 FROM tb WHERE xxx)。
- WHERE字句中连接顺序,将返回行可能最少(最具有选择性部分)的字句放在最后。
- 最好不要在WHERE字句中使用函数或表达式,如果使用则使用相同的表达式或函数。
- 联接列:有联接的列无法使用索引。
- 用WHERE替换HAVING,WHERE字句可以限制记录的数目。
- 用索引提高效率。
- 用>=替代>。
- 通过使用>=、<=,避免使用NOT命令。
- 如果有其它办法,不要使用子查询。
- 外部联接“+”,可以替代效率低下的not in,P29。
- 尽量多使用COMMIT。
- 用TRUNCATE替代DELETE。
- 计算统计条数,速度:COUNT(索引)>count(*)>count(1)。
- 驱动表:应用查询的限制条件后,返回较少行源的表作为驱动表。
- 被探查表:从驱动表中得到数据后,在该表寻找符合连接条件的行。
- 组合索引:限制条件包含先导列时,才会使用该组合索引。
- 可选择性:唯一键的数量/表中的行数越接近1,越适合创建索引。
- 通过get_ddl获得建表语句后再建表P38。
- drop或truncate需要先备份,先确定该表记录数,生产上禁止,需要再三核对。
- alter需要先确定记录数,连续查询确认是否有不停的数据插入和变更,禁止数据量不断变化的表和数据量大的表操作,除非确认没有程序访问,not null字段的修改需要长时间锁表。如一定要操作,先创建临时表。
- delete和update严禁不带where条件,需要先查看表大小,业务期间禁止对大表全局操作。
SQL优化与规范
最新推荐文章于 2023-08-22 15:45:56 发布