NVL()会降低性能

时间:2013-07-25 07:03:46

标签: sql oracle oracle10g

  

交付表格有1731791+行。   homedl列有0,1,NULL值。

我想在homedl列不等于1时获取记录。

哪个查询将在此处提供最佳效果

select homedl 
  from delivery 
 where item_id='1343275' 
   AND NVL(homedl,0) <> 1 
   and item_type=0;

OR

select homedl 
  from delivery 
 where item_id='1343275' 
   AND (homedl<>1 or homedl is null)  
   and item_type=0;

2 个答案:

答案 0 :(得分:1)

首先,让我们看看数据,有多少交付记录有homedl = 1或homedl = 0或homedl为null:

select homedl , count(*)
  from delivery 
group by homedl

如果空值和ZERO的计数明显小于ONE的计数,那么您应该创建一个基于函数的索引,该索引将用于此查询:

create index user2582602_idx on delivery (NVL(homedl,0));

然后选择如下:

select homedl 
  from delivery 
 where item_id='1343275' 
   AND NVL(homedl,0) = 0 
   and item_type=0;

答案 1 :(得分:0)

您的问题的答案取决于许多因素,例如: RDBMS供应商,homedl列上存在哪种类型的索引(如果有)。我认为item_iditem_type已经被正确编入索引。

您最好使用以下查询:

从交货中选择homedl,其中item_id ='1343275'AND coalesce(homedl, 2)<>1和item_type = 0;

如果item_id是主键,那么查询执行时间对于您提到的不同查询无关紧要,因为explain [sql query]会向您显示所使用的密钥为PRIMARY