他的回复:
从执行计划上看,你要对15E数据聚合,然后对8E条数据做排序,编号。主要耗时是在cn排序上。1.排序是在cn上进行的,8E数据gather到cn上再排序,确实很慢,对cn压力很大。2.需要对表做一下analyse,从计划上看表的统计信息不准确。3.考虑看一下分布键是否可以优化,从计划上看,数据存在倾斜。4.考虑一下需求是否有优化空间,比如,rownumber取前100,前1000或者前10000排序。对8E数据排序没有实际意义,没有谁会关系8E数据全部的顺序,也看不完。5.如果表里除了2018~2020的数据还有其它年份数据,建议修改为分区表。并把SUBSTR(20180101, 1, 4)改为SUBSTR(20180101, 1, 4)::int,可以使用分区剪枝。analyse和修改分布键还有修改分区表,只是从计划中看到的问题,对这条sql优化可能实际意义不大。这个sql的核心优化是,减少排序分组的数据量(比如8E数据减少到10000)。