最近在工作的时候,遇到比较大的数据查询。我自己的SQL在数据量小的时候还可以,但是数据量达到300W的时候就很慢了。只有我自己优化了sql。之前没有优化过,所以记录一下自己的优化过程。这次是关于isnull和isnotnull的优化。使用的环境是0racle11g。现有一张表a,表a中有字段b。我想找出表a中b字段为空的数据。select*fromawherebisnull我在b字段上创建了索引,但是当条件为null且不为null时,执行计划不使用索引而是全表扫描。此时表a中的数据有310w条记录,执行这条查询大约需要0.526秒。优化:通过函数index:通过nvl(b,c),将空字段转换为非空的c值,这里要保证c的值不会出现在数据中。然后在函数nvl(b,c)上建一个函数indexselect*fromawherenvl(b,c)=c,此时耗时0.01秒左右。当条件不为null时,也可以用nvl(b,c)<>c代替Oracle查询优化的子查询条件优化环境:oracle11g现有的a表和b表通过a01字段关联,并且你需要查询a表b表中的数据没有数据;SQL如下:selectcount(1)from(selecta.*,(selectcount(1)frombwhereb.a01=a.a01)asflagfroma)whereflag=0因为flag是虚字段,不能去索引这个SQL很慢执行,查看总共310W条数据,大概需要2秒。使用notexists优化SQL如下:selectcount(1)fromawherenotexists(select1frombwherea.a01=b.b01)使用notexists遍历索引,执行时间约为0.2秒
