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子句是最佳做法吗?
Jim*_*ans 17
正如其他海报所提到的那样,如果你没有指定排序顺序,那么SQL标准会说结果可以是查询处理器最方便和最有效的顺序.
假设您为CUSTOMER表的所有行执行简单的无序SELECT,该表没有索引且没有主键.很可能,甚至可能,查询处理器将执行直接表扫描并按照它们最初插入的顺序生成行(为您提供所见的FIFO行为).
如果然后在STATE和CITY字段上添加索引(按此顺序),然后查询WHERE STATE = 'NY'查询处理器可能会决定扫描STATE ='NY'的索引条目而不是进行全表扫描更有效.在这种情况下,它可能会实现STATE,CITY顺序中的行.
即便如此也不确定.例如,如果查询处理器收集的统计信息显示表中几乎所有STATE值都是"NY"(可能是因为数据库是基于Albany的设备租赁业务),它可能会认为表扫描实际上更便宜而不是索引扫描,你会再次看到FIFO.
了解有关数据库如何规划查询的基础知识是个好主意.您可以使用该EXPLAIN语句查看DBMS如何执行任何给定查询,然后使用它来优化查询,在某些情况下可以使用数量级.这是一个令人着迷且有用的学习领域.
是.没有ORDER BY的"默认订单",并且无法保证您将数据以FIFO/LIFO或任何其他顺序返回.
对于使用"SELECT id,name FROM table"的开发人员来说,他们要么不合适,要么他们不关心任何出现的顺序.
| 归档时间: |
|
| 查看次数: |
33819 次 |
| 最近记录: |