PDA

View Full Version : یه نکته خوب در مورد udf , sp



odiseh
سه شنبه 24 مرداد 1385, 15:47 عصر
سلام
دوستان من یه موردی رو امتحان کردم که نتیجه خیلی خوبی برای من داشت.

می دونیم که می تونیم به کمک یه تابع table-valued function نتیجه اجرای یه selectرو به فرمت table بسازیم و اونو برگردونیم ولی این مساله باعث کندی در اجرای صفحه (به خصوص اگه تحت وب اجرا بشه) می شه.

راه معادل و قوی اون اینکه دورن یه sp ساختار table رو با create table تعریف کنیم و بعد select مان را اجرا و درون اون insert کنیم آخر sp هم به یه select ساده مقادیر رو بخونیم.

بسیار بسیار سریعتر از حالت اول جواب می دهد.

حمیدرضاصادقیان
چهارشنبه 25 مرداد 1385, 07:54 صبح
سلام .روش خوبیه. ولی فکر کنم با view و ایجاد یک index روی فیلد سرعت کارت بیشتر میشه و نیازی به insert درون یک جدول نمی باشد و نتیجه رو به صورت یک جدول بهت بر میگردونه.وسرعتش هم زیاد میشه. و تعداد عملیاتی هم که میخوای انجام بدی کمتر میشه.

سنبله کار
چهارشنبه 25 مرداد 1385, 09:33 صبح
حالا اگه بخواهیم تعداد روزهای موجود بین دو تاریخ رو در یک جدول نشون بدیم
1- دیگه نمی تونیم از View و Index استفاده کنیم چون جدول پایه ای برای تاریخ ها وجود ندارد .
2- از طرفی اگر بخواهد این اتفاق روزانه بیش از هزار بار اتفاق بیافتد بنابر راه اول باید روزی هزار بار یک جدول را Create کنیم و بعد از اتمام دوباره پاکش کنیم که این کار خیلی هم مناسب حال دیتابیس نیست :متفکر:

حمیدرضاصادقیان
چهارشنبه 25 مرداد 1385, 12:37 عصر
خوب شما روز و تاریخ رو ازکجا آوردید و روزهای مابین اونو چه طوری میخواید بدست بیارید؟
وقتی که تاریخی ندارید؟
خلاصه باید تاریخ یک جایی ثبت شده باشه که شما بتونید تعداد روزهای بین اون تاریخها رو بدست بیارید.که با یک select در View به راحتی اینکار امکان پذیر است

odiseh
چهارشنبه 25 مرداد 1385, 14:15 عصر
سلام و تشکر از توجه شما دوستان
آقای سنبله کار،
جداول Temp در بانک tempdb ایجاد می شوند و مدیریت اونا رو هم خود SQL server انجام میده. اصلا خود sql هم برای ایجاد view ها و یا نتایج موقت اجرای query ها (derived table) ها از tempdb و ایجاد جداول موقت استفاده میکنه.

hpx
چهارشنبه 25 مرداد 1385, 23:59 عصر
ما که نفهمیدیم temp table این وسط واسه چیه، به چه دردت می خوره
به هر حال حتی الامکان سعی کن ازش استفاده نکنی

odiseh
یک شنبه 29 مرداد 1385, 08:36 صبح
temp Table برای نگهداری نتیجه محاسبات و پردازش ها استفاده می شه. چون اگه از temp استفاده نکنیم , راه دیگری برای نگه داشتن اطلاعات وجود نداره و از طرفی چون می خواهیم نتیجه پردازش یکجا جمع بشه از Local Temp Table و یا Global Temp Table هم نمیشه استفاده کرد.

سنبله کار
یک شنبه 29 مرداد 1385, 09:30 صبح
خوب شما روز و تاریخ رو ازکجا آوردید و روزهای مابین اونو چه طوری میخواید بدست بیارید؟
وقتی که تاریخی ندارید؟
خلاصه باید تاریخ یک جایی ثبت شده باشه که شما بتونید تعداد روزهای بین اون تاریخها رو بدست بیارید.که با یک select در View به راحتی اینکار امکان پذیر است
دو تاریخ اولیه می تونن به صورت پارامتر وارد بشن و جایی ثبت نشده باشن

حمیدرضاصادقیان
یک شنبه 29 مرداد 1385, 10:21 صبح
درسته .تاریخ به صورت پارامتر وارد میشه و شما هم در جدول فیلدی به نام تاریخ نداری.
حالا میشه بگی چطوری روزهای بین این دو تاریخ رو بدست میاری؟

AminSobati
دوشنبه 30 مرداد 1385, 22:40 عصر
سلام
دوستان من یه موردی رو امتحان کردم که نتیجه خیلی خوبی برای من داشت.

می دونیم که می تونیم به کمک یه تابع table-valued function نتیجه اجرای یه selectرو به فرمت table بسازیم و اونو برگردونیم ولی این مساله باعث کندی در اجرای صفحه (به خصوص اگه تحت وب اجرا بشه) می شه.

راه معادل و قوی اون اینکه دورن یه sp ساختار table رو با create table تعریف کنیم و بعد select مان را اجرا و درون اون insert کنیم آخر sp هم به یه select ساده مقادیر رو بخونیم.

بسیار بسیار سریعتر از حالت اول جواب می دهد.

من جزئیات کار شما رو نمیدونم اما این رو توجه داشته باشید که Table Valued Function عمل Insert رو در حافظه انجام میده که به مراتب از Temp Table سریعتره. ولی اگر حجم رکوردهای ورودی زیاد باشه، اونها رو در Tempdb قرار میده و تازه میشه چیزی که شما انجام دادین. شاید چیز دیگه ای این وسط تغییر کرده؟
هر چند تجربه شما رو رد نمیکنم چون Performance Tuning به پارامترهای ریز و درشت زیادی بستگی داره و شاید نکته ای وجود داشته باشه که من ازش بی اطلاعم.