حال که با قابلیت ها ونحوه ساخت Stored Procedure آشنا شدید بد نیست که به نحوه استفاده از این ابزار جالب در Asp.NET بپردازیم .
استفاده از این ابزار بسیار ساده هست . اگر از SQL Datasource یا ObjectDatasource استفاده می کنید یک ویزارد برای ساخت و استفاده از Stored Procedure ها قرار داده شده که به راحتی آن را مدیریت کنید .
اگر از کد نویسی برای کار با بانک های اطلاعاتی استفاده می کنید کافیه بعد از تعریف SQLCommand به جای دستورات SQL نام SP را وارد نموده و بعد از آن کد زیر را اضافه نمایید :
Cmd.CommandType = CommandType.StoredProcedure;
این کد به برنامه می گوید که دستورات نوشته شده از نوع Stored Procedure هستند و نیازی به ترجمه آن ها نیست .
در نهایت کد های اتصال ما به شکل زیر خواهد بود :
SqlConnection Con=new SqlConnection("YourConnectionString");
SqlCommand Cmd = new SqlCommand("YourProcedureName", Con);
Cmd.CommandType = CommandType.StoredProcedure;
Con.Open();
// Some Code...
Con.Close();
بهینه سازی stored procedure ها در SQL Server
1- در نامهای SP از _sp استفاده نکنید. زیرا این علامت مخصوص sp های سیستمی موجود در جدول master میباشد و هنگامی که از این اختصار استفاده میکنید سیستم ابتدا دنبال این نام در جداول سیستمی میگردد. پس از اون اگه پیدا نکرد با ownerDBO به دنبال اون میگرده که همین باعث میشه کلی از سرعت اجرای sp کاهش پیدا کنه.
2-در داخل یک SP بهتر است به جای اینکه داخل آن از دو دستور Select استفاده کرد، هرکدام را در داخل یک SP قرار داده و آنرا به هنگام نیاز اجرا کنیم. به مثال زیر توجه نمایید:
کد :
create Stored procedure dbo.SPTest @query bit as if @query=0 select * from authors else select * from publishers go
بهتر است از نمونه زیر استفاده شود.
کد :
create Stored procedure dbo.SPTest @query bit as if @query=0 Exec sptestFromauthors else Exec spTestfrompublishers go //-----------------// create Procedure dbo.spTestfromAuthors as select * from Authors go //-----------------// Create Procedure dbo.spTestFromPublishers as Select * from Publishers go
دلیل استفاده از کد زیر چیست و نسبت به کد بالا چه مزیتی دارد؟در داخل هر sp فقط یک Query میتواند در داخل cache SQL قرار میگیرد . و چون در داخل SP اول دو query هستند هر دفعه که این SP اجرا شود مجدد SP کامپایل خواهد شد و همین سرعت آنرا خواهد گرفت.
نکته 1 : در SP هایی که نیاز نیست کاربر متوجه بشه چه تعداد ردیف تحت تاثیر قرار گرفته است،حتماً در اول SP دستور Set NoCount On را بنویسید. زیرا اگر این دستور را ننویسید هربار که عملیاتی صورت گرفته ،SQL تعداد ردیفهای تحت تاثیر قرار گرفته را برای کاربر ارسال میکند و همین باعث یک ترافیک الکی روی client , server میشود.
نکته 2 : تاجاییکه امکان داره دستورات داخل SP را کوچک نگه دارید. این کمک میکنه که تعداد Lock ها کم بشه و سرعت کلی برنامه شما بالا بره. دو راه برای کاهش طول دستورات SQL موجود است.
تفکیک کردن کارهای یکپارچه به مراحل کوچکتر که هر مرحله در حد امکان به سرعت Commit شود.
سو استفاده از SQL Server Statement Batches ، که رفت و برگشت بین client و Server را کم میکند
نکته 3 : اگر دستورات داخل SP همیشه ثابت هستند و بصورت دینامیک تعریف نشده اند، خیلی خوب است و این کار باعث میشود تا SQL برای آن یک Plan تشکیل دهد. ولی اگر بوسیله دستور Where دارای متغیر میباشد و هردفعه عوض میشود این یک چیز ایده آل نیست و هردفعه SP باید حتماً Compile شود و Optimize نخواهد شد.اگر شما میدانید که هر دفعه که SP نیاز به اجرا داشته باشد دائماً متغیرهای آن تغییر خواهند کرد، بهتر است ابتدای SP دستور With Recompile را بنویسید .این SP را مجبور میکنه که حتماً باید موقع اجرا دوباره Compile شود ، در اینحال شما مطمئن شوید که هربار که SP اجرا شد خود به خود Optimize میشود.
نکته 4 : برنامه خود را جوری طراحی کنید که کاربر امکان لغو یک عملیات را داشته باشد. کاری نکنید که شاید کاربر مجبور به reboot کردن سیستم شود ، که میتواند باعث تجزیه نشدن مشکلات performance شود.نکته 5: بیشتر SP ها از تعدادی پارامترها استفاده میکنند. این به خودی خود چیز بدی نیست. ولی زمانی میتونه باعث مشکل بشه که اگر پارامترها optional باشند، و تعداد پارامترهای متغیر خیلی زیاد باشند هر زمان که sp اجرا میشود. دوراه برای هندل این مشکل هست یکی با بازده آرام و یکی با بازده سریع.راه بهتر اینه که ، به کار گیری منطق If...ELSE را داخل SP هست، و ایجاد یک query مجزا برای هر ترکیب ممکنی از متغیرها که درون SP تعریف شده اند. در این راه، شما میتوانید مطمئن باشید که query شما هر زمان که اجرا میشود کارآمد و موثر هست.
یه مثال هم میزنم :
مثلا همه آگهی ها یه سری فیلد ثابت دارن. مثل عنوان آگهی و شرح آن . حالا مثلا گروه خودرو فیلدهایی مانند شرکت سازنده خودرو، تیپ، نوع سوخت و ... دارد. چطوری این فیلدها رو که در دو جدول مختلف ذخیره شده اند رو با هم از طریق یک sp از دیتابیس موقع جستجو بکشم بیرون ؟