【问题标题】:optimize a 'having count (distinct ) ' query for big data优化大数据的“有计数(不同)”查询
【发布时间】:2019-09-04 01:15:54
【问题描述】:

我有以下查询,我需要在一个有 1 亿条记录的表上运行,但它非常慢(到目前为止已经运行了 5 个小时) 我不知道如何优化它,将不胜感激任何帮助 该表在 DID 和 week_no 上有一个索引,并包含其他几个未编入索引的列,以及一个已编入索引的主键 (id)

 DELETE FROM test WHERE "DID" IN (SELECT "DID" FROM test GROUP BY "DID" having count(distinct week_no) < 4 );

谢谢!

【问题讨论】:

  • 是 MySQL 还是 PostgreSQL?

标签: mysql database postgresql


【解决方案1】:

这将使用DELETEJOIN(或USING 用于PostgreSQL)来最有效地编写,以避免必须计算每一行的计数:

对于 PostgreSQL:

DELETE
FROM test t1
USING (SELECT did, COUNT(DISTINCT week_no) AS num_weeks
       FROM test
       GROUP BY did) t2
WHERE t2.did = t1.did AND num_weeks < 4

Demo on dbfiddle

在 MySQL 中:

DELETE t1
FROM test t1
JOIN (SELECT did, COUNT(DISTINCT week_no) AS num_weeks
      FROM test
      GROUP BY did) t2 ON t2.did = t1.did
WHERE num_weeks < 4

Demo on dbfiddle

【讨论】:

  • 这回答了您的问题吗?如果没有,您能否提供更多信息来帮助回答这个问题?否则,请考虑将答案标记为已接受。见stackoverflow.com/help/someone-answers
猜你喜欢
  • 2012-10-09
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多