【问题标题】:Optimize the Performance of ROW_NUMBER() OVER (PARTITION BY..)优化 ROW_NUMBER() OVER (PARTITION BY..) 的性能
【发布时间】:2020-01-14 15:39:33
【问题描述】:

我正在使用 (SELECT ROW_NUMBER() OVER (PARTITION BY ft.EmpID , dimdt.YEAR_NUMBER, dimdt.MONTH_OF_YEAR_NUMBER ORDER BY dimdt.Date DESC) row_number , 字段 1 .field2 .. ec 我的 ft 表有数百万行。我可以得到我想要的结果(每个员工的月末最近记录),但它非常慢,而不是非常慢。是否有任何替代方案或方法来优化性能?

谢谢

【问题讨论】:

  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品add a tag postgresql, oracle, sql-server, db2, ...
  • 您需要用您的数据库供应商(sql server、oracle 等)标记您的问题,添加整个查询,并添加一些示例数据以获得任何看似真实的答案。您可以简化问题的查询和欺骗数据,但请确保不要删除任何可能导致性能问题的重要内容(复杂的where 过滤器、排序等)。 ROW_NUMBER 本身速度很快,因此很难相信这是您的实际问题,也没有什么可以盲目建议代替它。

标签: sql


【解决方案1】:

对于这个表达式:

ROW_NUMBER() OVER (PARTITION BY ft.EmpID , dimdt.YEAR_NUMBER, dimdt.MONTH_OF_YEAR_NUMBER ORDER BY dimdt.Date DESC) 

你无能为力。这些列来自不同的表。

即使以不同的方式表述逻辑也会有相同的问题 - 但您可以考虑提出一个问题,其中包含示例数据、所需结果以及您要优化的完整查询。

【讨论】:

  • 我正在使用 Sql-Server 2016。我有一个非常大的查询。但我只是使用 2 个表事实加入 dimdate(只有一个加入)来获得几个字段来测试它的性能。
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多