Cardinality Estimator در SQL Server 2014

Cardinality Estimator در SQL Server 2014

نوشته شده توسط: سحر بیرامی
۱۵ آذر ۱۳۹۴
زمان مطالعه: 4 دقیقه
۱
(۱)

با یک مثال شروع می کنیم

ابتدا یک جدول ایجاد کرده و هزار رکورد در آن درج می کنیم و یک کوئری با شرط Where بر روی جدول اجرا می کنیم. Sql به صورت خودکار یک Statistic Column بواسطه شرطی که در کوئری گذاشتم ایجاد میکند . حال مسئله این است که اگر ما هر کوئری برای به دست آوردن زیر مجموعه ای از هزار رکورد اجرا کنیم ، Optimizer تعداد رکوردهای تخمینی را از روی Column Statistic به دست می آورد ( منظور همان Column Statistic ساخته شده هنگام اجرای اولین کوئری است ).

اگر ۵۰۰ رکورد دیگر به جدول اضافه کنیم ، statistic به علت محدودیت آستانه خود ، به طور خودکار بروز نمی شود( در واقع Sql تا زمانی که به حداکثر ظرفیت آستانه آمار و یا همان Statistic نرسیده باشد ، آن را بروز میکند) و اگر ما کوئری برای واکشی رکوردهای جدیدا اضافه شده اجرا کنیم ، با برآوردگر کاردینالیتی قدیم (قبل از ۲۰۱۴) تعداد رکوردهای تخمینی ۱ است ، چون که هیچ Statistic ای برای رکوردهای جدیدی که اضافه کردیم ، ساخته نشده است ولی اگر ما کوئری را با استفاده از کاردینالیتی جدید اجرا کنیم تعداد رکوردهای تخمینی نسبت به کاردینالیتی قدیم ، خیلی نزدیک به تعداد واقعی است.

این مسئله در واقع یک پیشرفت خوب محسوب میشود . (در افزایش سرعت کوئری ها تاثیر خوبی دارد ). مثال مطرح شده را قدم به قدم بررسی می کنیم : ابتدا یک جدول ایجاد کرده و هزار رکورد در آن درج می نمائیم و سپس یک کوئری برای به دست آوردن شناسه های کوچکتر از ۸۰۰ اجرا میکنیم ، خواهیم دید که یک Statistic ایجاد میشود.

حالا کوئری زیر را برای مشاهده نام statistics ایجاد شده بر روی ستون id اجرا می کنیم . این نام ممکن است در سیستم های مختلف متفاوت باشد.

نام statistics را در کوئری زیر جایگزین و کوئری را اجرا میکنیم ( همانطور که در تصویر مشخص شده است تعداد رکوردها را ۱۰۰۰ نمایش میدهد)

حالا کوئری برای درج ۵۰۰ رکورد دیگر اجرا می کنیم:

اگر بعد از درج ۵۰۰ رکورد ، هدر مربوط به Statistics را مجددا بررسی کنیم می بینیم که تعداد کل رکوردها همان مقدار قبلی است (هزار رکورد ) . علت این امر همان محدودیت آستانه Statistic است .

کوئری برای به دست اوردن رکوردهایی که جدیدی که اضافه کردیم همراه با Actual Execution Plan اجرا می کنیم . مورد جالبی که مشاهده میشود این است که Statistic چیزی راجع به رکوردهای جدبد اضافه شده نمیداند و تعداد رکوردهای تخمینی را یک بر میگداند.

تعداد رکوردهای تخمینی یک برگردانده میشود و این مسئله خوبی برای Performance محسوب نمیشود. حالا مشابه این کوئری را در CE جدید (در sql 2014 ) بررسی می کنیم:

مشاهده می کنید که تعداد رکوردهای تخمینی ۳۰۰ برگردانده شده و این به عدد واقعی نزدیکتر است.

چه رتبه ای می‌دهید؟

میانگین ۱ / ۵. از مجموع ۱

اولین نفر باش

دوره آموزش زبان برنامه نویسی GO
title sign
معرفی نویسنده
سحر بیرامی
مقالات
1 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
سحر بیرامی
پروفایل نویسنده
title sign
دیدگاه کاربران

    •    با سلام
      سایت بسیار خوبی  دارید

    •     بسیار مناسب و کاربردی و در عین حال روان و خوب توضیح داده شده بود

      با تشکر 
    • سلام

      تشکر از بابت ارائه این مقاله تون.
      بسیار جمع و جور و خلاصه و مفید بود… عالی..
      موفق باشید.
    •   جناب استاد طاهری
      سلام
      از راهنمایی ارزشمند حضرتعالی متشکرم

    •     سلام خانم بیرامی

      متشکرم از ارائه مقاله خوبتان در سایت 
      منتظر مقاله های بیشتر شما در نیک آموز هستیم
      موفق باشید
    •   سلام
      ضمن تشکر از مقاله خوبتون خانم بیرامی
      در کل مقاله حضرتعالی مقاله خوبی بود و نقطه قوت مقاله در کاربردی بودن مقاله هست ولی کاش قبل رفتن به سر مثال مقداری مقدمه و پیشگفتار داشت تا با یک زمینه فکری  خواننده مقاله به مثال و اصل موضوع ورود میکردد ودرک مقاله ملموس تر میشد…
      متشکرم

    •     مجتبی جان سلام

      درباره Cardinality Estimation در SQL Server در سایت چندین مقاله مفید ارائه شده است . دوستان عزیز برای کسب اطلاعات بیشتر در این خصوص به لینک های زیر مراجعه کنند.