0

我有两个包含大量数据的表。

ACTION_SUMMARYACTION_DETAIL

每个用户ACTION_SUMMARY在我的数据库中每天有一行,每个用户有零、一行或多ACTION_DETAILACTION_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_IDAD.AS_ID上有索引AD.ACTYP_ID

谢谢

4

1 回答 1

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). 请注意,这些是具有多列的复合索引。

于 2015-04-02T21:05:22.147 回答