ورود

View Full Version : روش بهینه سازی یک sp



khorsandreza
دوشنبه 19 خرداد 1393, 22:36 عصر
سلام دوستان من یک SP نوشتم که موقع حذف یک رکورد چند کار مختلف انجام می دهد
در صورتی که سند توسط مدیر ارشد تائید نشده حذف سند بدون داشتن اثار و لاگ رکورد حذف میشود ولی در صورتی که سند تائید شده باشد چند کار مختلف باید انجام بگیرد
1 - قبل از حذف رکود در یک جدول دیگر با تما ایتم ها ذخیره شود.
2 - مقادیر از رکورد حذفی به رکورد پدر انتقال یابد
3 - مقادیر بعد از انتقال به رکورد پدر براساس مقدار ثابت یک فیلد به تعداد مقدار ضرب شود .
می خواستم بدانم اگر از تریگر استفاده کنم بهتر است یا موقع حذف یک SP را اجرا کنم ؟
ساختار دستور SP من

ALTER PROCEDURE [dbo].[BuySaham_Del]

(
@pkid int,
@ucod nvarchar(10)
)
AS
BEGIN
DECLARE @return_value int;
DECLARE @chkdel bit;
DECLARE @prnt int = 0;
DECLARE @khrd1 int = 0;
DECLARE @khrd2 int = 0;
DECLARE @fors int = 0;
DECLARE @smbl int = 0;
DECLARE @send bit = 0;

select @send = send,@chkdel=chkdel from TB_BuySaham where pk_id=@pkid;
if(@chkdel=1)
begin
IF (@send = 1)-- حذف رکورد بعد از تائید سند
Begin
select @prnt = prnt from TB_BuySaham where pk_id=@pkid;
select @khrd1 = khrd from TB_BuySaham where pk_id = @pkid
select @khrd2 = mojd,@fors=fors,@smbl=smbl from TB_BuySaham where pk_id = @prnt
Update TB_BuySaham set
mojd = @khrd1 + @khrd2,
fors = @fors - @khrd1,
jmbl = @smbl * (@khrd1 + @khrd2)
where pk_id = @prnt;

INSERT INTO TB_BuySaham_Del(radif,prnt,codm,sdate,tar,vazs,smb l,jmbl,khrd,fors,mojd,styp,nopr,send,ctyp,ucod,uac t,buycodm,mazad,tozh,keyid,id)
select radif,prnt,codm,sdate,tar,vazs,smbl,jmbl,khrd,fors ,mojd,styp,nopr,send,ctyp,@ucod,'D',buycodm,mazad, tozh,keyid,pk_id from TB_BuySaham
where keyid =@pkid

INSERT INTO TB_BuySaham_Del(radif,prnt,codm,sdate,tar,vazs,smb l,jmbl,khrd,fors,mojd,styp,nopr,send,ctyp,ucod,uac t,buycodm,mazad,tozh,keyid,id)
select radif,prnt,codm,sdate,tar,vazs,smbl,jmbl,khrd,fors ,mojd,styp,nopr,send,ctyp,@ucod,'D',buycodm,mazad, tozh,keyid,pk_id from TB_BuySaham
where pk_id =@pkid

Delete From TB_BuySaham Where pk_id =@pkid;
Delete From TB_BuySaham Where keyid =@pkid
Set @return_value = 1;
End else
begin
select @prnt = prnt from TB_BuySaham where pk_id=@pkid;

select @khrd1 = khrd from TB_BuySaham where pk_id = @pkid
select @khrd2 = mojd,@fors=fors,@smbl=smbl from TB_BuySaham where pk_id = @prnt
Update TB_BuySaham set
mojd = @khrd1 + @khrd2,
fors = @fors - @khrd1,
jmbl = @smbl * (@khrd1 + @khrd2)
where pk_id = @prnt;
Delete From TB_BuySaham Where pk_id =@pkid;
End
Set @return_value = 2;
end else Set @return_value = 99;-- سند دارای پدر می باشد امکان حذف نیست
print @return_value
return @return_value;

END

باید این را عرض کنم تما اتفاقات اصلی در یک جدول است . جدول بصورت درختی کنترل میشود

pezhvakco
سه شنبه 20 خرداد 1393, 16:23 عصر
سلام

می خواستم بدانم اگر از تریگر استفاده کنم بهتر است یا موقع حذف یک SP را اجرا کنم ؟
در پاسخ به این پرسش نظر من همین SP است .
چون فراخوانی، اجرا، کنترل و خروجی را بهتر و روان تر میشه داشت .

یه نگاهی به این صفحه داشته باشین =
http://barnamenevis.org/showthread.php?37831-%D8%A8%D8%A7%D9%84%D8%A7-%D8%A8%D8%B1%D8%AF%D9%86-performance-%D8%AF%D8%B1-query%D9%87%D8%A7

101101000
سه شنبه 20 خرداد 1393, 19:28 عصر
به نظر من کلیه این عملیات در تریگر انجام بشه بهتره چون اصلا نیازی به فراخوانی نیست بلکه شما در حالت فراخوانی شده هستید. دوما چون دستورات در وضعیت زنده (حالت فعال) هستند و اطلاعات هنوز تماما Commit نشده اند راحتتر میتونید کنترل کنید.
از همه مهمتر به نظرم یه نگاهی به پلن اجرایی(Execution Plan) این sp بنداز دوست عزیز... مطمئنا بدلیل وجود دستورات Select, Insert, Update, Delete کلید ها و ایندکس های زیادی دخیل خواهند شد.
در چند مرحله دارید دستورات آپدیت و دیلیت رو اجرا میکنید دوست عزیز. محاسبه کنید که با هر بار اجرای این دستورات ایندکس های شما و درختواره آن باید بروز رسانی شود و این چقدر بار زمانی و IO دارد؟ برای مثال در خطی دارید اطلاعاتی رو از جدولی با کلید اصلی پاک میکنید یعنی شرط حذف با کلید پیاده شده. آیا پلن اجرایی این دستورات رو بررسی کردین؟ کم هزینه هستند؟...!!!
صرفا در مباحث مربوط به DBA استفاده از sp یا تریگر مطرح نیست. بلکه در هر روش استفاده از بهینه ترین کد مطرح می باشد. شما حتی اگر این sp رو هم استفاده میکنید برای بهینه کردن باید کلیه پارارمتر های دخیل رو در نظر بگیرید.
امیدوارم مفید بوده باشه.
موفق باشید.