¿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.