2

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

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

哪个查询将在此处提供最佳性能

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

或者

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

2 回答 2

1

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

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

如果 null 和 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;
于 2013-07-25T11:28:21.353 回答
0

对您的问题的回答取决于许多因素,例如 RDBMS 供应商、homedl列上存在什么类型的索引(如果有)。我认为item_id并且item_type已经被适当地索引了。

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

选择 homedl from delivery where item_id='1343275' AND coalesce(homedl, 2)<>1and item_type=0;

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

于 2013-07-25T09:40:40.560 回答