处理默认排序顺序的SQL最佳实践

Yad*_*ada 33 sql database sql-order-by

我读过很多SQL代码,似乎开发人员假定默认排序顺序始终存在.例如,在构建HTML选择列表时,他们只会SELECT id, name FROM table发布一个ORDER BY子句.

根据我自己的经验,似乎dbms ORDER BY总是使用FIFO命令数据,如果没有给出子句而没有索引.但是,订单无法保证.但是,如果表没有变化,我从未见过dbms重新排序数据.

如果表没有变化,您是否曾经历过以非确定性顺序选择数据的dbms?

始终放置ORDER BY子句是最佳做法吗?

HLG*_*GEM 49

没有默认排序顺序.即使表具有聚簇索引,也不能保证按该顺序获得结果.如果您需要特定订单,则必须使用order by子句.


Jim*_*ans 17

正如其他海报所提到的那样,如果你没有指定排序顺序,那么SQL标准会说结果可以是查询处理器最方便和最有效的顺序.

假设您为CUSTOMER表的所有行执行简单的无序SELECT,该表没有索引且没有主键.很可能,甚至可能,查询处理器将执行直接表扫描并按照它们最初插入的顺序生成行(为您提供所见的FIFO行为).

如果然后在STATE和CITY字段上添加索引(按此顺序),然​​后查询WHERE STATE = 'NY'查询处理器可能会决定扫描STATE ='NY'的索引条目而不是进行全表扫描更有效.在这种情况下,它可能会实现STATE,CITY顺序中的行.

即便如此也不确定.例如,如果查询处理器收集的统计信息显示表中几乎所有STATE值都是"NY"(可能是因为数据库是基于Albany的设备租赁业务),它可能会认为表扫描实际上更便宜而不是索引扫描,你会再次看到FIFO.

了解有关数据库如何规划查询的基础知识是个好主意.您可以使用该EXPLAIN语句查看DBMS如何执行任何给定查询,然后使用它来优化查询,在某些情况下可以使用数量级.这是一个令人着迷且有用的学习领域.


OMG*_*ies 9

如果您希望数据一致排序,是的 - 您必须使用ORDER BY.


Ken*_*ite 6

是.没有ORDER BY的"默认订单",并且无法保证您将数据以FIFO/LIFO或任何其他顺序返回.

对于使用"SELECT id,name FROM table"的开发人员来说,他们要么不合适,要么他们不关心任何出现的顺序.