我有两个包含大量数据的表。DB2查询问题 - 我应该使用Exists吗?
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倍的第二个行。根据您的问题详细信息 – Javaluca 2015-04-02 21:06:59
为什么每天(每个用户)生成一个'Action_Summary'行?为什么不使用'Action_Detail'?噢,[请使用独家上限('<')with date/time/timestamps](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-和-the-devil-have-in-common.aspx)(该博客涵盖SQL Server,但您也可以在DB2中指定小数秒)。 – 2015-04-04 23:50:28