PDA

View Full Version : کندی اجرای کوئری در زمان استفاده از user-defined function



Omid Rekabsaz
چهارشنبه 19 تیر 1387, 18:05 عصر
یک کوئری که دو user-defined function را با هم join می کند دارم. شرعت فوق العاده پایینه...
اگر نتیجه توابع را در جدول های موقت بریزم و جدول های موقت را با هم join کنم، سرعت اجرای کوئری به شدت بالا می ره.
چجوری میشه سرعت را بالا برد بدون استفاده از این جداول موقت؟!
بعنوان مثال روی جدوال نتیجه توابع می توان Index گذاری نمود یا خیر؟

در SQL 2008 امکانی دیدم به نام user-defined table... در نسخ پایین تر چه کار باید بکنیم؟!

ASKaffash
چهارشنبه 19 تیر 1387, 18:10 عصر
سلام
در واقعه برای اینکه از جداول موقت استفاده نکنیم اگر مجبور به استفاده از کرسر نباشیم و ارتباط داده ای نیز بهینه باشد باید بتوان دستورات SQL را پیاده سازی کرد علیهذا در صورت تمایل سورس SQL را قرار دهید تا شاید انشاالله با کمک دوستان بدون تابع و بدون ایجاد جدول موقت بتوان Select نوشت که پاسخ شما باشد.

Omid Rekabsaz
پنج شنبه 20 تیر 1387, 13:26 عصر
بدون ایجاد تابع میشه این کارو انجام داد... ولی در استانداردهای برنامه نویسی شرکت، کارهای خواندن اطلاعات با منطق خاص در SQL بصورت structural انجام می شود و برنامه نویس حق ندارد یک کار را چند بار با Select های مختلف انجام دهد. در واقع باید از تابع مربوطه استفاده کند و این تابع در پروسه های مختلف اجرا می گردد...

AminSobati
جمعه 21 تیر 1387, 21:21 عصر
تابع شما چه نوع تابعی هست؟ Scalar، Inline Table Valued, Multi Statement Table Valued

Omid Rekabsaz
شنبه 22 تیر 1387, 14:01 عصر
در ابتدا از Inline Table Valued استفاده می کردم ولی ایجاد جدول و سپس insert در جدول مجازی سرعت را بهبود داد... این بدان معنی است که تابع تبدیل شد به Multi Statement Table Valued. اما همچنان سرعت خوب نیست!!!

AminSobati
شنبه 22 تیر 1387, 16:34 عصر
اگر از Inline استفاده میکردین میشه این نتیجه رو گرفت که Queryها عملا نقش Subquery رو بازی میکردند! این خبر خوبیه چون امکان بهینه سازی توسط ایندکس وجود داره. اگر بتونین Execution Plan اون وضعیت رو پست کنین شاید بشه از همینجا حلش کرد.
من تصور میکنم در حالت Inline به خاطر عدم وجود ایندکس مناسب، جداول با حجم زیاد با هم Join میشدن ولی وقتی در جدوال موقتی قرار بگیره اطلاعات، طبیعتا حجم کمی رو انتخاب کردین برای Query پس سرعت بهتر میشه.

Omid Rekabsaz
یک شنبه 23 تیر 1387, 14:37 عصر
مگر می شود یک جدول temp که خروجی یک تابع می باشد را Index گذاری کرد... ببینید به این نکته توجه کنید اگر در کوئری اصلی من بجای استفاده از FN مستقیما از خود جدول Select بگیرم سرعت خیلی بالاست... در واقع Index گذاری جدول اصلی ایرادی ندارد... البته به نظر من!

AminSobati
دوشنبه 24 تیر 1387, 13:20 عصر
وقتی شما از Inline TVF استفاده میکنید، دیگه جدول Temp وجود نداره، نکنه از Multiline TVF استفاده کردین و اشتباها....

Omid Rekabsaz
دوشنبه 24 تیر 1387, 16:40 عصر
منظور شما از Inline TVF چیست؟! من در MSDN جستجو کردم و چیزی پیدا نکردم!

AminSobati
دوشنبه 24 تیر 1387, 20:09 عصر
اگر یک نگاه به راهنمای دستور CREATE FUNCTION در Books Online بندازین، Syntax هر سه حالت رو توضیح داده