假设我有一个主键有三列的表。如果我从那个表中选择所有,而没有任何order by子句,据我所知,它们是按这些列排序的。第一列,第二列和第三列。如果显式地添加一个orderby子句,其中三个列按照它们作为主键的一部分的顺序排列,是否会有任何额外的成本,或者性能上的提高?
ulydmbyx1#
如果我从该表中选择all而不使用任何orderby子句,据我所知,它们是按这些列排序的您的理解是不正确的。如果没有order by,数据库引擎可能会以它选择的任何顺序输出结果。事实上,如果您要在另一个字段上添加聚集索引,则可能会更改结果的顺序。是否有任何额外的成本,或者性能增益排序永远不会提高性能(除非你做了一些影响分支预测的事情)。如果数据库以这种方式排序,就不会有任何成本。但是,如果你没有指定顺序,可能会出现正确性问题。
order by
q3aa05252#
在大多数情况下,如果表的主键包含三列,并且您选择的所有行都没有ORDER BY子句,则数据库系统将按主键列指定的顺序检索行。这是因为主键通常使用聚集索引实现,该索引基于键列对磁盘上的行进行物理排序。但是,依赖主键指定的隐式顺序可能会有风险,因为SQL标准不保证这一点,并且不同的数据库系统可能会以不同的方式实现主键。因此,如果需要以特定顺序显示结果,通常建议显式指定ORDER BY子句。在性能方面,添加与主键具有相同列的ORDER BY子句不会对查询性能产生显著影响,因为数据库系统已使用主键索引检索行。但是,如果在ORDER BY子句中指定不同的顺序,则数据库系统可能需要执行其他排序操作,这可能会影响查询性能。特别是如果table非常大。
2条答案
按热度按时间ulydmbyx1#
如果我从该表中选择all而不使用任何orderby子句,据我所知,它们是按这些列排序的
您的理解是不正确的。如果没有
order by
,数据库引擎可能会以它选择的任何顺序输出结果。事实上,如果您要在另一个字段上添加聚集索引,则可能会更改结果的顺序。是否有任何额外的成本,或者性能增益
排序永远不会提高性能(除非你做了一些影响分支预测的事情)。如果数据库以这种方式排序,就不会有任何成本。但是,如果你没有指定顺序,可能会出现正确性问题。
q3aa05252#
在大多数情况下,如果表的主键包含三列,并且您选择的所有行都没有ORDER BY子句,则数据库系统将按主键列指定的顺序检索行。这是因为主键通常使用聚集索引实现,该索引基于键列对磁盘上的行进行物理排序。
但是,依赖主键指定的隐式顺序可能会有风险,因为SQL标准不保证这一点,并且不同的数据库系统可能会以不同的方式实现主键。因此,如果需要以特定顺序显示结果,通常建议显式指定ORDER BY子句。
在性能方面,添加与主键具有相同列的ORDER BY子句不会对查询性能产生显著影响,因为数据库系统已使用主键索引检索行。但是,如果在ORDER BY子句中指定不同的顺序,则数据库系统可能需要执行其他排序操作,这可能会影响查询性能。特别是如果table非常大。