Result set — database so‘rovi bajarilgandan keyin clientga qaytariladigan ustunlar va satrlar to‘plami. U doimiy jadvalning o‘zi emas, balki SELECT, stored procedure yoki boshqa query operatsiyasining muayyan vaqtdagi mantiqiy natijasidir.
Tuzilishi
Result set metadata va ma’lumot satrlaridan iborat. Metadata ustun nomi, tartibi, database tipi, null qiymatga ruxsat va ayrim driverlarda aniqlik kabi xususiyatlarni beradi. Ustunlar jadvaldagi asl nom bilan yoki alias orqali qaytarilishi mumkin:
SELECT customer_id, total_amount AS total
FROM orders
WHERE status = 'paid';
Bu natijada ikki ustun mavjud, lekin so‘rov nechta satr qaytarishi ma’lumot holatiga bog‘liq. Aggregate so‘rov bitta yoki guruhlangan satrlar, join esa bir nechta jadvaldan tuzilgan ustunlar qaytarishi mumkin. Ba’zi buyruqlar umuman result set bermay, faqat ta’sirlangan satrlar sonini bildiradi.
Tartib va barqarorlik
ORDER BY bo‘lmasa satrlar tartibi kafolatlanmaydi. Query plan, index yoki parallel bajarilish o‘zgarganda bir xil so‘rov boshqa tartibda kelishi mumkin. Pagination uchun barqaror va yetarlicha noyob sort kaliti kerak. Faqat takrorlanuvchi sana bo‘yicha saralash keyingi sahifada satr yo‘qolishi yoki takrorlanishiga olib kelishi mumkin; sana bilan birga primary key ishlatiladi.
Natija transaction isolation darajasiga ham bog‘liq. So‘rov qaysi snapshotni ko‘rishi, parallel transaction kiritgan o‘zgarishlar qachon ko‘rinishi database mahsuloti va isolation rejimi bilan belgilanadi. Result setni “doimiy haqiqat” deb emas, query bajarilgan kontekstdagi ko‘rinish deb tushunish muhim.
Client orqali o‘qish
Database driver result setni to‘liq xotiraga olishi yoki cursor orqali qismlab o‘qishi mumkin. Millionlab satrni birdan materializatsiya qilish client xotirasini tugatadi. Streaming yoki fetch size ma’lumotni partiyalarda olishga yordam beradi, biroq ochiq connection va transaction uzoq band qolishi mumkin.
Ustun tartibiga raqam bilan bog‘lanish schema o‘zgarganda mo‘rt bo‘ladi. Nom bilan mapping qilish va kutilgan tiplarni tekshirish aniqroq. SQL NULL qiymatini dasturlash tilidagi null turi bilan to‘g‘ri moslash zarur; 0, bo‘sh satr va NULL bir xil emas.
Hajm va xavfsizlik
Keraksiz SELECT * tarmoq trafikini, deserializatsiyani va schema bog‘liqligini oshiradi. Faqat kerakli ustunlar tanlanadi, qatorlar WHERE bilan cheklanadi, katta natijalar pagination yoki eksport jarayoni orqali beriladi. LIMIT natijani kamaytiradi, lekin tartib va umumiy hisob masalasini o‘zi hal qilmaydi.
Sensitive ustunlar so‘rov natijasiga umuman kiritilmasligi ma’qul. Application logiga butun result setni yozish maxfiy ma’lumotni oshkor qilishi mumkin. Monitoring satrlar soni, query vaqti va uzatilgan baytlarni qayd etishi mumkin, ammo qiymatlarni maskalash talab etiladi. Result set yopilganda unga tegishli cursor, statement va connection resurslari ham belgilangan tartibda bo‘shatiladi.
Bir stored procedure ketma-ket bir nechta result set qaytarishi mumkin. Driverda keyingi natijaga o‘tish uchun maxsus metod talab qilinadi; faqat birinchisini o‘qib connectionni qayta ishlatish protokol holatini buzishi mumkin. ORM esa result setni model obyektiga mapping qiladi, lekin hisoblangan alias yoki join natijasi to‘liq modelga mos kelmasligi mumkin. API contract ustun nomi, tip va nullable holatini database schema’dan alohida barqarorlashtiradi.
Schema o‘zgarishi consumer bilan versionlangan integratsiya sinovida tekshiriladi.
Bog‘liq tushunchalar
SQL, SELECT, Database cursor, Query plan, ORDER BY, Pagination, Transaction isolation, NULL