row_number()性能优化

我有一张表,亿级,字段有20个左右。数据里面一个ID会有多种类型,每个类型都有对应多个的时间。使用过程中除了全表数据都在使用外,还有一些特殊情况需要取每个ID中每个类型的第一次出现情况。我是用的row_number()over(partition by id,类型 order by create_time) As rn生成一个序号,再根据序号去实现功能。
加上row_number后性能就很差,请问有什么好的解决办法?

谢谢!

对于你这个取每个ID中每个类型的第一次出现情况需求,基本都是需要有一次排序的,
你看能不能在取特殊ID的时候你看能不能过滤一些数据,
比如你的特殊ID都在某个时间之后那就可以过滤时间,或者在都在某些特定的分区里面那就过滤出需要的分区

如果你的数据量很大,使用 row_number() 可能会影响性能。一种可能的优化方法是,为每个 id 和类型找到第一个出现的时间,并将其保存在一个临时表中。你可以使用以下 SQL 查询来实现:


SELECT id, 类型, MIN(create_time) AS first_time
FROM 表名
GROUP BY id, 类型

这将返回一个包含每个 ID 和类型的第一个出现时间的临时表。然后,你可以将此临时表与原始表连接以获取所需的数据。


SELECT t1.*
FROM 表名 t1
INNER JOIN (
  SELECT id, 类型, MIN(create_time) AS first_time
  FROM 表名
  GROUP BY id, 类型
) t2 ON t1.id = t2.id AND t1.类型 = t2.类型 AND t1.create_time = t2.first_time

这个查询将只返回每个 ID 和类型的第一个出现的行,而不使用 row_number(),可能会提高查询性能。

https://smartsi.blog.csdn.net/article/details/129094825?spm=1001.2014.3001.5502