کارگران مشغول کار اند

script

درباره بهینه سازی sql کوئری با حل nested loop

برای حذف کردن یه سری row ها توی کوئری های خاصی از left join استفاده میکنیم. مثال زیر:

select * from tbl1
left join tbl2 on tbl2.key = tbl1.key
where tbl2.id is null

حالا اگر tbl2 همچین ساختاری داشته باشه:

create table tbl2 (id int primary key, key int);

باعث میشه اپتیمایزر رو به اشتباه بندازیم، به این شکل که چون id نمیتونه null باشه توی اون شرط where تعداد row های برگشتی از نود پایینتر رو کمتر حساب میکنه و این میتونه توی نودهای بالایی باعث اشتباه بشه.

مثال

همونطور که توی عکس پیداست تعداد ردیف های حدس زده شده اشتباهه

و این حدس اشتباه تا چند نود بالاتر تکرار میشه، و جایی مشکل اصلی شروع میشه که برای join با یه نود دیگه از nested loop استفاده میکنه!

حالا برای حل مشکل، بجای استفاده از id توی where از یه ستون دیگه هم استفاده میکنیم که nullable باشه. مثلا

where tbl2.column_2 is null and tbl2.id is null

نتیجه میشه:

همونطور که مشخصه تعداد row ها بیشتر حدس زده شد و از یه استراتژی دیگه استفاده کرد و کوئری من که حدود 10s طول میکشید الان 200ms کامل میشه!

نکته هایی که وجود داشت:

۱. توجه به nested loop

۲. پیدا کردن جایی که تعداد row های حدس زده شده که منجر به nested loop شده اشتباه هست

Designed By Erfan Powered by Bayan