以下两个SQL语句是否始终生成相同的结果集?
1. SELECT * FROM MyTable where Status='0' order by StartTime asc limit 10
2. SELECT * FROM (SELECT * FROM MyTable where Status='0' order by StartTime asc) limit 10
Run Code Online (Sandbox Code Playgroud)
是的,但订购子查询可能是一个坏习惯.您可以ORDER BY在第二个示例中在子查询外部进一步添加,例如
SELECT *
FROM (SELECT *
FROM Test
ORDER BY ID ASC
) AS A
ORDER BY ID DESC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
SQLite仍然ORDER BY在内部查询上执行,然后在外部查询中再次对它们进行排序.不必要的资源浪费.
我已经做了一个SQL小提琴来演示,所以你可以查看每个的执行计划.
不.首先是因为StartTime列可能没有UNIQUE约束.因此,即使是第一个查询也可能并不总是产生相同的结果 - 与其本身!
其次,即使从来没有两行具有相同的StartTime,答案仍然是否定的.
第一个语句将始终排序StartTime并生成前10行.第二个查询可能会生成相同的结果集,但只能生成一个原始优化器,它不能理解ORDER BY子查询中的冗余.并且只有执行计划包括此订购阶段.
SQLite查询优化器可能(目前)不是很明亮并且就是这样(不知道真的,我们必须检查SQLite*的源代码).因此,似乎两个查询始终产生相同的结果.尽管如此,依靠它并不是一个好主意.您永远不会知道在SQLite的未来版本中将进行哪些更改.
我认为这不是用好的做法LIMIT没有ORDER BY在任何DBMS.它现在可以工作,但您永远不知道应用程序将使用这些查询多长时间.当SQLite升级或DBMS发生变化时,您可能不在身边.
(*)@ Gareth的链接提供了执行计划,该计划表明当前的SQLite代码足够笨,无法执行冗余排序.
| 归档时间: |
|
| 查看次数: |
7190 次 |
| 最近记录: |