DB2 查询问题——我应该使用 Exists 吗?

DB2 Query issue - should I use Exists?

我有两个数据量很大的表。

ACTION_SUMMARYACTION_DETAIL

每个用户每天在我的数据库中有一个 ACTION_SUMMARY 行,每个 ACTION_SUMMARY.

零个,一个或多个 ACTION_DETAIL

我想要一个查询 returns 用户,这些用户至少有一个详细记录,其操作类型 (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.DATEAS.AS_IDAD.AS_IDAD.ACTYP_ID

上有索引

谢谢

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