Sqlite LIMIT / OFFSET sorgusu


153

Sqlite ile basit bir sorum var. Bunun arasındaki fark nedir:

Select * from Animals LIMIT 100 OFFSET 50

ve

Select * from Animals LIMIT 100,50

9
Yorumlarda belirttiğiniz gibi şüphelerinizi giderdiyse lütfen yanıt olarak işaretleyin.
Mubashar

Yanıtlar:


270

İki sözdizimi formu biraz kafa karıştırıcıdır, çünkü sayıları tersine çevirirler:

LIMIT <skip>, <count>

Şuna eşittir:

LIMIT <count> OFFSET <skip>

MySQL ve PostgreSQL sözdizimi ile uyumludur. MySQL her iki sözdizimi formunu da destekler ve dokümanlar OFFSET ile ikinci sözdiziminin PostgreSQL ile uyumluluk sağladığını iddia eder. PostgreSQL dokümanları sadece ikinci sözdizimini desteklediğini gösterir ve SQLite dokümanları her ikisini de desteklediğini gösterir ve karışıklığı önlemek için ikinci sözdizimini önerir.

Bu arada, önce ORDER BY'ı kullanmadan LIMIT kullanmak her zaman istediğiniz sonuçları vermeyebilir. Pratikte, SQLite satırları muhtemelen dosyada fiziksel olarak nasıl depolandıklarına göre belirlenen bir sıraya göre döndürür. Ancak bu mutlaka istediğiniz sırada olduğu anlamına gelmez. Öngörülebilir bir sipariş almanın tek yolu, ORDER BY'ı açıkça kullanmaktır.


2
LIMIT <count> OFFSET <skip>daha açıktır. Teşekkür ederim.
Guido Mocha

Bu benzer cevap, sıraların sırası önemliyse iyi performansla iyi bir çözüme sahiptir. stackoverflow.com/a/28860492/5016333
Rodrigo V

23

İkincisi, bir uyarı ile alternatif bir sözdizimidir :

OFFSET anahtar sözcüğü yerine virgül kullanılırsa, uzaklık ilk sayı ve sınır ikinci sayıdır. Bu görünen çelişki kasıtlıdır - eski SQL veritabanı sistemleriyle uyumluluğu en üst düzeye çıkarır.


5

Bazı testler yaptım ve performansta bir fark yok.

Bu sadece diğer sql dilleriyle uyumluluk içindir.

Her iki versiyonun da çalışma süresi aynıdır.

1001 satırlı table1 ile sqlite db yaptım. Sonraki testi çalıştırıyorum

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

Zaman saniyede 0,001 oranında değişir


1
performansta neden bir fark olsun ki? onlar aynı!
Abhinav Gauniyal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.