نیما جمشیدی
نیما جمشیدی
خواندن ۳ دقیقه·۴ سال پیش

مفهوم Intelligent query processing در SQL Server

مفهوم IQP (Intelligent query processing) به مجموعه  ویژگی هایی گفته میشه که به صورت هوشمند سعی دارند هزینه اجرا کوئری در SQL Server  رو کاهش بدن، برخی از این قابلیت ها از نسخه 2017 ایجاد شدن و برخی مربوط به نسخه 2019 هستند، در این مطلب سعی میکنیم تمام این قابلیت ها رو عنوان کنیم و کم کم به شرح اونها بپردازیم .


لیست قابلیت ها :

Adaptive Joins

با ایجاد یک کوئری پلن امکان استفاده از Hash Join  یا Nested Loop Join را درون کوئری پلن به وجود میاره. یعنی با توجه به پارامترهای ورودی کوئری ، به صورت هوشمند تصمیم میگیره که این کوئری پلن رو با Hash Join  اجرا کنه یا Nested Loop .

Approximate Count Distinct

در حجم بالای دیتا گاهی نیاز به گرفتن Count  با سرعت بالا وجود داره، حتی اگه عدد به دست اومده تقریبی باشه. این قابلیت دستور APPROX_COUNT_DISTINCT رو جایگزین COUNT(DISTINCT()) کرده.  مثلا برای جدولی با 10 میلیارد رکورد ، در زمان کمتری نتیجه رو محاسبه میکنه.

Batch Mode on Rowstore

مفهوم Batch Mode Processing   از نسخه 2012 و همراه با کاربرد ایندکس های Column Store  مطرح شد. در کل دو روش پردازش دیتا در SQL وجود داره  Row Mode Execution  و    Batch Mode Execution .  مدل Row mode  همون مدل سنتی دیتابیس های RDBMS هست که سراغ تک تک رکورد ها میره و اونا رو استخراج و پردازش میکنن اما مدل Batch Mode  گروهی از رکوردها رو باهم پردازش میکنه  و فقط سراغ یک رکورد نمیره. (در Column stored index  گروهی از رکوردها که مربوط به یک Column  هستند )، قابلیت اضافه شده اخیر همچنین این امکان رو (پردازش فله ای) برای رکورد های ذخیره شده به صورت سنتی فراهم کرده .

Scalar UDF Inlining

یکی از مسائل بهینه سازی که همیشه در کوئری نویسی وجود داره، بکارگیری function   داخل کوئریه. در صورتی که قرار باشه کوئری به طور مثال 1 میلیون رکورد رو استخراج کنه ، در شرایطی ممکنه 1 میلیون بار function  فراخوانی بشه، که Performance پایینی خواهد داشت.  ویژگی جدیدی که در نسخه 2019 افزوده شده، در شرایطی میتونه اینfunction  ها رو به صورت inline  درنظر بگیره. درواقع هنگام اجرا کوئری فرض میکنه کد نوشته شده داخل Function ، داخل کوئری اصلی وجود داره و فقط یکبار به function  مراجعه میکنه.  در ضمن به جدول سیستمی  sys.sql_modulesستون is_inlineable  افزوده شده که نشون میده کدوم یک از function  ها قابلیت اجرا به صورت inline دارد.

Interleaved Execution

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

Memory Grant Feedback

اجرا ء کوئری در صورتی که شامل عملیات های sort و hash join  باشه نیاز به مموری جهت نگهداری رکوردها داره که   SQL Server میزان مموری لازم برای انجام این عملیات رو حدس میزنه و بهمون میزان مموری allocate  میکنه ( Granted Memory ) .  گاهی پیش میاد که میزان مموری allocate شده اشتباه باشه، در صورت کم بودن مموری، کوئری برای اجرا سراغ tempdb  میره و از دیسک کمک می گیره که کارایی پایینی داره. در بخش  MemoryGrantInfo مربوط به جزئیاتQuery plan.  علاوه بر  Granted Memory پارامتر جدیدی با عنوان IsMemoryGrantFeedbackAjusted  اضافه شده که میتونه مقادیر :   No : First time   ,      Yes: adjusting ,    Yes:Stable  رو داشته باشه .

قابلیت افزوده شده این امکان رو میده تا درصورتی که در دفعات بعدی اجرا کوئری، شرایط اجرا عوض شد  و میزان مموری مورد نیاز کوئری تغییر شدیدی کرد (کاهش یا افزایش )، SQL Server به صورت خودکار این رو تشخیص بده و برای دفعات بعد مموری  allocate  شده  رو اصلاح کنه.  به این معنی خواهد بود که بار اول اجرا کوئری با شرایط جدید، همچنان کندی خواهیم داشت اما با تشخیص  No : First time  اقدام به اصلاح مموری کرده و دفعات بعد مشکل کندی حل میشه .

Table Variable Deferred Compilation

این قابلیت با بهبود اجرا کوئری های شامل Table Variable ، امکان عملکرد بهتر در حدس زدن وضعیت دیتاهای موجود در متغیر و در نتیجه افزایش کارایی رو فراهم میکنه .

منبع :

docs.microsoft.com

sql serverپایگاه دادهپردازشهوشمندکوئری
مدیر پایگاه داده در ایپاد
شاید از این پست‌ها خوشتان بیاید