通过子句提高相同分区的性能

Posted

技术标签:

【中文标题】通过子句提高相同分区的性能【英文标题】:Improve performance of same partition by clause 【发布时间】:2018-07-06 12:48:46 【问题描述】:

我有一个包含 20 多列、4500 万行的表。我希望通过分区来汇总每个 Id 的信息,以便行数保持不变,并且每行都保留信息

select min(Distance) over(partition by Id) as min_distance
, max(Distance) over(partition by Id) as max_distance
, avg(Distance) over(partition by Id) as mean_distance
, stdev(Distance) over(partition by Id) as sd_distance
, sum(Distance) over(partition by Id) as sum_distance
, min(Speed) over(partition by Id) as min_speed
, max(Speed) over(partition by Id) as max_speed
, avg(Speed) over(partition by Id) as mean_speed
, stdev(Speed) over(partition by Id) as sd_speed

仅包含 10000 行的测试已运行 2 小时。我想知道我们是否可以做些什么来提高性能。

【问题讨论】:

获得更多硬件? 2 小时是惊人的长 - 我很想看看你使用什么作为 SQL Server 硬件并查看执行计划(你标记但没有给出 - 耻辱)。 无论如何,结束 - 这是一个非常具体的问题,属于数据库专家所在的 dba.stackexchange.com。 没有表定义(包括索引)这是不可能回答的。 【参考方案1】:

为什么不只是:

select Id, MIN(Distance)  as min_distance
, max(Distance)  as max_distance
, avg(Distance)  as mean_distance
, stdev(Distance)  as sd_distance
, sum(Distance)  as sum_distance
, min(Speed)  as min_speed
, max(Speed)  as max_speed
, avg(Speed)  as mean_speed
, stdev(Speed)  as sd_speed
FROM mytable
GROUP BY id

【讨论】:

以上是关于通过子句提高相同分区的性能的主要内容,如果未能解决你的问题,请参考以下文章

mysql表分区使用及详细介绍

Oracle 表分区(Partition)

带有 Node.JS 的 MongoDB:$where 子句性能

MySQL分区

如果我们在 BigQuery 中使用具有相同分区类型(天)的另一列进行过滤,where 子句中的分区列是不是不是必需的?

mysql之表分区