Uso del límite en la instrucción SQL sqlite en combinación con la cláusula order by

¿Las siguientes dos sentencias SQL siempre producirán el mismo set de resultados?

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 

No Primero porque la columna StartTime puede no tener una restricción UNIQUE . Por lo tanto, incluso la primera consulta puede no siempre producir el mismo resultado, ¡consigo mismo!

En segundo lugar, incluso si nunca hay dos filas con el mismo StartTime, la respuesta sigue siendo negativa .

La primera instrucción siempre orderará en StartTime y producirá las primeras 10 filas. La segunda consulta puede producir el mismo set de resultados pero solo con un optimizador primitivo que no comprende que el ORDER BY en la subconsulta es networkingundante. Y solo si el plan de ejecución incluye esta fase de orderamiento.

El optimizador de consultas SQLite puede (por el momento) no ser muy shiny y hacer exactamente eso (realmente no tengo idea, tendremos que verificar el código fuente de SQLite *). Por lo tanto, puede parecer que las dos consultas están produciendo resultados idénticos todo el time. Aún así, no es una buena idea contar con eso. Nunca se sabe qué cambios se realizarán en una versión futura de SQLite.

Creo que no es una buena práctica usar LIMIT sin ORDER BY en ningún DBMS. Puede funcionar ahora, pero nunca se sabe por cuánto time la aplicación utilizará estas consultas. Y es posible que no esté cerca cuando se actualiza SQLite o se cambia el DBMS.

(*) @ El enlace de Gareth proporciona el plan de ejecución que sugiere que el código SQLite actual es lo suficientemente tonto como para ejecutar el pedido networkingundante.

Sí, pero orderar subconsultas es probablemente un mal hábito para entrar. Posiblemente podría agregar un ORDER BY fuera de la subconsulta en su segundo ejemplo, por ejemplo

 SELECT * FROM (SELECT * FROM Test ORDER BY ID ASC ) AS A ORDER BY ID DESC LIMIT 10; 

SQLite todavía realiza el ORDER BY en la consulta interna, antes de orderarlos de nuevo en la consulta externa. Un innecesario desperdicio de resources.

He hecho un SQL Fiddle para demostrarlo para que pueda ver los planes de ejecución para cada uno.