我有两个包含大量数据的表。
ACTION_SUMMARY
和ACTION_DETAIL
每个用户ACTION_SUMMARY
在我的数据库中每天有一行,每个用户有零、一行或多ACTION_DETAIL
行ACTION_SUMMARY
。
我想要一个查询,它返回的用户至少有一个ACTYP_ID
在某些值集中具有操作类型 () 的详细记录。
这是一个例子:
select
AS.USER_ID
from
ACTION_SUMMARY AS
JOIN ACTION_DETAIL AD on AS.AS_ID = AD.AS_ID
where
AS.DATE between '2015-01-01' and '2015-07-07'
and AD.ACTYP_ID in (45, 25, 11)
AS.DATE
上面有索引。但是,由于数据库中有超过 200 万用户,并且每个摘要平均有 5-10 条详细记录,因此我遇到了性能问题。
我正在考虑EXISTS
以这种方式使用:
select
AS.USER_ID
from
ACTION_SUMMARY AS
where
AS.DATE between '2015-01-01' and '2015-07-07'
and EXISTS (select 1 from ACTION_DETAIL AD where AD.AS_id = AS.AS_ID and AD.ACTYP_ID in (45, 25, 11))
现在,我有两个问题:
1)我的查询EXISTS
速度更快吗 - 就像子查询一旦找到东西就会停止并继续前进?
2) 如何改进我的查询?
我在AS.DATE
,AS.AS_ID
和AD.AS_ID
上有索引AD.ACTYP_ID
谢谢