2013-07-25 181 views
2

交货表有1731791+行。 具有0,1,NULL值的homedl列。NVL()降低性能

我要取的记录,每当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; 
+1

只需检查执行计划,也许? –

+3

您是否尝试过运行并查看性能并解释计划?如果你在item_id上有一个索引,那么它应该是无关紧要的。 –

+1

查询计划是否有所不同?我期望这两个查询产生相同的计划,并因此执行相同的操作。如果'homedl'上有索引,则使用函数或查找NULL值可能会阻止索引被使用。如果您声明自己的性能不佳,那么我会怀疑添加'NVL'会阻止使用索引,通过创建基于函数的索引可以弥补索引的不足。 –

回答

1

首先,让我们看看数据,许多交货记录怎么有homedl = 1或homedl = 0或homedl为null:

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

如果零点和零点的计数大于计数显著小ONES,那么你应该创建一个将用于该查询功能基于指数:

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; 
+0

谢谢。上面的逻辑是现在生活中...我没有看到任何重大的时间差异后添加此条件.. – spyga

0

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

您可以更好地使用以下查询:从交货

选择homedl其中ITEM_ID = '1343275' AND coalesce(homedl, 2)<>1和ITEM_TYPE = 0;

如果item_id是主键,然后查询执行时间不会有问题你提到不同的查询,因为explain [sql query]会告诉你,使用的密钥是PRIMARY

+0

它也依赖于RDBMS供应商,因为按位索引实现可能会因不同供应商而有所不同,或者可能根本不可用。 – RRM