⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯精品 料推荐⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯
?
?
?
基本的 Sql 编写注意事项
尽量少用 IN 操作符,基本上所有的 IN 操作符都可以用 EXISTS
代替。
不用 NOT IN操作符,可以用 NOT EXISTS或者外连接 +替代。
Oracle 在执行 IN 子查询时,首先执行子查询,将查询结果放
入临时表再执行主查询。而 EXIST则是首先检查主查询,然后运行
子查询直到找到第一个匹配项。 NOT EXISTS比 NOT IN效率稍高。
但具体在选择 IN 或 EXIST操作时,要根据主子表数据量大小来具
体考虑。
不用“ <>”或者“ != ”操作符。对不等于操作符的处理会造成全表扫描,可以用“ <” or “>”代替。
Where子句中出现 IS NULL 或者 IS NOT NULL时, Oracle 会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置
为 NOT NULL。这样就可以用其他操作来取代判断 NULL的操作。
当通配符“ %”或者“ _”作为查询字符串的第一个字符时,索引不会被使用。
对于有连接的列“ || ”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。
如果索引不是基于函数的,那么当在 Where子句中对索引列使用函数时,索引不再起作用。
Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫描。
1
⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯精品 料推荐⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯
?
?
?
对数据类型不同的列进行比较时,会使索引失效。
用“ >=”替代“ >”。
UNION操作符会对结果进行筛选,消除重复,数据量大的情况
下可能会引起磁盘排序。 如果不需要删除重复记录, 应该使用 UNION
ALL。
Oracle 从下到上处理 Where子句中多个查询条件, 所以表连接语句应写在其他 Where条件前,可以过滤掉最大数量记录的条件必须写在 Where子句的末尾。
Oracle 从右到左处理 From子句中的表名, 所以在 From子句中
包含多个表的情况下,将记录最少的表放在最后。(只在采用RBO
优化时有效,下文详述)
?
?
?
Order By 语句中的非索引列会降低性能,可以通过添加索引的
方式处理。严格控制在 Order By 语句中使用表达式。
不同区域出现的相同的 Sql 语句,要保证查询字符完全相同,以利用 SGA共享池,防止相同的 Sql 语句被多次分析。
多利用内部函数提高 Sql
oraclesql优化笔记 来自淘豆网www.taodocs.com转载请标明出处.