交付表格有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;
答案 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_id
和item_type
已经被正确编入索引。
您最好使用以下查询:
从交货中选择homedl,其中item_id ='1343275'AND coalesce(homedl, 2)<>1
和item_type = 0;
如果item_id
是主键,那么查询执行时间对于您提到的不同查询无关紧要,因为explain [sql query]
会向您显示所使用的密钥为PRIMARY
。