PDA

View Full Version : حرفه ای: نظربرنامه نویسان درباره sp ها



ncs2008
جمعه 21 خرداد 1389, 16:47 عصر
سلام دوستان وخسته نباشید
من 2 سوال دارم که اگه دوستان برنامه نویس می تونن کمکم کنن.
1- آیا از نظر قوانین برنامه نویسی درسته که ما یک query کوچک را مثل یک insert یا select را در یک stored procedureمجزا بنویسیم و اجرا کنیم؟مثلا یک insert برای یک جدول در یک sp و یک insert در یک sp برای جدول دیگر. اگه بله چرا اگه نه چرا خوب نیست
2- آیا می توان هر 3 نوع عملیات را که دارای 3 پارامتر مختلف هستند را در یک sp نوشت سپس در موقع نیاز یکی از این پارامتر ها را فراخوانی کرد.
به طور مثال 3 دستور Insert و delete و update را با 3 پارامتر مختلف در یک sp نوشت و سپس از یکی از این پارامترها مثلا فقط insert استفاده کرد؟من اینکارو کردم و ارور داد میگه شا باید 3 پارامتر پاس دهید آیا روش برای دور زدنش هست؟

ASKaffash
شنبه 22 خرداد 1389, 10:40 صبح
سلام
استفاده از این روشها سلیقه ای است و کسی تائید یا رد نمی تواند بکند بنظرم روی سرعت هم موثر نیست مثلا ممکن است فردی مستقل بودن دستورات درج / ... را از برنامه کاربردی یک دلیل خوب بداند ولی به نظر من قانع کننده نیست

AminSobati
شنبه 22 خرداد 1389, 13:08 عصر
سلام دوست عزیزم،
با توجه به اینکه هر SP فقط یک بار کامپایل میشه و فقط یک نسخه از اون در Plan Cache قرار میگیره، روش درست و اصولی این هست که به ازای هر عمل ویرایشی، یک SP مجزا برای جدول داشته باشید. نرم افزارهای کمکی زیادی نوشته شده که برای شما SP دستورات ویرایشی رو بصورت اتوماتیک تولید میکنه.
اگر میخواین SPهای شما از نظر تعداد زیاد نباشن، میتونین به این شکل دسته بندی کنین:



create proc usp_Customers;1
as
-- put insert command here
go

create proc usp_Customers;2
as
-- put update command here
go

create proc usp_Customers;3
as
-- put delete command here
go


حالا وقتی در لیست SPها نگاه کنید فقط یک SP وجود داره ولی موقع فراخوانی باید شماره SP رو همراه کنید. مثلا بعنوان یک استاندارد قرار میگذارین که کد 1 برای Insert و 2 برای Update و 3 برای Delete باشه. حالا وقتی میخواین Insert انجام بدین:
Exec usp_Customers;1
رو اجرا میکنید. ولی هر SP میبایست پارامترهای مجزای خودش رو داشته باشه

محمد سلیم آبادی
شنبه 22 خرداد 1389, 13:21 عصر
سلام آقای ثباتی،
با این پست خودتون را از همه متمایز کردین، عالیه
به نظرم زمانی که مثلا 50 جدول داریم این دسته بندی خیلی می تونه ما را یاری کنه.

ظاهرا برای اجرا پروسیجر با عدد 1 نیازی به قرار دادن این عدد در جلوی نام پروسیجر نیست. یعنی بطور پیشفرض عدد 1 در نظر گرفته میشه یعنی
EXECUTE Usp_Customers

حمیدرضاصادقیان
شنبه 22 خرداد 1389, 14:09 عصر
استاد سلام.این مورد خیلی جالب بود. این موردی که نوشتین برای گروه بندی SP هاست؟
کاربرد دیگه ای که نداره؟

AminSobati
شنبه 22 خرداد 1389, 14:27 عصر
این روش از نسخه های قدیمی وجود داشت ولی مایکروسافت ممکنه در نسخه های بعدی حذفش کنه (البته بعید میدونم چون از این تهدیدات زیاد کرده!!).
کاربردش هم دقیقا برای گروه بندی هست. ولی من شخصا ذوقی برای این کار نداشتم. به هر حال وقتی قراره SP اجرا بشه، باید با یک شماره مثلا 3; نام SP مورد نظر رو متمایز کنید، که همین تمایز درست مثل این هست که دارین یک SP با نام متفاوت اجرا میکنید. یعنی تنها قشنگیش اینه که وقتی لیست SPها در Object Explorer رو باز میکنید، این لیست کمتر Scroll میشه!
در شرکتهایی که چنین روشی رو به کار برده بودن من در کار کردن با دیتابیسشون همیشه یک مشکل داشتم و اون اینکه اگر چند SP رو هم گروه کرده بودند، وقتی من میخواستم SP شماره 3; رو ببینم، باید SP اصلی رو باز میکردم و بعد با Scroll و بصورت چشمی Header اون SP رو پیدا میکردم که گاهی اعصاب خورد کن میشه. ناچارا CTRL+F میزدم و 3; رو جستجو میکردم تا به CREATE PROC مربوطه برسم. در حالیکه اگر SPها از یک استاندارد نام گذاری تبعیت کنند، درسته تعداد SPها بیشتر میشه، اما دسترسیشون راحته. بعنوان مثال:

usp_Customers_Insert
usp_Customers_Delete
usp_Customers_Update

با این کار در Object Explorer ابتدا نام جدول سورت میشه و بعد عمل ویرایشی مربوطه.
بعنوان جمع بندی شاید بشه گفت بنابر همین دلایل مایکروسافت احتمال حذفش رو اعلام کرده. برای توضیحات بیشتر در BOL به CREATE PROC مراجعه بفرمایید

hamid-nic
شنبه 22 خرداد 1389, 14:29 عصر
سلام آقای ثباتی عزیز
آیا با گروه بندی کردن SP ها این نکته ای که گفتید هنوز پابرجا می مونه ؟

با توجه به اینکه هر SP فقط یک بار کامپایل میشه و فقط یک نسخه از اون در Plan Cache قرار میگیره، روش درست و اصولی این هست که به ازای هر عمل ویرایشی، یک SP مجزا برای جدول داشته باشید.
یعنی منظورم این است که چون ما مثلا هر 3 عمل درج ، ویرایش و حذف را در یک Sp اجرا می کنیم آیا باز هم مزایای استفاده از Sp مجزا برای هر عمل را دارد یا نه ؟

ncs2008
شنبه 22 خرداد 1389, 14:53 عصر
سلام دوست عزیزم،
با توجه به اینکه هر SP فقط یک بار کامپایل میشه و فقط یک نسخه از اون در Plan Cache قرار میگیره، روش درست و اصولی این هست که به ازای هر عمل ویرایشی، یک SP مجزا برای جدول داشته باشید. نرم افزارهای کمکی زیادی نوشته شده که برای شما SP دستورات ویرایشی رو بصورت اتوماتیک تولید میکنه.
اگر میخواین SPهای شما از نظر تعداد زیاد نباشن، میتونین به این شکل دسته بندی کنین:



create proc usp_Customers;1
as
-- put insert command here
go

create proc usp_Customers;2
as
-- put update command here
go

create proc usp_Customers;3
as
-- put delete command here
go


حالا وقتی در لیست SPها نگاه کنید فقط یک SP وجود داره ولی موقع فراخوانی باید شماره SP رو همراه کنید. مثلا بعنوان یک استاندارد قرار میگذارین که کد 1 برای Insert و 2 برای Update و 3 برای Delete باشه. حالا وقتی میخواین Insert انجام بدین:
Exec usp_Customers;1
رو اجرا میکنید. ولی هر SP میبایست پارامترهای مجزای خودش رو داشته باشه

دوست عزیز آقای ثباتی این کدی که شما نوشته بودید را قبلا تست کرده بودم و جواب هم نداده بود.چون با این کد شما 3 sp جدا ایجاد می کند که این در object explorer مشخص است دقیقا مانند اینکه شما دارید 3sp جدا می نویسید.
نسخه مورد استفاده sql server 2005 developer
دلیل تعجب من این بود که وقتی بانک چند نرم افزار قوی را دیدم در کل 20 تا 30 تا sp داشتن در حالی که من 1دهم اون برنامه را نوشتم 12sp شده.چون در اکثر برنامه های پیشرفته تعداد sp ها همین حدود است.

حمیدرضاصادقیان
شنبه 22 خرداد 1389, 15:21 عصر
دوست عزیز آقای ثباتی این کدی که شما نوشته بودید را قبلا تست کرده بودم و جواب هم نداده بود.چون با این کد شما 3 sp جدا ایجاد می کند که این در object explorer مشخص است دقیقا مانند اینکه شما دارید 3sp جدا می نویسید.
نسخه مورد استفاده sql server 2005 developer
دلیل تعجب من این بود که وقتی بانک چند نرم افزار قوی را دیدم در کل 20 تا 30 تا sp داشتن در حالی که من 1دهم اون برنامه را نوشتم 12sp شده.چون در اکثر برنامه های پیشرفته تعداد sp ها همین حدود است.
سلام.با اجازه استاد ثباتی.
دوست عزیز تعداد SP های یک دیتابیس ملاک مناسبی برای اینکه متوجه بشیم اون دیتابیس یا نرم افزاری که از اون دیتابیس استفاده میکنه قوی هست یا خیر؟ به طور مثال من دیتابیس همکاران سیستم رو دیدم چیزی حدود 980 تا SP داره. مهم اینه که یک سیستم بتونه به صورت درست از یک SP استفاده کنه. بعضی از سیستمها تعداد SP هاشون بالاست ولی اینقدر سرعت سیستم پایین هست که حد نداره. بعضی از سیستمها هم تعداد Sp های کمی دارند ولی هم بهینه کار کردن هم از الگوریتمهای مناسبی استفاده کردن که سرعت و کارایی سیستمشون بالاست.
به طور مثال یک دیتابیس فوق العاده ایی:گیج: که شخصا دیدم تا یک هفته خوابم نمیبرد از نوع طراحی دیتابیس مربوط به یک نرم افزار داخلی شرکت ایران خودرو بود.
برنامه نویس این سیستم یک SPنوشته بود برای سیستم به شرح زیر.
فرض کنیداین آقا میخواست نام تک تک کاربران رو برگردونه و یک شرط خاصی براشون اعمال کنه.
درون اون SP به ازای تک تک کاربران یک دستور Select نوشته بود.بعد هر تعداد که به کاربران اون سیستم اضافه میشد این آقا باید میرفت دستی داخل اون SP نام کاربر جدید رو وارد کنه تا در لیست بهش نمایش بده.:متعجب:
اینم یک جور استفاده کردن از SP هاست. نامگذاری جداول هم از Table_1 شروع شده بود تا Table_100 .:متعجب:
شما خودتون تا اخر داستان رو بخونید.

ncs2008
شنبه 22 خرداد 1389, 15:43 عصر
ممنون از آقای صادقیان.
دوست عزیز این چیزی که شما می فرمایید کاملا درست است و تعداد این دسته از برنامه ها به این طریق که شما گفتید (عدم کدنویسی صحیح db) زیاد هست اما ما با این برنامه ها کار نداریم و ما می خواهیم کدی بنویسیم علاوه بر سرعت بتواند مدیریت آسانی هم داشته باشد.
به نظر شما از نظر بهینه و مدیریت db در بخش objectexplorer و در قسمت sp کدام بهتر است؟

sp1:dbo.deptno_insert
sp2:dbo.deptno_delete
sp3:dbo.deptno_update
sp4:dbo.deptno_select

یا این sp:

master sp:deptno_operation

حمیدرضاصادقیان
یک شنبه 23 خرداد 1389, 10:39 صبح
سلام.البته وقتی استاد ثباتی نظر میدن دیگه صحبت کردن صحیح نیست. ولی من هم با نظر استاد ثباتی موافق هستم.من خودم با روش اولی شما (یعنی برای هرکار یک SP ) کار میکنم.
این لینک (http://www.sql-server-performance.com/tips/stored_procedures_p1.aspx)هم میتونه مفید باشه.
موفق باشید.

ncs2008
یک شنبه 23 خرداد 1389, 16:32 عصر
ممنون آقای صادقی خیلی کمکم کردید

چون این موضوع خیلی فکرمو مشغول کرده بود

بابت لینکم ممنونم
بازم ممنون

AminSobati
یک شنبه 23 خرداد 1389, 20:57 عصر
سلام آقای ثباتی عزیز
آیا با گروه بندی کردن SP ها این نکته ای که گفتید هنوز پابرجا می مونه ؟

یعنی منظورم این است که چون ما مثلا هر 3 عمل درج ، ویرایش و حذف را در یک Sp اجرا می کنیم آیا باز هم مزایای استفاده از Sp مجزا برای هر عمل را دارد یا نه ؟

بله دوست عزیزم، این مزایا رو داره