2015-04-02 69 views
0

我有两个包含大量数据的表。DB2查询问题 - 我应该使用Exists吗?

ACTION_SUMMARYACTION_DETAIL

每个用户都有每天一个ACTION_SUMMARY排在我的分贝,和零,一个或多个每ACTION_SUMMARYACTION_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.DATEAS.AS_IDAD.AS_IDAD.ACTYP_ID

感谢

+0

第一个查询返回更多的行... 5-10倍的第二个行。根据您的问题详细信息 – Javaluca 2015-04-02 21:06:59

+0

为什么每天(每个用户)生成一个'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

回答

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

+0

因此EXIST是否像我认为的那样操作 - 意味着存在中的子查询不需要返回所有值 - 第一个它发现EXISTS将返回true?或者在评估EXISTS之前子查询是否完整执行并运行完成? - 对不起使用正确的术语 – NEW2WEB 2015-04-02 21:08:11

+0

@ NEW2WEB。 。 。 'exists'应该停在第一个匹配的行。 DB2是一个体面的数据库,所以我期望它在存在的时候很聪明。 – 2015-04-02 21:55:11