
续<Oracle SQL语句之常见优化方法三>
30+ 使用?参数形式:
尽量不要使用拼接字串的方式,因为带有?的参数形式会缓存分析结果,省去上面很多步骤。
31 在基于基础表的查询中经常需要对另一个表进行联接。在这种情况下, 使用EXISTS(或NOT
EXISTS)通常将提高查询的效率。在子查询中,NOT IN子句将执行一个内部的排序和合并。无
论在哪种情况下,NOT IN都是最低效的(要对子查询中的表执行了一个全表遍历)。所以尽量将
NOT IN改写成外连接(Outer Joins)或NOT EXISTS。
(高效)
SELECT a.*
FROM temp(基础表) a
WHERE age > 0
AND EXISTS (SELECT 1
FROM temp1
WHERE a.id = id
AND NAME = 'TOM');
(低效)
SELECT a.*
FROM temp(基础表) a
WHERE age > 0
AND a.id IN (SELECT id
FROM temp1
WHERE NAME = 'TOM');
32 用索引提高效率:
索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了复杂的自平衡B-tree结
构。通常通过索引查询数据比全表扫描要快。当ORACLE找出执行查询和Update语句的最佳路径
时, ORACLE优化器将使用索引。同样在联结多个表时使用索引也可以提高效率。
另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证。那些LONG或LONG RAW
数据类型, 你可以索引几乎所有的列。通常在大型表中使用索引特别有效。在扫描小表时,使
用索引同样能提高效率。
使用索引虽能得到查询效率的提高,但也必须注意到它的代价。索引需要空间来存储,也需
要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改。这意味着每
条记录的INSERT、DELETE、UPDATE将为此多付出4、5 次的磁盘I/O。因为索引需要额外的存
储空间和处理,一些不必要的索引反而会使查询反应时间变慢。
定期的重构索引:
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
33 避免在索引列上使用计算
WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。
高效:
SELECT …
FROM temp
WHERE sal > 25000 12;
低效:
SELECT …
FROM temp
WHERE sal * 12 > 25000;
34 用UNION替换OR(适用于索引列):
用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫
描。注意,以上规则只针对多个索引列有效。如果有column没有被索引, 查询效率可能
会因为你没有选择OR而降低。
高效:
SELECT *
FROM user_tab1
WHERE user_id = 10
UNION
SELECT *
FROM user_tab1
WHERE age = 20;
低效:
SELECT *
FROM user_tab1
WHERE user_id = 10
OR age = 20;
35 避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。
对于单列索引,如果列包含空值,索引中将不存在此记录。
对于复合索引,如果每个列都为空,索引中同样不存在此记录。如果至少有一个列不为
空,则记录存在于索引中。
如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null),
ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入)。然而如果所有的索引列
都为空,ORACLE将认为整个键值为空而空不等于空。因此你可以插入10000条具有相同键值
的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空
值比较将使ORACLE停用该索引。
高效: (索引有效)
SELECT *
FROM department
WHERE dept_code >= 0;
低效: (索引失效)
SELECT *
FROM department
WHERE dept_code IS NOT NULL;
36 使用大写
Oracle中会把所有的语句转换成大写,
有些内部表,如,查询表名时,判断某个表是否存在,如果是大写有效,小写就是无效的.
37 根据磁盘读写速率调整块的大小
一个Oracle数据库中,表空间、段、区、数据块的概念,可以根据服务器的I/O性能调整块的大小。
敬请关注 下期更精彩

本文分享自微信公众号 - Oracle优化大师,如有侵权,请联系 service001@enmotech.com 删除。




