Oracle Sql优化笔记

来源:互联网 发布:我国颁布的网络法规 编辑:程序博客网 时间:2024/05/22 04:35

基本的Sql写注意事

  • 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。
  • 不用NOT IN操作符,可以用NOT EXISTS或者外+替代。
  • OracleIN查询时,首先行子查询,将查询结果放入临时表再行主查询。而EXIST是首先检查查询,然后运行子查询直到找到第一个匹配NOT EXISTSNOT IN效率稍高。但具体在选择INEXIST操作,要根据主子表数据量大小来具体考
  • 不用“<>”或者“!=”操作符。不等于操作符的理会造成全表描,可以用“<” or “>”代替。
  • Where子句中出IS NULL或者IS NOT NULLOracle会停止使用索引而行全表描。可以考设计索引列NOT NULL这样就可以用其他操作来取代判断NULL的操作。
  • 当通配符“%”或者“_”为查询字符串的第一个字符,索引不会被使用。
  • 于有接的列“||”,最后一个接列索引会无效。尽量避免接,可以分开连接或者使用不作用在列上的函数替代。
  • 如果索引不是基于函数的,那当在Where子句中索引列使用函数,索引不再起作用。
  • Where子句中避免在索引列上使用算,否致索引失效而行全表描。
  • 数据型不同的列行比较时,会使索引失效。
  • “>=”替代“>”
  • UNION操作符会对结筛选,消除重,数据量大的情况下可能会引起磁排序。如果不需要除重复记录应该使用UNION ALL
  • Oracle从下到上Where子句中多个查询条件,所以表写在其他Where条件前,可以过滤掉最大数量记录的条件必写在Where子句的末尾。
  • Oracle从右到左From子句中的表名,所以在From子句中包含多个表的情况下,将记录最少的表放在最后。(只在采用RBO有效,下文述)
  • Order By句中的非索引列会降低性能,可以通添加索引的方式理。格控制在Order By句中使用表达式。
  • 不同区域出的相同的Sql句,要保证查询字符完全相同,以利用SGA共享池,防止相同的Sql句被多次分析。
  • 多利用内部函数提高Sql效率。
  • 当在Sql句中接多个表,使用表的名,并将之作为每列的前这样可以减少解析时间

需要注意的是,随着Oracle的升查询优化器会自动对Sql化,某些限制可能在新版本的Oracle下不再是问题尤其是采用CBOCost-Based Optimization,基于代价的化方式)

可以总结一下可能引起全表描的操作:

  • 在索引列上使用NOT或者“<>”;
  • 索引列使用函数或者算;
  • NOT IN操作;
  • 通配符位于查询字符串的第一个字符;
  • IS NULL或者IS NOT NULL
  • 多列索引,但它的第一个列并没有被Where子句引用;

Oracle化器

Oracle化器(Optimizer)是OracleSQL之前分析句的工具。
Oracle
化器有两种优化方式:基于规则的(RBO)和基于代价的(CBO)。

  • RBO化器遵循Oracle内部定的规则
  • CBO依据行的代价,主要指CPU和内存的占用。化器在判断是否使用CBO,要参照表和索引的统计信息。统计信息要在表做analyze后才会有。Oracle8及以后版本,推荐用CBO方式。

Oracle化器的化模式主要有四

  • Rule:基于规则
  • Choose:默模式。根据表或索引的统计信息,如果有统计信息,使用CBO方式;如果没有统计信息,相列有索引,使用RBO方式。
  • First rows:与Choose似。不同的是如果表有统计信息,它将以最快的方式返回查询的前几行,以得最佳响应时间
  • All rows:即完全基于Cost的模式。当一个表有统计信息,以最快方式返回表所有行,以得最大吐量。没有统计信息使用RBO方式。

化模式的方式

  • Instance级别:在init<SID>.ora文件中OPTIMIZER_MODE
  • Session级别:通SQL> ALTER SESSION SET OPTIMIZER_MODE=;定。
  • 级别:通SQL> SELECT /*+ALL+_ROWS*/ ……;定。可用的HINT包括/*+ALL_ROWS*//*+FIRST_ROWS*//*+CHOOSE*//*+RULE*/ 等。

要注意的是,如果表有统计信息,可能造成句不走索引的果。可以用SQL>ANALYZE TABLE table_name DELETE STATISTICS; 除索引。
列和索引更新统计信息的SQL
SQL> ANALYZE TABLE table_name COMPUTE STATISTICS;
SQL> ANALYZE INDEX index_name ESTIMATE STATISTICS;

原创粉丝点击