Range scan — tartiblangan index yoki storage tuzilmasidan ma’lum quyi va yuqori chegara oralig‘idagi ketma-ket kalitlarni o‘qish usuli. U tenglikdan kengroq >, <, BETWEEN, prefix va vaqt intervali querylarida ishlatiladi.
B-tree bo‘yicha yurish
Engine avval quyi chegara uchun rootdan leaf page’ga tushadi. Keyin leaf sibling pointerlari bo‘ylab key orderida o‘qib, yuqori chegaraga yetganda to‘xtaydi. Birinchi nuqtani topish O(log n), keyingi k entryni o‘qish taxminan output va page soniga bog‘liq.
SELECT id, created_at, total
FROM orders
WHERE customer_id = 42
AND created_at >= TIMESTAMP '2026-07-01'
AND created_at < TIMESTAMP '2026-08-01'
ORDER BY created_at;
(customer_id, created_at) composite B-tree bu queryga tenglik prefixi va undan keyingi range bilan mos keladi.
Chegara semantikasi
BETWEEN odatda ikkala chegarani inclusive oladi. Timestamp intervalida qo‘shni oylarni [start, next_start) yarim ochiq shaklda yozish aniqlik va fractional second muammosini kamaytiradi. created_at <= '2026-07-31' kunning faqat midnight nuqtasini anglatishi mumkin.
NULL oddiy range comparisonga kirmaydi. Kerak bo‘lsa IS NULL alohida branch. Collation matn range tartibini belgilaydi; case-folding yoki locale yangilanishi index orderiga ta’sir qilishi mumkin.
Composite index
Leftmost prefix qoidasi ko‘p B-tree implementatsiyalarida muhim. (tenant_id, status, created_at) indexi tenant va status tengligi bilan vaqt range’ini yaxshi qamraydi. Birinchi ustunga range qo‘yilgach keyingi ustunlar scan intervalini toraytirishda cheklanishi mumkin, garchi filter sifatida qo‘llansa ham.
Index skip scan kabi optimizatsiyalar ayrim engine’da mavjud, lekin universal emas. Ustun tartibi eng muhim real querylar va selectivity bilan tanlanadi.
Covering va heap lookup
Index kerakli barcha output ustunlarini saqlasa index-only scan mumkin. Aks holda har index entry uchun table/heap row olinadi. Range ko‘p satr qaytarsa random heap lookup qimmatlashadi va optimizer sequential scan tanlashi mumkin.
Clustered index yoki fizik correlation range qatorlarini bir-biriga yaqin saqlaydi. PostgreSQLda visibility map index-only scan uchun heapga murojaatni kamaytiradi. Yaqinda ko‘p update bo‘lgan page’larda visibility tekshiruvi talab qilinishi mumkin.
Pagination
Keyset pagination oxirgi ko‘rilgan keydan range scan qiladi:
WHERE (created_at, id) < (:last_time, :last_id)
ORDER BY created_at DESC, id DESC
LIMIT 50
Bu katta OFFSETdan samaraliroq. Sort tuple’da unique tie-breaker bo‘lmasa bir xil timestampli qatorlar yo‘qolishi yoki takrorlanishi mumkin.
Locks va concurrency
Serializable yoki locking read’da range/predicate lock yangi rowning intervalga kirishini cheklab phantom anomaly’ni oldini olishi mumkin. Oddiy MVCC consistent read esa snapshotdagi range’ni ko‘radi. FOR UPDATE lock scope database va index planga bog‘liq bo‘lishi mumkin.
Monitoring rows scanned versus returned, buffer read, page access va execution time’ni kuzatadi. Range juda keng bo‘lsa index ishlatilishi yaxshi plan degani emas. Query plan, real parametr taqsimoti va statistics bilan baholanadi.
Rejalashtirish va kuzatuv
Optimizer range scan narxini tanlangan oraliqning selektivligi, indeks balandligi, sahifalar soni va jadvalga qaytish xarajati orqali baholaydi. Juda keng oraliqda to‘liq ketma-ket skan samaraliroq bo‘lishi mumkin. Amalda o‘qilgan va qaytarilgan satrlar nisbati muhim signal hisoblanadi.
Bog‘liq tushunchalar
B-tree, Leaf page, Composite index, Index-only scan, Keyset pagination, Collation, Predicate lock, Query plan