Duplicate elimination — result setdagi barcha tanlangan ustunlari bo‘yicha bir xil bo‘lgan satrlarni bitta nusxaga keltirish jarayoni. SQLda u SELECT DISTINCT, UNION, ayrim aggregate va set operatsiyalarida yuz beradi. Bu amal ma’lumotni guruhlashga o‘xshasa-da, uning maqsadi qiymat hisoblash emas, takroriy satrlarni olib tashlashdir.
Tenglik mezoni
Duplicate faqat ko‘rsatilgan output ustunlari bo‘yicha aniqlanadi:
SELECT DISTINCT city, country_code
FROM addresses;
Bir shaharda minglab manzil bo‘lsa ham, ayni city va country_code kombinatsiyasi bitta qatorga tushadi. Keyin postal_code ham select ro‘yxatiga qo‘shilsa, noyob kombinatsiyalar soni o‘zgaradi. Shu sabab DISTINCTni queryga shunchaki “takror chiqmasin” deb qo‘shishdan oldin natijaning biznes donadorligi belgilanadi.
Set semantikasida ikki NULL duplicate tekshiruvida bir xil deb qaraladi. Matnning tengligi collationga bog‘liq: case-insensitive collation Ali va ALIni teng deb bilishi mumkin. Trailing space, Unicode normalization va tip conversion mahsulot xulqiga ta’sir qiladi.
Bajarilish usullari
Database duplicate’larni sort qilib yonma-yon teng satrlarni birlashtirishi yoki hash jadvalida ko‘rilgan kombinatsiyalarni saqlashi mumkin. Input mos unique index tartibida kelsa, stream/unique operatori qo‘shimcha katta sortdan qochishi mumkin. Optimizer usulni satrlar soni, row width, mavjud tartib va xotira bo‘yicha tanlaydi.
Keng satrlar va katta cardinality hash yoki sort xotirasini oshiradi. Memory limitdan oshsa temporary disk ishlatiladi. Faqat kerakli ustunlarni tanlash, oldindan filterlash va mos index xarajatni kamaytirishi mumkin.
DISTINCT va GROUP BY
Aggregate bo‘lmagan GROUP BY a, b ko‘pincha SELECT DISTINCT a, b bilan bir xil natija beradi. Query optimizer ularni o‘xshash plan bilan bajarishi mumkin. DISTINCT noyob qator niyatini, GROUP BY esa guruh bo‘yicha hisob niyatini aniqroq ifodalaydi.
DISTINCT bitta ustunga emas, butun output qatoriga tegishli. COUNT(DISTINCT customer_id) esa aggregate ichidagi alohida noyob qiymatlar sonini hisoblaydi. Bir nechta ustunli distinct aggregate sintaksisi database tizimlari orasida farq qiladi.
Xatoni yashirish xavfi
Join predicate yetishmasa yoki one-to-many aloqa noto‘g‘ri tushunilsa qatorlar ko‘payadi. Tashqi DISTINCT ko‘rinadigan takrorni olib tashlashi mumkin, lekin noto‘g‘ri join ko‘p resurs ishlatishda davom etadi va boshqa ustun qo‘shilganda xato qaytadi. Avval cardinality va kalitlar tekshiriladi.
Ma’lumotning o‘zida duplicate bo‘lsa, querydagi elimination database invariantini tuzatmaydi. Unique constraint yangi takrorni cheklaydi; mavjud duplicate’larni tozalashda qaysi yozuv canonical ekani aniq siyosat bilan tanlanadi. Tasodifiy bitta qatorni qoldirish audit ma’lumotini yo‘qotishi mumkin.
Deterministik qator tanlash
Har biznes kalitiga eng yangi yozuvni tanlash uchun oddiy DISTINCT yetarli emas. ROW_NUMBER() OVER (PARTITION BY key ORDER BY updated_at DESC, id DESC) bilan rank berilib, birinchi qator olinadi. Tie-breaker noyob bo‘lsa natija takrorlanadigan bo‘ladi. Qaysi yozuv saqlangani va qaysilari chiqarilgani data tozalash jarayonida qayd etiladi.
Incremental oqimlar
Event pipeline’da duplicate elimination ko‘pincha idempotency key yoki event ID bo‘yicha vaqt oynasida bajariladi. Cheksiz barcha IDlarni xotirada saqlab bo‘lmaydi, shuning uchun retention biznesdagi maksimal kechikishga mos tanlanadi. Bir xil ID, ammo boshqa payload kelishi oddiy duplicate emas, producer invariantining buzilishi bo‘lishi mumkin. Exactly-once deb atalgan tizim ham source, transport, state store va sink chegaralarida alohida kafolatlarni talab qiladi.
Bog‘liq tushunchalar
SELECT DISTINCT, UNION, GROUP BY, Unique constraint, Cardinality, Window function, Collation, NULL