oracle查询性能优化

xiaoxiao2026-08-24  14

[color=red]1、[/color]实用不等于操作符(<>, !=) 下面这种情况,即使在列dept_id有一个索引,查询语句仍然执行一次全表扫描   select * from dept where staff_num <> 1000;   但是开发中的确需要这样的查询,难道没有解决问题的办法了吗?   有!   通过把用 or 语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。   select * from dept shere staff_num < 1000 or dept_id > 1000; [color=red]2、[/color]使用 is null 或 is not null 使用   is null 或is nuo null也会限制索引的使用,因为数据库并没有定义null值。如果被索引的列中有很多null,就不会使用这个索引(除非索引是一个位图索引,关于位图索引,会在以后的blog文章里做详细解释)。在sql语句中使用null会造成很多麻烦。   解决这个问题的办法就是:建表时把需要索引的列定义为非空(not null) [color=red]3、[/color]使用函数   如果没有使用基于函数的索引,那么where子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。下面的查询就不会使用索引:   select * from staff where trunc(birthdate) = '01-MAY-82';   但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。   select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999); [color=red]4、[/color]比较不匹配的数据类型 比较不匹配的数据类型也是难于发现的性能问题之一。下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。   select * from dept where dept_id = 900198;   这是因为oracle会自动把where子句转换成to_number(dept_id)=900198,就是3所说的情况,这样就限制了索引的使用。把SQL语句改为如下形式就可以使用索引   select * from dept where dept_id = '900198'; [color=red]5. [/color]用EXISTS替代IN 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 12. 用NOT EXISTS替代NOT IN 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. [color=red]6. [/color]删除重复记录 最高效的删除重复记录方法 ( 因为使用了ROWID) DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
转载请注明原文地址: https://www.6miu.com/read-5051758.html

最新回复(0)