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
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
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.
Ehi! Grazie mille! Hai chiarito il mio dubbio – Pablo
'LIMIT
Questa risposta simile ha una buona soluzione con buone prestazioni se l'ordine delle righe è importante. http://stackoverflow.com/a/28860492/5016333 –
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 .
Grazie mille !! – Pablo
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
perché ci dovrebbe essere qualche differenza nelle prestazioni? sono uguali! –
Si prega di contrassegnare come risposta se ha eliminato i dubbi come lei ha ricordato nei commenti. –