Kwerenda Sqlite LIMIT / OFFSET

153

Mam proste pytanie do Sqlite. Jaka jest różnica między tym:

Select * from Animals LIMIT 100 OFFSET 50

i

Select * from Animals LIMIT 100,50
Pablo
źródło
9
Zaznacz to jako odpowiedź, jeśli rozwiało to Twoje wątpliwości, o czym wspomniałeś w komentarzach.
Mubashar

Odpowiedzi:

270

Te dwie formy składni są trochę mylące, ponieważ odwracają liczby:

LIMIT <skip>, <count>

Jest równa:

LIMIT <count> OFFSET <skip>

Jest kompatybilny ze składnią MySQL i PostgreSQL. MySQL obsługuje obie formy składni, a jego dokumentacja twierdzi, że druga składnia z funkcją OFFSET miała zapewnić zgodność z PostgreSQL. PostgreSQL docs wskazują, że obsługuje tylko drugi składni i docs SQLite jest pokazać, że obsługuje zarówno polecając drugi składni, aby uniknąć nieporozumień.

Nawiasem mówiąc, użycie LIMIT bez wcześniejszego użycia ORDER BY może nie zawsze przynieść zamierzone rezultaty. W praktyce SQLite zwróci wiersze w jakiejś kolejności, prawdopodobnie określanej przez to, jak są fizycznie przechowywane w pliku. Ale to niekoniecznie oznacza, że ​​jest w żądanej kolejności. Jedynym sposobem uzyskania przewidywalnej kolejności jest jawne użycie polecenia ORDER BY.

Bill Karwin
źródło
2
LIMIT <count> OFFSET <skip>jest bardziej jasne. Dziękuję Ci.
Guido Mocha
Ta podobna odpowiedź ma dobre rozwiązanie z dobrą wydajnością, jeśli kolejność wierszy ma znaczenie. stackoverflow.com/a/28860492/5016333
Rodrigo V
23

Ta ostatnia jest alternatywną składnią z jednym zastrzeżeniem :

Jeśli zamiast słowa kluczowego OFFSET zostanie użyty przecinek, to przesunięcie jest pierwszą liczbą, a limitem jest druga liczba. Ta pozorna sprzeczność jest zamierzona - maksymalizuje kompatybilność ze starszymi systemami baz danych SQL.

Nick Dandoulakis
źródło
5

Zrobiłem kilka testów i nie ma różnicy w wydajności.

Dotyczy to tylko zgodności z innymi językami sql.

Czas działania obu wersji jest taki sam.

Zrobiłem sqlite db z table1 z 100000 wierszami. Przeprowadzam następny 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) + "");
}

Czasy zmieniają się dla 0,001 sekundy

Kalanj Djordje Djordje
źródło
1
dlaczego byłaby jakaś różnica w wydajności? są takie same!
Abhinav Gauniyal