خانه SQL Server Statisticsها در چه شرایطی توسط SQL Server به طور خودکار بهروز میشوند SQL Server افزایش سرعت SQL Server نوشته شده توسط: تورج عزیزی تاریخ انتشار: ۱۹ مرداد ۱۳۹۴ آخرین بروزرسانی: ۱۰ اردیبهشت ۱۴۰۱ زمان مطالعه: 8 دقیقه ۵ (۱) مقدمه سلام؛ خواننده این مقاله نیاز دارد تا پیش از مطالعه با مفهوم Statistics در SQL Server آشنا باشد. statistic ها نقش مهمی در تولید پلن اجرا برای یک کوئری دارند. تخمین تعداد ردیف های در گردش در یک پلن اجرا با تکیه بر این اشیا انجام می شود و به روز نبودن این آمار می تواند به تولید پلن اجرای ناکارآمد و در نهایت تضعیف Performance منجر شود. قابلیتی در SQL Server وجود دارد به نام Auto Update Statistics که جزو Option های دیتابیس به حساب می آید و وقتی فعال باشد باعث می شود تا در صورتی که میزان تغییرات در داده های جدول از یک حد آستانه عبور کند به طور خودکار بروز شود: گزینه Auto Create Statistics را همیشه فعال نگهدارید، این گزینه باعث می شود SQL Server شیء آمار را به ازای ستونی که ایندکس روی آن وجود ندارد (اما نیاز به داشتن آمار روی آن جهت تخمین تعداد رکوردهایی که شرط خاصی را ارضاء می کنند) به طور خودکار ایجاد کند. این نوع اشیای آمار با پیشوند _WA_ شروع می شود. در یک جدول عادی و موقت زمانی که هر یک از این شرایط رخ دهد آمار در هنگام اجرای کوئری وابسته به این آمار بروز می شود: اندازه جدول از ۰ ردیف به بیش از آن افزایش یافته است. تعداد ردیف ها در هنگام جمع آوری آمار ۵۰۰ یا کمتر بوده و مقدار colmodctr ستون ابتدایی در آمار به بیش از ۵۰۰ افزایش یافته است. تعداد ردیف ها در هنگام جمع آوری آمار بیش از ۵۰۰ بوده و مقدار colmodctr ابتدایی در آمار به بیش از ۵۰۰ + ۲۰% از تعداد ردیف ها افزایش یافته است. به عنوان مثال در دیتابیس AdventureWorks جدول Sales.SaleOrderDetails دارای ۱۲۱۳۱۷ رکورد است در این صورت اگر به تعداد حاصل از فرمول زیر (۲۴۷۶۴) تغییر در این جدول اتفاق بیفتد (اعم از درج، حذف یا به روز رسانی به ازای هر ردیف (ممکن است یک دستور UPDATE به عنوان مثال اجرا شود اما همه رکورد ها را بروز کند)) Statistics روی این شیء به طور خودکار بروز می شود: (۱۲۱۳۱۷ * ۰.۲۰) + ۵۰۰ = ۲۴۷۶۴ کوئری زیر تعداد ۲۴۷۷۵ تغییر را اعمال کرده که باعث می شود آمار این جدول قدیمی محسوب شوند و تنها در زمان اجرای کوئری است که بروز رسانی خودکار آمار انجام می شود: BULK INSERT AdventureWorks2012.Sales.TestSalesOrderDetail FROM 'C:\SQLStuff\Statistics\Data\sod.txt' WITH ( DATAFILETYPE = 'native', TABLOCK ); (۲۴۷۷۵ row(s) affected) اگر پلن اجرای یک کوئری در cache باشد و کوئری مجدداً اجرا شود بروز بودن آمار چک می شود در صورت بروز نبودن پلن اجرا از cache حذف می شود و کوئری منتظر می ماند تا آمار بروز شده و پلن دوباره بر اساس آمار بروز شده ساخته می شود مگر اینکه گزینه Auto Update Statistics Async فعال باشد که در اینصورت کوئری بر اساس آمار قدیمی اجرا می شود (این پلن اصطلاحاً پلن SubOptimal نامیده می شود ) و در پس زمینه آمار بروز می شود در اجرای بعدی از آمار بروز برای ساخت پلن جدید استفاده شود. شیء آمار به ازای Table Variable ساخته نمی شود و تخمین تعداد رکورد ها در این جداول همیشه یک رکورد است! در صورتی که تعداد کمی رکورد در این جدول درج می شود مشکلی پیش نخواهد آمد اما اگر رکورد های زیادی درج شوند باید از گزینه Option (Recompile) استفاده شود تا کوئری پس از درج رکوردها دوباره بر اساس تعداد رکوردهای جدید compile شود. چه رتبه ای میدهید؟ میانگین ۵ / ۵. از مجموع ۱ اولین نفر باش معرفی نویسنده مقالات 18 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده تورج عزیزی معرفی محصول مسعود طاهری آموزش ۳ در ۱ 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 چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ حسن ضرابی ۲۶ / ۰۸ / ۹۶ - ۰۴:۳۵ با سلام و خسته نباشید خدمت جناب آقای مهندس تورج عزیزی جناب آقای مهندس از مقالات شما در این سایت بسیار ممنونم مقالات شما بسیار عالی هستند از بابت این مقاله مفید و ارزنده هم بسیار ممنونم. با تشکر از شما پاسخ به دیدگاه حسن ضرابی ۲۶ / ۰۸ / ۹۶ - ۰۴:۳۵ با سلام و خسته نباشید خدمت جناب آقای مهندس تورج عزیزی جناب آقای مهندس از مقالات شما در این سایت بسیار ممنونم مقالات شما بسیار عالی هستند از بابت این مقاله مفید و ارزنده هم بسیار ممنونم. با تشکر از شما پاسخ به دیدگاه سیامک محمدی ۲۵ / ۰۷ / ۹۴ - ۱۰:۴۲ بنده در سایت نیک آموز بطور مفصل تعریف آمار رو دیدم ولی جهت اشاره خلاصه به کارکرد آمار باید گفت، Query Optimizer از آمار پراکندگی برای انتخاب بهترین پلن برای اجرای کوئری استفاده میکنه. در واقع “آمار” نشانگر میزان توزیع داده در یک یا چند فیلد(ستون) هستند. حالا اگر Query Optimizer آماری از دادهها را در اختیار نداشته باشه قاعدتا راهی برای مقایسه کارایی پلنهای مختلف نخواهد داشت و لذا به سمت اسکن ساده جدول یا ایندکسها خواهد رفت و طبیعتا زمان بیشتری رو صرف اجرای کوئری خواهد نمود. پاسخ به دیدگاه MEHDI ۱۲ / ۰۷ / ۹۴ - ۰۲:۱۴ سلامضمن تشکر اگه موضوع یکم بازشه بیان بشه و از مقدمان بیشتر بگید ممنون میشم پاسخ به دیدگاه مهران رحمتی ۱۱ / ۰۷ / ۹۴ - ۰۳:۵۰ سلام ممنون ،بسیار عالی بود پاسخ به دیدگاه تورج عزیزی ۲۷ / ۰۵ / ۹۴ - ۰۹:۴۷ مقاله معرفی آمار در SQL Server رو ارسال کردم به زودی پس از تایید مدیریت محترم سایت در صفحه اول خواهید دید. پاسخ به دیدگاه غلامحسین عبادی ۲۶ / ۰۵ / ۹۴ - ۰۵:۳۸ ممنون عالی بود ولی می تونست کاملتر بیان بشه . مثلا در مورد پلن ها توضیح بیشتر می دادید . بازم ممنون پاسخ به دیدگاه tiyara9090@hotmail.com ۲۰ / ۰۵ / ۹۴ - ۰۷:۰۴ خیلی خوب بود ولی کاش یه کم در مورد پیشنیازاش اول می گفتین تا درکش بهتره بشه پاسخ به دیدگاه مجتبی شهریور ۲۰ / ۰۵ / ۹۴ - ۰۶:۰۱ سلامضمن تشکر فراوان از جناب آقای عزیزیهمانطور که خودتون در اول مقاله فرمودین پیش نیاز درک بهتر مقاله آشنایی با Statistics در SQL هست در صورت امکان یک لینک برای مطالعه این مبحث معرفی بفرمایید متشکرم پاسخ به دیدگاه ساناز احمدی ۱۹ / ۰۵ / ۹۴ - ۰۶:۰۳ سلامخیلی عالی بود خواهشا در صورت امکان منابع نقالات برای مطالعه بیشتر بیان بشه چون با تمام خوبی های که مقالات دوستان دارن ولی جای مطالعه بیشتر را داره پاسخ به دیدگاه 1 2