خانه SQL Server موضوعی نهفته در Sort Operator SQL Server افزایش سرعت SQL Server نوشته شده توسط: مهدی قپانوری تاریخ انتشار: ۲۴ مهر ۱۴۰۱ آخرین بروزرسانی: ۰۳ آبان ۱۴۰۲ زمان مطالعه: 12 دقیقه ۴.۶ (۵) SQL Server بر اساس تعداد رکوردهای درخواستی از دو الگوریتم متفاوت جهت مرتب سازی دادهها استفاده مینماید. در این مقاله ما قصد داریم نشان دهیم که چگونه تعداد رکوردهای بازگشتی در یک Query عملکرد SQL Server را در مرتب سازی دادهها تغییر میدهد. جهت نمایش دادهها به صورت مرتب شده بر اساس یک یا چند ستون خاص از عبارت Order By استفاده میگردد. استفاده از این عبارت ممکن است اجتناب ناپذیر باشد مانند هنگامی که از Paging استفاده مینمائیم. در این Demo ما از دیتابیس Stack Overflow و جدول Users این دیتابیس استفاده مینمائیم. جدول Users دارای یک Clustered Index است که بر روی ستون Id میباشد. میخواهیم اطلاعات ۱۰۰ کاربری را به دست بیاوریم که اخیرا در سایت ثبت نام نمودهاند. کوئری زیر این کار را انجام میدهد: Select Top 100 * From dbo.Users Order By CreationDate Desc تصویر زیر Plan اجرائی کوئری را نشان میدهد: تصویر نشان می دهد که SQL Server از اپراتور Sort استفاده نموده و علامت Warning بر روی این اپراتور وجو ندارد. حالا میخواهیم اطلاعات ۱۰۱ کاربر را به دست بیاوریم که اخیرا در سایت ثبت نام نمودهاند. در واقع نسبت به کوئری قبلی یک ردیف بیشتر را واکشی مینمائیم. کوئری زیر این کار را انجام میدهد: Select Top 101 * From dbo.Users Order By CreationDate Desc تصویر زیر Plan اجرائی کوئری جدید را نشان می دهد با وجود اینکه فقط یک ردیف بیشتر واکشی شده است اما علامت Warning بر روی اپراتور Sort وجود دارد: تصویر بعدی متن علامت Warning را نمایش میدهد: SQL Server مجبور شده است تقریبا ۱۴۵ هزار Page هشت کیلوبایتی داده را در دیتابیس سیستمی TempDB بنویسد و این کار سرعت اجرای کوئری را بسیار کاهش میدهد. مدت زمان اجرای کوئری دوم از مدت زمان اجرای کوئری اول بسیار بیشتر است، به عبارت دیگر کوئری اول خیلی سریع تر از کوئری دوم اجرا میشود. چرا این اتفاق افتاد؟ آیا واکشی یک رکورد بیشتر میتواند سرعت اجرای کوئری را بسیار کاهش دهد؟ هنگامی که ۱۰۰ رکورد و کمتر به صورت مرتب شده واکشی میشوند SQL Server جهت مرتب سازی از یک الگوریتم خاص استفاده مینماید و هنگامی که ۱۰۱ رکورد و بیشتر به شکل مرتب شده واکشی میشوند، SQL Server الگوریتم دیگری را مورد استفاده قرار میدهد. در ادامه به بررسی بیشتر این موضوع میپردازیم. تصویر زیر نشان میدهد که در حالت واکشی ۱۰۰ رکورد به شکل مرتب شده میزان Memory ایده آل SQL Server جهت اجرای کوئری برابر با ۴ مگابایت است: اما هنگامی که ۱۰۱ رکورد به شکل مرتب شده واکشی شده است میزان حافظه ایده آل SQL Server جهت اجرای کوئری تقریبا به چهار گیگابایت افزایش یافته است! تصویر زیر این مسئله را نشان میدهد: تخمین میزان حافظه مورد نیاز جهت اجرای کوئری در حالت دوم که ۱۰۱ رکورد واکشی شده کلا بهم ریخته زیرا که الگوریتم مرتب سازی داده تغییر یافته است. جهت برطرف نمودن مشکل فوق می توان از ایندکس گذاری مناسب استفاده نمود و اینکه فقط ستونهای مورد نیاز باید واکشی شوند. اما باید به این نکته توجه داشت که در محیط عملیاتی کوئریها به این سادگی نیستند و بخصوص در کوئریهایی که Join وجود دارد ممکن است ایندکس گذاری موجب حذف اپراتور Sort نشود. همواره تاکید بر این است که فقط ستون های مورد نیاز در کوئری در Select List قرار گیرند و از واکشی ستونهای اضافی خودداری شود اما باید به این نکته توجه ویژه داشت که تاثیر تعداد رکوردهای بازگشتی در سرعت اجرای کوئری ها بسیار حائز اهمیت است. در ادامه سوالاتی مرتبط با مرتب سازی داده ها مطرح میگردد: بسیاری از Application ها از تکنیک صفحه بندی یا Paging جهت نمایش داده استفاده مینمایند. سوال مهم این است که آیا نیاز هست بیشتر از صد رکورد در هر صفحه به کاربر نمایش داده شود؟ سوال دیگر این است که آیا وب سرویسهایی که ریز رکوردها را واکشی می نمایند نیاز دارند دادهها را به صورت مرتب شده دریافت کنند؟ آیا این امکان وجود دارد که مرتب سازی داده در سمت گرید انجام شود و عبارت Order By از کوئری حذف گردد؟ آیا دادههایی که به یک جدول موقت جهت نگه داشتن نتایج میانی درج میشوند باید مرتب شده باشند؟ به صورت کلی در عبارت Insert Into …. Select … آیا به عبارت Order By نیاز است؟ نوشتن عبارت Order By در کوئری هزینه دارد. همچنین ایندکس گذاری Free نیست. ایندکس سبب افزایش حجم دیتا میشود، حجم و مدت زمان عملیات پشتیبان گیری را افزایش میدهد، عملیات DML را کند میکند، در مدت زمان اجرای دستور CheckDB DBCC تاثیر میگذارد و در آخر ایندکسها نیاز به نگهداری دارند. چه رتبه ای میدهید؟ میانگین ۴.۶ / ۵. از مجموع ۵ اولین نفر باش دانلود مقاله موضوعی نهفته در Sort Operator فرمت PDF 4 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 15 مقاله توسط این نویسنده محصولات 1 دوره توسط این نویسنده مهدی قپانوری مهدی قپانوری بیش از 6 سال است که در زمینههای نرم افزار و بانک اطلاعاتی فعالیت مینماید. تخصص اصلی او در بانک اطلاعاتی SQL Server بوده و دارای تجربه در حوزههایPerformance Tuning، Database Administration، Database Development و طراحی سیستمهای OLTP میباشد. مهدی علاقهمند به R&D در حوزههای نوین SQL Server است. معرفی محصول مسعود طاهری آموزش ۳ در ۱ Performance Tuning در SQL Server 6.700.000 تومان مقالات مرتبط ۰۲ آبان SQL Server ابزار Database Engine Tuning Advisor؛ مزایا، کاربردها و روش استفاده تیم فنی نیک آموز ۱۵ مهر SQL Server معرفی Performance Monitor ابزار مانیتورینگ SQL Server تیم فنی نیک آموز ۱۱ مهر SQL Server راهنمای جامع مانیتورینگ بکاپ ها در SQL Server تیم فنی نیک آموز ۰۸ مهر SQL Server Resource Governor چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ مصطفی حسن زاده ۳۰ / ۰۸ / ۰۱ - ۰۹:۵۹ عالی بود ممنون پاسخ به دیدگاه محمدرضا خلیل زاده ۰۵ / ۰۸ / ۰۱ - ۰۱:۱۲ سلام یه سوال : اینکه ستون CreationDate ایندکس Cluster یا Non Cluster داشته باشه شرایط چقدر تغییر میکنه ؟ میتونه مانند همون واکشی ۱۰۰ رکورد باشه ؟ با تشکر. پاسخ به دیدگاه