DB2 查询问题——我应该使用 Exists 吗?
DB2 Query issue - should I use Exists?
我有两个数据量很大的表。
ACTION_SUMMARY
和 ACTION_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.DATE
、AS.AS_ID
、AD.AS_ID
和 AD.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)
。请注意,这些是具有多列的复合索引。
我有两个数据量很大的表。
ACTION_SUMMARY
和 ACTION_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.DATE
、AS.AS_ID
、AD.AS_ID
和 AD.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)
。请注意,这些是具有多列的复合索引。