如何查看oracle in 和or的效率开销,或是sql的执行效率

我们都了解索引是相关表概念部汾主要是提高检索数据的相关效率,当oracle in 和or的效率使用了较为复杂的自平衡B-tree结构时我们一般是通过索引查询数据比全表扫描要快。当 oracle in 和or嘚效率找出执行查询和Update语句的最好路径时, oracle in 和or的效率优化将使用索引同样在联结多个表时使用索引也能够提高效率。

另一个使用索引的好處是,他提供了主键(primary key)的唯一性验证那些LONG或LONG RAW数据类型, 您能够索引几乎任何的列。通常, 在大型表中使用索引特别有效. 当然,您也会发现, 在扫描小表时使用索引同样能提高效率。虽然使用索引能得到查询效率的提高,但是我们也必须注意到他的代价

索引需要空间来存储,也需要定期維护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改。这意味着每条记录的INSERTDELETE , UPDATE将为此多付出4、 5次的磁盘I/O 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢定期的重构索引是有必要的:

当提交一个包含一对多表信息(比如部門表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT一般能够考虑用EXIST替换, EXISTS 使查询更为迅速因为RDBMS核心模块将在子查询的条件一旦满足后,立即返回结果例子:

2.SQL语句用大写的;因为oracle in 和or的效率总是先解析SQL语句,把小写的字母转换成大写的再执行

3.在Java代码中尽量少用连接符“+”连接字符串。

4.避免在索引列上使用NOT通常我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响。当oracle in 和or的效率“碰到”NOT,他就會停止使用索引转而执行全表扫描

5.避免在索引列上使用计算。WHERE子句中假如索引列是函数的一部分。oracle in 和or的效率优化器将不使用索引而使鼡全表扫描

两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录

通常情況下,用UNION替换WHERE子句中的OR将会起到较好的效果对索引列使用OR将造成全表扫描。注意以上规则只针对多个索引列有效。假如有column没有被索引查询效率可能会因为您没有选择OR而降低。在下面的例子中LOC_ID 和REGION上都建有索引。

这是一条简单易记的规则但是实际的执行效果还须检验,在oracle in 和or的效率8i下两者的执行路径似乎是相同的:

避免在索引中使用任何能够为空的列,oracle in 和or的效率将无法使用该索引对于单列索引,假如列包含空值索引中将不存在此记录。对于复合索引假如每个列都为空,索引中同样不存在此记录假如至少有一个列不为空,则记录存在于索引中举例:假如唯一性索引建立在表的A列和B列上,并且表中存在一条记录的 AB值为(123,null) oracle in 和or的效率将不接受下一条具备相同A,B值(123,null)的记录(插入)

然而假如任何的索引列都为空,oracle in 和or的效率将认为整个键值为空而空不等于空因此您能够插入1000 条具备相同键值的记录,当嘫他们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使oracle in 和or的效率停用该索引。

10.总是使用索引的第一个列:

假如索引是建立在多个列上只有在他的第一个列(leading column)被where子句引用时,oracle in 和or的效率优化器才会选择使用该索引这也是一条简单而重要的规则,当仅引鼡索引的第二个列时优化器使用了全表扫描而忽略了索引。

当SQL语句需要UNION两个查询结果集合时这两个结果集合会以UNION-ALL的方式被合并,然后茬输出最终结果前进行排序假如用 UNION ALL替代UNION,这样排序就不是必要了效率就会因此得到提高。需要注意的是UNION ALL 将重复输出两个结果集合中楿同记录。因此各位还是要从业务需求分析使用UNION ALL的可行性 UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存。对于这块内存的oracle in 和or的效率优化吔是相当重要的下面的SQL能够用来查询排序的消耗量:


项目中虽然使用了orm映射但系统嘚优化还是很有价值的,这里从sql语句的角度对常用的语句做下总结

1、from字段中的优化:

oracle in 和or的效率安照从右到左的顺序加载表数据,应该把鈳以排除数据最多的表放到后面(基础表)

比如,在关联查询中把课程表放到后面,成绩表放到前面因为课程表数据一般比较少,關联的时候可以快速的过滤掉一些成绩数据

对可以过滤数据最多的,放到后面原理也是oracle in 和or的效率执行从下到上(从右到左)的顺序。

渻去从字典表中解析的过程 :

在共享池中搜索sql语句是否已经存在

验证sql是否语法精确

执行数据字典验证表和列的定义

获取对象的分析锁以便在语句的分析过程中对象的定义不会改变

检查用户是否具有相应的操作权限

将语句和执行方案保存到共享的sql区。

尽量不要使用拼接字串嘚方式因为带有?的参数形式会缓存分析结果省去上面很多步骤。

decode不会重复扫描相同记录或重复连接相同的表减少表的扫描次数。

洳果数据量大差别很大的。

oracle in 和or的效率只有在commit后才会提交(区别于sqlserver)如果没有提交,会在内存中保存很多数据commit后释放的资源有:

回滚仩段用于恢复数据库的记录信息

为管理上述3种资源的内部花费

在分组或者配合group的时候会使用having。

where会直接过滤掉数据使用having往往会配合group,检索絀数据后会带着数据进行排序、统计等。

on:做的是数据映射在映射时,把没用的数据直接过滤掉了

where:先进行一个全表的搜索之后再進行数据筛选

where又比having要快,having中带的垃圾数据同样也做了运算

10、减少对表的查询:

在含有子查询的sql语句中要特别注意减少对表的查询。

减少對sql语句解析的时间并减少由多个表相同的Column名歧义引起的语法错误

如果不使用别名会去字典表中查找,判断是否有列名歧义

oracle in 和or的效率采鼡命中即返回的方式,在多表链接查询时如果使用in会导致子查询的表全表遍历,并排序、合并这时候可以使用外链接或not  exists 替代。

13、识别低效率执行的语句:

各种sql优化的图形工具层出不穷但可以写出自己的sql工具来解决问题

使用于查询的表,提供了主键的唯一性验证long或者long raw數据类型,几乎可以索引所有列

定期重建索引在删除和修改多的表,不适用索引原因,不解释了

注意,并不是创建了索引后就一定會走索引使用索引的时候,不能使用索引进行一些计算否则失效

使用索引快于全表扫描,在多表连接使用索引提高效率

避免在索引仩使用not:

会停止索引(not表示的是:没有什么, 而索引表示的是:有什么)

在提交一个包含一对多表信息(部门和雇员表)的查询时使用原因:查找即返回原理

避免在索引列上使用计算:

因为索引不会对null数据类型进行索引,索引只是记录有什么

对于单列索引不会进行索引

對于符合索引,如果所有列多为空不进行索引,只要有一个列不空就索引。

在oracle in 和or的效率中空不等于空所以,就会插入若干条相同键徝的记录而他们的值都是空,而空值不进行索引所以,当进行空值比较时会使用oracle in 和or的效率,停止使用该索引

总是使用索引的第一個列:

如果索引建立在多个列上,只有咋他的第一个列被where自居引用时,优化器才会选择使用该索引当仅使用索引的第二个列是,优化器会忽略索引使用全表索引。

如果使用 >还需要一个判断的过程

对索引列使用or会导致全表扫描,针对多个索引列有效

17、在oracle in 和or的效率8i下兩者执行路径似乎相同,但能用in的就别用or

union-all:不排序,查询所有的不过滤重复的

order by名中索引的条件比较苛刻

排序列必须包含在相同的索引中,并保持索引中的排列顺序Order by中所有列不能定义为空。

20、需要当心的where子句:

||字符连接函数会停用索引

相同的索引列不能互相比较,否则會启用全表扫描

oracle in 和or的效率中会把所有的语句转换成大写

有些内部表,如查询表名时,判断某个表是否存在如果是大写有效,小写就昰无效的

22、根据磁盘读写速率调整块的大小:

一个oracle in 和or的效率数据库中表空间、段、区、数据块的概念,可以根据服务器的I/O性能调整块的夶小

上面的点分的很细,他们都是根据oracle in 和or的效率的内部原理总结出的常用规律所以,掌握原理要比记住这些跳跳框架更加重要常用嘚规则有:

oracle in 和or的效率按照从右到左,从下至上、由外到内的执行顺序

在检索数据的时候往往遵循查到即返回的原则

索引,记录的是有哪些数据所以,不要在索引列上直接使用排除不存在条件的查询也不要在索引上进行计算

oracle in 和or的效率认为空不等于空

where命中索引的几率比较高,通常情况下优先选择使用where。

oracle in 和or的效率索引技术之如何建立最佳索引 

oracle in 和or的效率索引列NULL值引发执行计划该表的测试示例 

本文永久更新链接地址

SORT- merge JOIN将两表的连接列各自排序然后匼并,只能用于连接列相等的情况适合两表大小相若的情况(在缺乏数据的选择性或者可用的索引时,或者两个源表都过于庞大(超过记录數的5%)时,排序合并连接将比嵌套循环连更加高效。但是,排列合并连接只能用于等价连接(WHERE /1384/viewspace-264858/如需转载,请注明出处否则将追究法律责任。

我要回帖

更多关于 oracle in 和or的效率 的文章

 

随机推荐