针对百万条记录的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:=不存在(在表集合中)