我有两张包含大量数据的表。
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
有一个索引。但是,由于数据库中有超过2M万用户,并且每个摘要平均有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
由于
答案 0 :(得分:0)
exists
不应低于join
。但是,如果你真的想知道,那么试试同时运行。
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)
);
此查询的最佳索引是:action_summary(date, as_id, user_id)
和action_detail(as_id, actyp_id)
。请注意,这些是具有多列的复合索引。