DBAtlas · Veritabanı operasyon atlası

Satır sınırlama / sayfalama (LIMIT/OFFSET, FETCH, ROWNUM, TOP)

Oracle

-- 12c+ standart: OFFSET/FETCH
SELECT ad, maas FROM calisan
ORDER BY maas DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

-- Eski sürümler: ROWNUM ile
SELECT * FROM (
  SELECT ad, maas FROM calisan ORDER BY maas DESC
) WHERE ROWNUM <= 10;

Sonuç kümesini sınırlamak/sayfalamak için kullanılır. Oracle 12c'den beri standart OFFSET n ROWS FETCH NEXT m ROWS ONLY desteklenir. Öncesinde ROWNUM sözde sütunu kullanılırdı; ROWNUM sıralamadan önce atandığı için ORDER BY'lı alt sorgu sarmalamak zorunludur.

PostgreSQL

-- LIMIT/OFFSET
SELECT ad, maas FROM calisan
ORDER BY maas DESC
LIMIT 10 OFFSET 20;

-- Standart eşdeğeri: FETCH
SELECT ad, maas FROM calisan
ORDER BY maas DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

PostgreSQL hem LIMIT n OFFSET m hem de standart OFFSET ... FETCH biçimini destekler. Büyük OFFSET değerleri yavaştır; derin sayfalamada anahtar tabanlı (keyset / 'WHERE id > son_id') sayfalama daha verimlidir. Sıralamasız LIMIT sonuç sırasını garanti etmez.

MySQL

-- LIMIT [offset,] adet
SELECT ad, maas FROM calisan
ORDER BY maas DESC
LIMIT 10 OFFSET 20;

-- Kısa biçim: LIMIT offset, adet
SELECT ad, maas FROM calisan ORDER BY maas DESC LIMIT 20, 10;

MySQL/MariaDB LIMIT anahtar kelimesini kullanır; iki biçimi vardır: LIMIT adet OFFSET baslangic ya da LIMIT baslangic, adet. MySQL 8.0.19+ standart FETCH söz dizimini de kabul eder. Derin OFFSET performansı için keyset sayfalama önerilir.

SQL Server

-- TOP ile ilk N
SELECT TOP 10 ad, maas FROM calisan ORDER BY maas DESC;

-- Sayfalama için OFFSET/FETCH (2012+), ORDER BY zorunlu
SELECT ad, maas FROM calisan
ORDER BY maas DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

SQL Server ilk N satır için TOP n (TOP (n) PERCENT / WITH TIES varyantlarıyla), sayfalama için 2012'den beri OFFSET ... FETCH kullanır. OFFSET/FETCH'in çalışması için ORDER BY zorunludur. LIMIT anahtar kelimesi SQL Server'da yoktur.

MongoDB

// skip/limit ile sayfalama
db.calisan.find()
  .sort({ maas: -1 })
  .skip(20)
  .limit(10)

MongoDB'de limit() döndürülecek belge sayısını, skip() atlanacak belge sayısını belirler; sort() ile birlikte sayfalama yapılır. Büyük skip değerleri maliyetlidir; derin sayfalama için son görülen değere göre aralık sorgusu (range/keyset) tercih edilir.

Redis

# Sıralı küme (ZSET) üzerinde aralık okuma:
ZREVRANGE maas_sirali 20 29    # 21-30. sıradaki üyeler
# Liste üzerinde aralık:
LRANGE kuyruk 0 9              # ilk 10 eleman

Redis'te SQL LIMIT yoktur ama aralık okuma komutları vardır: Sorted Set için ZRANGE/ZREVRANGE start stop (indeks bazlı) veya ZRANGEBYSCORE ... LIMIT offset count; List için LRANGE. Bu komutlar sayfalama benzeri erişim sağlar.

Elasticsearch

GET calisan/_search
{
  "from": 20,
  "size": 10,
  "sort": [ { "maas": "desc" } ]
}

Elasticsearch'te 'size' döndürülecek isabet sayısını, 'from' atlanacak sayıyı belirler (LIMIT/OFFSET karşılığı). from+size en fazla index.max_result_window (varsayılan 10.000) kadar olabilir; derin sayfalama için 'search_after' (keyset) veya PIT (point-in-time) kullanılır.

DBAtlas'ta aç →