【发布时间】:2019-12-15 11:51:40
【问题描述】:
知道如何改进这个查询执行吗? (也许有一些预聚合)?
SELECT p.segment, country, count(distinct userid)
from pixel_data_opt p
WHERE country in ('US')
and segment is not null
GROUP BY p.segment, country;
我尝试了以下方法,但没有帮助 -
select segment, country,sum(cnt)
from
(SELECT p.segment, country, userid,count(*) as cnt
from pixel_data_opt p
WHERE country in ('US')
and segment is not null
GROUP BY p.segment, country,userid
)
group by 1,2;
【问题讨论】:
-
不要在所有数据库系统的标签上发送垃圾邮件,选择您正在使用的一个并告诉我们它是哪个。这是针对 MySQL、Oracle 还是 SQL Server 的?
-
请标记适当的 RDBMS MySQL SQL Server Oracle。
-
关于分段、国家和用户 ID 的索引可能会有所帮助,但如果不知道您正在使用的特定 DBMS,我们将无能为力。
-
Oracle 查询优化是关于平衡许多不同的因素,例如数据量。例如,您在评论中说“行数是千亿”。这是您需要在问题中提供的信息。请阅读this answer on asking Oracle tuning questions 并编辑您的问题以包含所需信息。
-
一个未提及的选项是使用 approx_count_distinct 而不是 count(distinct ...)。如果您真的不需要 100% 正确的答案,这是可能的,但足够接近的答案就可以了。此功能在 12.1 及更高版本中可用。近似版本不做排序,不使用临时空间和更少的内存。
标签: sql oracle performance query-optimization