我有一个配置单元表,有50列和300多万条记录。要求根据日期列获取最新的200条记录,因此应用了行数函数。最初,当记录数低于10万条时,它运行得非常好,不幸的是,它现在永远运行。有什么特别的优化技术我可以试试吗?它是一个分区表,下面是详细信息的实现:row\u number()over(partition by date,rule\u id,run\u id order by load\u date desc)as rule\u row\u num from table
我有一个配置单元表,有50列和300多万条记录。要求根据日期列获取最新的200条记录,因此应用了行数函数。最初,当记录数低于10万条时,它运行得非常好,不幸的是,它现在永远运行。有什么特别的优化技术我可以试试吗?它是一个分区表,下面是详细信息的实现:row\u number()over(partition by date,rule\u id,run\u id order by load\u date desc)as rule\u row\u num from table
1条答案
按热度按时间3yhwsihp1#
我猜你划分的列是倾斜的。你应该
group by
并计算要确认的行数。如果确实发生了偏差,一般的优化方法是提前一个阶段,并尝试部分地聚合和减少数据。
根据您的情况,您可以尝试以下方法:
假设您的原始sql如下所示:
优化版本如下:
当柱发生倾斜时
ca
,第二个sql预期比第一个sql快。在第一阶段,通过cast(rand()*20 as int)
. 在那之后, predicatewhere rk1 <= 200
执行,大大减少了以后要处理的数据。