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

Posted

技术标签:

【中文标题】DB2 查询问题 - 我应该使用 Exists 吗?【英文标题】:DB2 Query issue - should I use Exists? 【发布时间】:2015-04-02 20:51:21 【问题描述】:

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

ACTION_SUMMARYACTION_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.DATEAS.AS_IDAD.AS_IDAD.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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

DB2 替代 EXISTS 函数

确定应该在 DB2 中创建哪些索引以优化特定查询的性能

在 EXISTS 查询中使用 LIMIT 有啥意义吗?

这个 DB2 SQL 查询有啥问题?

我应该在调用 File.Delete 之前调用 File.Exists 吗?

我们应该在检索数据时避免 DB2 SQL 中的 IN 子句吗?