ROW_NUMBER 无 ORDER BY

新手上路,请多包涵

我必须在现有查询中添加行号,以便跟踪已将多少数据添加到 Redis 中。如果我的查询失败,那么我可以从其他表中更新的那一行开始。

查询以从表中获取 1000 行后开始的数据

SELECT * FROM (SELECT *, ROW_NUMBER() OVER (Order by (select 1)) as rn ) as X where rn > 1000

查询工作正常。如果有任何方法我可以在不使用 order by 的情况下获得行号。

select 1 这里是什么?

查询是否已优化,或者我可以通过其他方式进行。请提供更好的解决方案。

原文由 lucy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 867
2 个回答

无需担心在 ORDER BY 表达式中指定常量。以下引用自 Itzik Ben-Gan 编写的 Microsoft SQL Server 2012 High-Performance T-SQL Using Window Functions (可从微软免费电子书网站免费下载):

如前所述,窗口顺序子句是强制性的,SQL Server 不允许基于常量进行排序,例如 ORDER BY NULL。但令人惊讶的是,当传递基于返回常量的子查询的表达式时——例如,ORDER BY (SELECT NULL)——SQL Server 将接受它。同时,优化器取消嵌套或扩展表达式,并意识到所有行的排序都是相同的。因此,它从输入数据中删除了排序要求。这是演示此技术的完整查询:

 SELECT actid, tranid, val,
 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
FROM dbo.Transactions;

在此处输入图像描述

在 Index Scan 迭代器的属性中观察 Ordered 属性为 False,这意味着迭代器不需要按索引键顺序返回数据


上面的意思是当你使用常量时不会执行排序。我强烈建议您阅读本书,因为 Itzik Ben-Gan 深入描述了窗口函数的工作原理以及在使用它们时如何优化各种情况。

原文由 gotqn 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进