针对百万条记录的Sql查询优化
我有两个实体针对百万条记录的Sql查询优化,sql,oracle,Sql,Oracle,我有两个实体客户和协议 每个客户可以有0个..*协议,这些协议可以是活动的=1或关闭的=0 我正在尝试在一次查询中选择没有任何协议(表协议中没有记录)的客户机,或者选择有标记为“closed”=0的协议的客户机 协议表有几百万条记录 有什么建议可以用最好的方式来做吗?使用相关子查询,我向您提供了一个关系列customerid select c* from customer c where exists( select 1 from Aggrements a where c.customerid
客户
和协议
每个客户可以有0个..*协议,这些协议可以是活动的=1
或关闭的=0
我正在尝试在一次查询中选择没有任何协议(表协议中没有记录)的客户机,或者选择有标记为“closed”=0的协议的客户机
协议表有几百万条记录
有什么建议可以用最好的方式来做吗?使用相关子查询,我向您提供了一个关系列customerid
select c* from customer c
where exists( select 1 from Aggrements a where c.customerid=a.customerid
and a.closed=0)
or (not exists ( select 1 from Aggrements a where c.customerid=a.customerid
and a.active=1)
)
如果customerid列上没有索引,请先执行,否则查询将需要时间,我想您需要存在和不存在,使用以下逻辑:
select c.*
from customers c
where not exists (select 1
from Agreements a
where a.customerid = c.customerid
) or
exists (select 1
from Agreements a
where a.customerid = c.customerid and
a.closed = 0
);
为了提高性能,您需要对协议(customerid,closed)
进行索引您希望客户端有任何已关闭的协议,还是希望客户端只有已关闭的协议?如果一个客户端有3个已关闭的协议和1个活动的协议,您是否希望该客户端包含在查询结果中?完全正确。我需要没有aggrements(表aggrements中没有记录)的客户机和具有非活动aggrements(在tabele aggrements中有一些记录,但至少有一条处于status='closed')Thx的客户机,但我需要再想一想。返回列中查询值存在:1:=存在;0:=不存在(在表集合中)