DB2 Query问题 - 我应该使用Exists吗?

时间:2015-04-02 20:51:21

标签: sql db2 query-performance sql-tuning

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

ACTION_SUMMARYACTION_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.DATEAS.AS_IDAD.AS_IDAD.ACTYP_ID

上有索引

由于

1 个答案:

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