PDA

View Full Version : محاسبه و سرعت اجرا به کمک کرسر یا تابع



amirdeveloper
شنبه 26 آبان 1386, 12:06 عصر
دوستان وقت به خیر
فرض کنید می خواهیم با یک پروسیجر مقدار خروجی زیر را از چند جدول بدست آوریم :
کد کالا, نام کالا , موجودی
که مقدار موجودی باید برای هر کالا از جداول و فاکتورهای خرید و فروش محاسبه گردد. برای به دست آوردن مقدار موجودی دو راه رو امتحان کردم یکی استفاده از کرسر و دیگری نوشتن تابعی که در هر سطر مقدار موجودی را محاسبه کرده و با یک دستور SELECT مقدارموجودی را بدهد، به شکل زیر :
SELECT id,name,Mojoodi(id)
با توجه به اینکه بعد از مدتی تعداد رکوردها برای محاسبه موجودی از 10 ملیون رکورد خواهد گذشت کدام روش را سریعتر و بهینه تر می دانید؟

JAFO_IRAN
شنبه 26 آبان 1386, 20:00 عصر
بهترین روش اینه که یک کاری کنی عملیات توی loop نباشه. با cursor که حتما loop خواهی داشت. این تابع هم اگر inline نباشه همین حالت رو خواهد داشت. هر دو سرعت اجرای کمی خواهند داشت.
نمیشه با join و sub-query یا view همون نتیجه را بگیری؟

ارادت

Kamyar.Kimiyabeigi
یک شنبه 27 آبان 1386, 08:17 صبح
به نظر منم از join ها استفاده کنید خود sql server میگه تا اونجایی که میتونین از cursor استفاده نکنین

amirdeveloper
یک شنبه 27 آبان 1386, 10:39 صبح
دوستان عزیز از پاسختون ممنون ولی مشکلی که وجود داره اینه که این گزارش رو نمیشه با JOIN , SUBQUERY ساخت. چون در هر سطر نیاز به پردازش در دو جدول دیگه دارم ...

AminSobati
یک شنبه 27 آبان 1386, 12:22 عصر
دوست عزیزم،
اگر قراره این محاسبه برای تک تک رکوردها انجام بشه، پس استفاده از تابع و یا کرسر به هر حال یک نتیجه رو میده، اما تابع اولویت داره. ضمنا این مقاله رو هم ببینین:

http://barnamenevis.org/forum/showthread.php?t=57245

amirdeveloper
سه شنبه 29 آبان 1386, 12:05 عصر
جناب ثباتی عزیز ممنون از راهنماییتون.
به طور کلی برای به دست آوردن موجودی بهتره همیشه مقدار موجودی را با استفاده از تریگر در جایی از بانک اطلاعاتی نگهداری کنیم یا هربار که بهش نیاز داریم محاسبه کنیم ؟ (مثلا در فاکتور فروش برای بررسی مقدار موجودی!)

AminSobati
چهارشنبه 30 آبان 1386, 12:45 عصر
از نظر Performance، وقتی موجودی رو جایی ذخیره کردین، برای گزارش گیری طبیعتا خیلی سریعتره. اگر Triggerها و این محاسبات، خود عمل ویرایش رو کند نمیکنند میتونین از همین روش استفاده کنین.