SELECT DISTINCT ... WHERE ... "random" 结果的顺序是?
Is the order of the result of SELECT DISTINCT ... WHERE ... "random"?
我有一个 SQL 查询
SELECT DISTINCT [NR] AS K_ID
FROM [DB].[staging].[TABLE]
WHERE [N]=1 and [O]='XXX' and [TYPE] in ('1_P', '2_I')
由于我将结果保存在受版本控制的 CSV 文件中(通过 Python Pandas),我注意到每次我 运行 查询。为了消除此处的 Python 部分,我 运行 在 MS SQL Server Management Studio 中进行查询,每次尝试时我也在其中观察到不同的顺序。
这对我来说无关紧要,但是:每次执行都可以对查询结果进行不同排序是否正确?如果是这样,有没有办法使订单“确定性”?
SQL 将 return 结果查询为无序集,除非最外层的查询具有 order by
.
在较小的数据量上,结果看起来是可重复的。然而,在较大的系统上——尤其是在并行系统上——排序可能基于散列算法、节点何时完成以及网络拥塞(以及其他因素)。因此,实际上每次 运行.
时您都可以看到不同的顺序
SQL 数据库基于关系代数集合论概念,其中您认为的表更正式地称为 无序关系 。除非您指定 ORDER BY
,否则数据库可以自由 return 数据是任何方便的顺序。
此顺序可能匹配索引,而不是磁盘上的顺序。它也可能在数据的中间 开始 ,如果数据库可以利用另一个查询正在进行的工作来减少两者之间的总读取(企业版会这样做)。
更糟糕的是,甚至磁盘上的顺序也可能改变。如果没有主键,数据库甚至可以四处移动页面以更有效地帮助 运行。
换句话说,如果顺序很重要(通常很重要),请指定一个 ORDER BY
子句。
我有一个 SQL 查询
SELECT DISTINCT [NR] AS K_ID
FROM [DB].[staging].[TABLE]
WHERE [N]=1 and [O]='XXX' and [TYPE] in ('1_P', '2_I')
由于我将结果保存在受版本控制的 CSV 文件中(通过 Python Pandas),我注意到每次我 运行 查询。为了消除此处的 Python 部分,我 运行 在 MS SQL Server Management Studio 中进行查询,每次尝试时我也在其中观察到不同的顺序。
这对我来说无关紧要,但是:每次执行都可以对查询结果进行不同排序是否正确?如果是这样,有没有办法使订单“确定性”?
SQL 将 return 结果查询为无序集,除非最外层的查询具有 order by
.
在较小的数据量上,结果看起来是可重复的。然而,在较大的系统上——尤其是在并行系统上——排序可能基于散列算法、节点何时完成以及网络拥塞(以及其他因素)。因此,实际上每次 运行.
时您都可以看到不同的顺序SQL 数据库基于关系代数集合论概念,其中您认为的表更正式地称为 无序关系 。除非您指定 ORDER BY
,否则数据库可以自由 return 数据是任何方便的顺序。
此顺序可能匹配索引,而不是磁盘上的顺序。它也可能在数据的中间 开始 ,如果数据库可以利用另一个查询正在进行的工作来减少两者之间的总读取(企业版会这样做)。
更糟糕的是,甚至磁盘上的顺序也可能改变。如果没有主键,数据库甚至可以四处移动页面以更有效地帮助 运行。
换句话说,如果顺序很重要(通常很重要),请指定一个 ORDER BY
子句。