2010-07-24 13 views
122

Tengo una pregunta simple con Sqlite. ¿Cuál es la diferencia entre esto:Sqlite LIMIT/OFFSET consulta

Select * from Animals LIMIT 100 OFFSET 50 

y

Select * from Animals LIMIT 100,50 
+9

favor marcarlo como respuesta si se ha despejado sus dudas como usted ha mencionado en los comentarios. –

Respuesta

211

Las dos formas de sintaxis son un poco confuso, ya que invierten los números:

LIMIT <skip>, <count> 

es equivalente a:

LIMIT <count> OFFSET <skip> 

Es compatible con la sintaxis de MySQL y PostgreSQL. MySQL admite ambas formas de sintaxis, y su reclamo docs afirma que la segunda sintaxis con OFFSET tenía la intención de proporcionar compatibilidad con PostgreSQL. PostgreSQL docs muestra que solo es compatible con la segunda sintaxis, y SQLite's docs muestra que es compatible con ambas, recomendando la segunda sintaxis para evitar confusiones.

Por cierto, usar LIMIT sin utilizar ORDER BY no siempre le dará los resultados que desea. En la práctica, SQLite devolverá las filas en un cierto orden, probablemente determinado por cómo se almacenan físicamente en el archivo. Pero esto no necesariamente significa que está en el orden que desea. La única forma de obtener un orden predecible es usar ORDER BY explícitamente.

+0

¡Hola! ¡Muchas gracias! Ha borrado mi duda – Pablo

+2

'LIMIT OFFSET ' es más claro. Gracias. –

+0

Esta respuesta similar tiene una buena solución con buen rendimiento si el orden de las filas es importante. http://stackoverflow.com/a/28860492/5016333 –

19

Este último es una sintaxis alternativa con uno salvedad:

Si se utiliza una coma en lugar de la palabra clave OFFSET, a continuación, el desplazamiento es la primer número y el límite es el segundo número . Este aparente contrasentido es intencional: maximiza la compatibilidad con los sistemas de bases de datos SQL heredados.

+0

¡Muchas gracias! – Pablo

6

Hice algunas pruebas y no hay diferencia en el rendimiento.

Eso es solo por compatibilidad con otros lenguajes sql.

El tiempo de ejecución de ambas versiones es el mismo.

Hice sqlite db con table1 con 100000 filas. Corro siguiente prueba

long timeLimitOffset = 0; 
long timeLimitComma = 0; 
for (int i = 0; i < 100000; i++) 
{ 
    //first version 
    timeLimitOffset += SqlDuraction("Select * from table1 order by col1 LIMIT " + (i + 1) + " OFFSET " + (1001 - i) + ""); 
    // second version 
    timeLimitComma += SqlDuraction("Select * from table1 order by col1 LIMIT " + (1001 - i) + " , " + (i + 1) + ""); 
} 

tiempos varían de 0,001 de segundo

+0

¿por qué habría alguna diferencia en el rendimiento? ¡Son lo mismo! –

Cuestiones relacionadas