DB2 查询问题 - 我应该使用 Exists 吗?
Posted
技术标签:
【中文标题】DB2 查询问题 - 我应该使用 Exists 吗?【英文标题】:DB2 Query issue - should I use Exists? 【发布时间】:2015-04-02 20:51:21 【问题描述】:我有两个包含大量数据的表。
ACTION_SUMMARY
和 ACTION_DETAIL
每个用户每天在我的数据库中有一个ACTION_SUMMARY
行,每个ACTION_SUMMARY
有零个、一个或多个ACTION_DETAIL
行。
我希望有一个查询,它返回的用户至少有一个在某些值集中具有操作类型 (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
上有索引
谢谢
【问题讨论】:
第一个查询返回更多的行...是第二个查询的 5-10 倍。根据您的问题详情 您为什么每天(每个用户)生成Action_Summary
行?为什么不直接使用Action_Detail
?哦,还有please use an exclusive upper-bound(<
) with date/time/timestamps(该博客涵盖了 SQL Server,但您也可以在 DB2 中指定小数秒)。
【参考方案1】:
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)
。请注意,这些是具有多列的复合索引。
【讨论】:
那么 EXIST 是否像我认为的那样运行 - 这意味着存在中的子查询不需要返回所有值 - 它找到的第一个 EXISTS 将返回 true?或者在评估 EXISTS 之前子查询是否完全执行并运行完成? - 抱歉使用不当的术语 @NEW2WEB 。 . .exists
应该停在第一个匹配行。 DB2 是一个不错的数据库,所以我希望它对存在很聪明。以上是关于DB2 查询问题 - 我应该使用 Exists 吗?的主要内容,如果未能解决你的问题,请参考以下文章