【发布时间】:2015-10-15 12:16:50
【问题描述】:
我有下表:
CREATE TABLE dbo.TestSort
(
Id int NOT NULL IDENTITY (1, 1),
Value int NOT NULL
)
Value 列可能(并且预计会)包含重复项。
我们还假设表中已经有 1000 行。
我试图证明关于不稳定排序的观点。
鉴于此查询从前 1000 个插入的结果中返回 10 个结果的“页面”:
SELECT TOP 10 * FROM TestSort WHERE Id <= 1000 ORDER BY Value
我的直觉告诉我,如果Value 列包含重复值,则此查询的两次运行可能会返回不同的行。
我基于以下事实:
- 排序不稳定
- 如果在两次查询运行之间在表中插入新行,则可能会创建 B 树的重新平衡(
Value列可能被索引或不被索引)
编辑:为了完整性:我假设行一旦插入就永远不会改变,也永远不会被删除。
相比之下,具有稳定排序(也按 Id 排序)的查询应该总是返回相同的结果,因为 IDs 是唯一的:
SELECT TOP 10 * FROM TestSort WHERE Id <= 1000 ORDER BY Value, Id
问题是:我的直觉正确吗?如果是,您能否提供一个会产生不同结果的实际操作示例(至少“在您的机器上”)?您可以修改查询,在 Values 列上添加索引等。
我不在乎确切的查询,而是在乎原理。
我正在使用 MS SQL Server (2014),但对任何 SQL 数据库的答案都同样满意。
如果不是,那为什么?
【问题讨论】:
-
Demo data.stackexchange.com/stackoverflow/query/375976 ,检查结果 1 和 2。要在相同的 TOP (n) 中查看结果,您应该在运行前清除缓存。无法在提供的环境中执行此操作,因此我使用了两个查询。
-
@lad2025 非常有趣。但为什么? :)
-
@lad2025 在本地尝试过,清除缓存。感人的!如果您考虑将此扩展到答案,我会考虑授予接受的答案。
标签: sql sql-server sql-order-by