PDA

View Full Version : مقایسه Performance بین استفاده از CTE و Cursor



mannai29
شنبه 02 بهمن 1389, 14:48 عصر
با سلام.
من در مواردی از پروسیجرها برای افزایش عملکرد تصمیم به استفاده از CTE به جای Cursor گرفته ام. بخصوص Cursor هایی که محاسباتی بوده و نتیجه محاسبه یک رکورد در محاسبه رکورد بعدی تاثیر خواهد داشت. صرف نظر از چگونگی انجام کار , در مقایسه Performance بین این دو شیوه , چه می توان گفت؟
با تشکر.

حمیدرضاصادقیان
شنبه 02 بهمن 1389, 19:52 عصر
سلام.
به این راحتی نمیشه نظر داد. چون ممکنه کوئری که شما با Cursor نوشتید رو بشه با ترفندهای دیگه هم نوشت.
پیشنهاد میکنم یک نگاه این لینک (http://social.msdn.microsoft.com/Forums/en/transactsql/thread/238b4bba-8c54-41ad-8330-38520d48e089) بندازید.

AAtoZZ
یک شنبه 03 بهمن 1389, 13:58 عصر
از هر دو راه بنویسید و با Display estimated execution plan اونها رو به صورت دقیق و جزء به جزء مقایسه کنید
اما تصور من اینه که با Index گذاری صحیح Cte می تونه خیلی بهتر باشه، Cursor آخرین راه حله.

http://lh4.ggpht.com/_vPa0QtSASSk/S_c4c6RN9PI/AAAAAAAAAXA/2UqN8q8QG9Y/STATICvsEmulation.jpg

mannai29
دوشنبه 04 بهمن 1389, 14:29 عصر
سلام
با توجه به بررسی که کردم متوجه شدم اصولا CTE چیزی نیست که برای جایگزینی با Cursor اومده باشه و بنابراین کاربردهای خاص خودش رو داره و محدودیت های خودش رو هم.
مثلا فکر می کنم CTE برای استفاده در درخت ها و یا جداول با تعداد رکوردهای کم , خوب جواب بده اما در کاربردهای مدل Recursive و با تعداد رکوردهای بالا نه. بخصوص اینکه شما محدودیت استفاده از تعداد بازگشت ها رو هم در اون دارید (32767 تا). نهایتا من وقتی CTE را بجای دو تا از Cursor هام گذاشتم توی هر دو تا با مشکل کاهش شدید Performance مواجه شدم !
البته من چیزی که به دنبالش هستم و هنوز مشخصا به نتیجه ای نرسیدم اینه که :
1- موارد بهینه کاربرد CTE کجاست؟ مثلا گفته بشه که در این شرایط بهترین گزینه است.
2- برای بهینه کردن Cursor هام (که روی هر رکورد در اون محاسبه انجام میشه و نتیجه توی محاسبه رکورد بعد تاثیر داره) چکار می تونم بکنم؟ و یا اینکه Cursor رو با چه گزینه های ممکن دیگه ای می تونم جایگزین بکنم.
با تشکر از دوستان.

حمیدرضاصادقیان
دوشنبه 04 بهمن 1389, 18:55 عصر
سلام.
البته با cte هم میشه به صورت ردیف به ردیف یک محاسبه ای رو مثل مانده حساب انجام داد. در روشهای بازگشتی هم تعدادش محدود هست ولی میشه نامحدودش کرد.
در بحث performance تنها بررسی دستورات کفایت نمیکنه. شما باید نوع ایندکس ها رو نیز بررسی کنید. تعداد خواندن و نوشتن ها از هارد رو باید بررسی کنید.
Execution Plan رو باید بررسی کنید و...
با بررسی تمام اینها میشه حدس زد مشکل از کجاست. وتنها مثلا جایگزینی یک دستور با دستور دیگه الزاما کارساز نیست و ممکنه حتی شرایط رو بدتر کنه.