Tuesday, October 1, 2013

Oracle SQL optimization

Oracle SQL optimization

Oracle SQL optimizationနဲ႕ပတ္သက္ျပီး နည္းနည္းေလာက္ေျပာခ်င္တယ္။ background scenerio က ရွင္းရွင္းေလးပဲ။ table တစ္ခုက date ကို minimum function နဲ႕ရွာတာပဲ။ min(attendance_date) ဆိုပါေတာ႔။ အဲဒါကို ဒီအတိုင္းေရးျပီး development database မွာေရာ၊ UAT/QA ေတြမွာေရာအိုေကတယ္။ production မွာၾကေတာ႔ attendance_date မွာက index မေပးထားေတာ႔ ၁၀ နာရီေက်ာ္ၾကာသြားတယ္။ ဒါမ်ိဳးက မျဖစ္ဘူးမေျပာႏုိင္ဘူး။ ျဖစ္တာမ်ားတယ္။ index ေသခ်ာမလုပ္ထားရင္ query လုပ္တဲ႔အခါမွာ oracle က full scanning လုပ္ရတယ္။ အဲဒီမွာ table က ဧရာမၾကီးျဖစ္ေနရင္ query တစ္ေၾကာင္းခ်င္းစီအတြက္ အခ်ိန္က သိပ္ၾကာသြားတတ္တယ္။ အေကာင္းဆံုးကေတာ႔ attendance_date အပါအဝင္ query criteria ေတြကို index ေပးလိုက္တာပဲေပါ႔။

အဲဒီကိစၥကို သံုးေလးငါးရက္ research လုပ္ၾကည္႕တယ္။ oracle မွာက index အမ်ိဳးမ်ိဳးေဆာက္ထားျပီး ကိုယ္သံုးခ်င္တဲ႔ index ကို hint ေပးလုိ႕ရတယ္။

ေနာက္တစ္ခုက ကိုယ္ေရးလုိက္တဲ႔ query ေတြကို Explain Plan လုပ္ၾကည္႕ၾကဖုိ႕ပါ။ အဲဒါဆိုရင္ ေတာ္ရံုတန္ရံု အမ်ားၾကီးၾကီးေတြ မွားစရာသိပ္မရိွေတာ႔ဘူးေပါ႔။

ေနာက္တစ္ခုက သိပ္ကို ေႏွးေကြးေလးလံျပီး ဒုကၡေပးေနတဲ႔ query ေတြကို DBA privilage နဲ႕ဒီလိုရွာၾကည္႕လို႕ရပါတယ္။
SELECT * FROM (SELECT * FROM v$sql ORDER BY cpu_time DESC) WHERE ROWNUM <= 250;

ဒါဆိုရင္ cpu_time အၾကာဆံုး ထိပ္သီး ၂၅၀စာရင္းရပါမယ္။ အဲဒီထဲကမွ ကိုယ္႔ကို ဒုကၡေပးေနတဲ႔ query ကိုရွာၾကည္႕ရင္ေတြ႕ႏုိင္ေလာက္ပါတယ္။

ေနာက္တစ္ခုကေတာ႔ ဘယ္ယူဆာအေကာင္႔ထ္ေတြနဲ႕ကိုယ္႔ database ကိုလာခ်ိတ္ထားသလဲဆိုတာကို session ကိုၾကည္႕ျပီးသိႏုိင္ပါတယ္။
SELECT * FROM v$session WHERE ROWNUM < 250;

index ေတြနဲ႕ပတ္သက္ျပီး rule ေတြရိွပါေသးတယ္။ အၾကမ္းဖ်င္းေျပာရင္ေတာ႔ index ထည္႕လုိက္ရင္ select query ေတြျမန္ျပီး update နဲ႕ insert နဲ႕ေႏွးသြားတတ္ပါတယ္။ ကိုယ္႔ရဲ႕ system ေပၚမူတည္ျပီး အလြန္အကြ်ံမျဖစ္ေအာင္သတိထားျပီးသံုးၾကရတာပါပဲ။

ကိုယ္ၾကံဳလိုက္တာတစ္ခုကို အမွတ္တရအေနနဲ႕ျပန္ေရးလုိက္တာပါ။ သိျပီးသားဆိုရင္ ပိုမွတ္မိေအာင္၊ မသိေသးရင္ သတိထားဖုိ႕။ အဲဒီေလာက္ပဲရည္ရြယ္ပါတယ္။

ref:
http://docs.oracle.com/cd/B19306_01/server.102/b14211/hintsref.htm

Regards,
Zero

No comments: