0

我对具有 400 万条记录的表进行了自联接查询....我们如何优化查询...查询必须获取具有最大日期的行

  SELECT DISTINCT d1.C1 AS c1, d1.C2 AS c2, d1.C3 AS c3,
         d1.datedm_id AS c4 FROM TABLEA d1 LEFT OUTER JOIN TABLEA d2 
         ON (d1.C1 = d2.C1 AND d1.C2 = d2.C2 AND d1.datedm_id < d2.datedm_id ) 
         WHERE d2.C1 IS NULL AND d2.C2 IS NULL

目前,此查询需要很长时间才能执行

EXPLAIN 显示如下

d1 4051368  Using index; Using temporary
d2 1    Using where; Using index; Not exists; Distinct
4

2 回答 2

0

要优化此查询,请在tableA(C1, C2, datedm_id).

您可以将其重写为:

SELECT d1.C1 AS c1, d1.C2 AS c2, d1.C3 AS c3, d1.datedm_id AS c4
FROM TABLEA d1
WHERE not exists (select 1
                  from TABLEA d2 
                  where d1.C1 = d2.C1 AND d1.C2 = d2.C2 AND d1.datedm_id < d2.datedm_id
                 );

这个版本绝对应该使用索引。第一个版本应该,但可能不是在所有情况下。

于 2013-08-20T15:17:05.853 回答
0

尝试这个:

select d1.C1 AS c1, d1.C2 AS c2, d1.C3 AS c3,
     d1.datedm_id AS c4 FROM TABLEA d1
where not exists(
  select 'nextdatedm'
  from TABLEA d2
  where d1.C1 = d2.C1 AND d1.C2 = d2.C2 AND d1.datedm_id < d2.datedm_id
)

我已经用 EXISTS 函数替换了你的 LEFT OUTER JOIN (在这个解决方案中,我将只得到 TABLEA ,其中不存在另一行的日期更年轻)。

通过这种方式,您可以删除 DISTINCT 函数。

要完成您的任务,您可以添加一些关于比较字段的索引

于 2013-08-20T15:18:10.637 回答