2010-07-24 17 views
122

Ho una domanda semplice con Sqlite. Qual è la differenza tra questo:query Sqlite LIMIT/OFFSET

Select * from Animals LIMIT 100 OFFSET 50 

e

Select * from Animals LIMIT 100,50 
+9

Si prega di contrassegnare come risposta se ha eliminato i dubbi come lei ha ricordato nei commenti. –

risposta

211

Le due forme di sintassi sono un po 'di confusione perché invertire i numeri:

LIMIT <skip>, <count> 

è equivalente a:

LIMIT <count> OFFSET <skip> 

È compatibile con la sintassi di MySQL e PostgreSQL. MySQL supporta entrambi i moduli di sintassi e la sua affermazione docs indica che la seconda sintassi con OFFSET era intesa a fornire compatibilità con PostgreSQL. PostgreSQL docs mostra che supporta solo la seconda sintassi e SQLite's docs mostra che supporta entrambi, raccomandando la seconda sintassi per evitare confusione.

A proposito, l'utilizzo di LIMIT senza prima utilizzare ORDER BY potrebbe non fornire sempre i risultati desiderati. In pratica, SQLite restituirà le righe in un certo ordine, probabilmente determinato dal modo in cui sono fisicamente memorizzate nel file. Ma questo non significa necessariamente che è nell'ordine che vuoi. L'unico modo per ottenere un ordine prevedibile è utilizzare ORDER BY esplicitamente.

+0

Ehi! Grazie mille! Hai chiarito il mio dubbio – Pablo

+2

'LIMIT OFFSET ' è più chiaro. Grazie. –

+0

Questa risposta simile ha una buona soluzione con buone prestazioni se l'ordine delle righe è importante. http://stackoverflow.com/a/28860492/5016333 –

19

Quest'ultima è una sintassi alternativa con uno avvertimento:

Se una virgola si utilizza invece la parola OFFSET, allora l'offset è il primo numero e il limite è il secondo numero . Questa apparente contraddizione di è intenzionale: è che ottimizza la compatibilità con i sistemi di database SQL legacy .

+0

Grazie mille !! – Pablo

6

Ho effettuato alcuni test e non ci sono differenze nelle prestazioni.

Questo è solo per compatibilità con altre lingue sql.

Il tempo di esecuzione di entrambe le versioni è uguale.

Ho creato sqlite db con table1 con 100000 righe. Corro prossimo test

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) + ""); 
} 

tempi variano per 0.001 di secondo

+0

perché ci dovrebbe essere qualche differenza nelle prestazioni? sono uguali! –

Problemi correlati