暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL语句之常见优化方法 <四>

Oracle优化大师 2018-04-24
499

续<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 删除。
最后修改时间:2019-12-20 10:51:41
文章转载自Oracle优化大师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论