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 ) بررسی می کنیم:

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

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

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

اولین نفر باش

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

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

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

      با تشکر 
    • سلام

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

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

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

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

      درباره Cardinality Estimation در SQL Server در سایت چندین مقاله مفید ارائه شده است . دوستان عزیز برای کسب اطلاعات بیشتر در این خصوص به لینک های زیر مراجعه کنند.
هر روز یک ایمیل، هر روز یک درس
آموزش SQL Server بصورت رایگان
همین حالا فرم زیر را تکمیل کنید
دانلود رایگان جلسه اول
نیک آموز علاوه بر آموزش، پروژه‌های بزرگ در حوزه هوش تجاری و دیتا انجام می‌دهد.
close-link