我在表上有自己的连接查询,有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
答案 0 :(得分: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
);
这个版本肯定应该使用索引。第一个版本应该,但可能不是在所有情况下。
答案 1 :(得分: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,其中不存在另一行,其中datem更年轻)。
通过这种方式,您可以删除DISTINCT函数。
要完成任务,您可以添加一些有关比较字段的索引