နားလည်ထားရမယ့် အချက်
Database debugging မှာ query ကိုတစ်ကြောင်းလုံးပြင်မည့်အစား result grain၊ base rows၊ join တစ်ခုစီ၊ filters နှင့် aggregates ကိုအဆင့်လိုက်စစ်ပါတယ်။ Small deterministic fixture နဲ့ expected rows ကိုကြိုရေးထားရင် bug ကိုမြန်မြန်ဖမ်းနိုင်ပါတယ်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
ပေးထားသော report က enrollment count ကို lesson count နဲ့မြှောက်ထားတာ၊ LEFT JOIN ကို WHERE filter နဲ့ဖျက်ထားတာနဲ့ NULL comparison မှားတာကို test rows ငါးခုဖြင့်သက်သေပြမယ်။ Corrected query နှင့် regression test fixture ကိုအတူပေးပါ။
အတူတူ စမ်းရေးကြည့်မယ်
-- Buggy: enrollments are multiplied by lessons
SELECT t.title, count(e.enrollment_id) AS enrollments
FROM app.tutorials t
LEFT JOIN app.enrollments e USING (tutorial_id)
LEFT JOIN app.lessons l USING (tutorial_id)
WHERE l.duration_minutes > 0
GROUP BY t.title;
-- One possible correction
SELECT t.title, count(e.enrollment_id) AS enrollments
FROM app.tutorials t
LEFT JOIN app.enrollments e USING (tutorial_id)
WHERE EXISTS (SELECT 1 FROM app.lessons l
WHERE l.tutorial_id = t.tutorial_id
AND l.duration_minutes > 0)
GROUP BY t.tutorial_id, t.title;Bug explanation၊ corrected query နှင့် reproducible fixture ရမည်။၅ မိနစ် စမ်းကြည့်
Buggy query ကိုကိုယ်တိုင် run ပြီး intermediate row set ကို print ထုတ်ကာ multiplication ဘယ်မှာဖြစ်သလဲမှတ်ပါ။
သတိလေးတစ်ချက်
`DISTINCT` ထည့်ပြီး result တည့်သွားတာကို root fix မယူဆပါနှင့်—grain/relationship bug ကိုဖုံးထားနိုင်ပါတယ်။
PostgreSQL — Queries — PostgreSQL Global Development Group