我的查询返回一个看似排序的查询结果,尽管没有可用的语句。这可能是聚集索引的原因。
依赖索引进行排序是明智的吗?
依靠索引进行排序是最佳做法吗?
由于
答案 0 :(得分:3)
是的,由于聚集索引,数据显示为预先排序。聚簇索引意味着行按索引的顺序进行物理排列,在大多数(并非所有)情况下都是如何检索它们。
如果没有聚集的索引,则将按照插入的顺序检索行。
不,依赖于此是不明智的。如果您决定执行JOIN
,DISTINCT
或对查询进行任何其他更改,则可以轻松地中断排序顺序。另一方面,如果您使用ORDER BY
并且SQL Server知道数据已经按此顺序排列,它将优化冗余排序,因此无需任何费用。
因此,请始终ORDER BY
,即使看起来您不需要它。
答案 1 :(得分:1)
如果您需要特定的排序顺序,最佳做法是使用ORDER BY
子句指定它。
尽管没有ORDER BY
子句,但我所使用的几乎每个数据库实现都会展示一些合理可重复的排序顺序,但这种行为是数据库工作方式的副作用。事实上,数据库(再次,我使用的数据库)不保证排序顺序,除非你指定它,所以没有指定它你是由数据库实现和它可能导致的任何副作用的摆布。基本上,如果您需要以完全可预测的方式返回记录,则应指定它。
答案 2 :(得分:1)
我的查询返回一个看似排序的查询结果,尽管没有可用的语句。
这是因为数据是根据插入数据的顺序返回的。为了保证订单始终保持一致,您需要定义ORDER BY
子句。
索引可以加快查询的排序速度,但如果没有使用带有索引的列的ORDER BY子句,它就没有影响。
答案 3 :(得分:1)
除非您使用ORDER BY,否则您不能依赖重新获得结果的顺序。我想这取决于您的数据库,但是在您需要时指定订单始终是最佳做法。
答案 4 :(得分:1)
无论其他细节如何,只要您关心SQL查询的结果顺序,唯一可靠的事情就是包含一个ORDER BY子句,以确保您获得所需的顺序。作为替代方案,您可以(当然)以随机顺序检索并在以后对其进行排序 - 但让SQL完成工作通常是一个更好的主意。主要的例外是,如果您需要执行填充列表并希望用户能够根据不同的列重新排序等操作。在这种情况下,无论如何,您将在客户端进行排序(可能在JS中),因此您也可以使用它。
答案 5 :(得分:0)
数据似乎可以排序,但您不能依赖它。假设您在RAM中需要一些数据,而其余数据仍在磁盘上。系统可以并行并开始返回内存中的数据,而其余数据则从磁盘中获取并返回。您根本无法依赖它,如果您需要订购数据,请务必订购数据。