مفهوم IQP (Intelligent query processing) به مجموعه ویژگی هایی گفته میشه که به صورت هوشمند سعی دارند هزینه اجرا کوئری در SQL Server رو کاهش بدن، برخی از این قابلیت ها از نسخه 2017 ایجاد شدن و برخی مربوط به نسخه 2019 هستند، در این مطلب سعی میکنیم تمام این قابلیت ها رو عنوان کنیم و کم کم به شرح اونها بپردازیم .
لیست قابلیت ها :
با ایجاد یک کوئری پلن امکان استفاده از Hash Join یا Nested Loop Join را درون کوئری پلن به وجود میاره. یعنی با توجه به پارامترهای ورودی کوئری ، به صورت هوشمند تصمیم میگیره که این کوئری پلن رو با Hash Join اجرا کنه یا Nested Loop .
در حجم بالای دیتا گاهی نیاز به گرفتن Count با سرعت بالا وجود داره، حتی اگه عدد به دست اومده تقریبی باشه. این قابلیت دستور APPROX_COUNT_DISTINCT رو جایگزین COUNT(DISTINCT()) کرده. مثلا برای جدولی با 10 میلیارد رکورد ، در زمان کمتری نتیجه رو محاسبه میکنه.
مفهوم Batch Mode Processing از نسخه 2012 و همراه با کاربرد ایندکس های Column Store مطرح شد. در کل دو روش پردازش دیتا در SQL وجود داره Row Mode Execution و Batch Mode Execution . مدل Row mode همون مدل سنتی دیتابیس های RDBMS هست که سراغ تک تک رکورد ها میره و اونا رو استخراج و پردازش میکنن اما مدل Batch Mode گروهی از رکوردها رو باهم پردازش میکنه و فقط سراغ یک رکورد نمیره. (در Column stored index گروهی از رکوردها که مربوط به یک Column هستند )، قابلیت اضافه شده اخیر همچنین این امکان رو (پردازش فله ای) برای رکورد های ذخیره شده به صورت سنتی فراهم کرده .
یکی از مسائل بهینه سازی که همیشه در کوئری نویسی وجود داره، بکارگیری function داخل کوئریه. در صورتی که قرار باشه کوئری به طور مثال 1 میلیون رکورد رو استخراج کنه ، در شرایطی ممکنه 1 میلیون بار function فراخوانی بشه، که Performance پایینی خواهد داشت. ویژگی جدیدی که در نسخه 2019 افزوده شده، در شرایطی میتونه اینfunction ها رو به صورت inline درنظر بگیره. درواقع هنگام اجرا کوئری فرض میکنه کد نوشته شده داخل Function ، داخل کوئری اصلی وجود داره و فقط یکبار به function مراجعه میکنه. در ضمن به جدول سیستمی sys.sql_modulesستون is_inlineable افزوده شده که نشون میده کدوم یک از function ها قابلیت اجرا به صورت inline دارد.
در مواقعی اجرای بخشی از کوئری به صورت جداگانه و اجرا ادامه کوئری براساس نتیجه به دست اومده باعث بهبود کارایی و کاهش هزینه می شه. این روش در مقابل اجرا تمام کوئری به صورت یکپارچه میتونه کارایی بالاتری داشته باشه. این ویژگی در شرایطی به SQL Server قابلیت تفکیک کوئری به بخش های مجزا رو میده .
اجرا ء کوئری در صورتی که شامل عملیات های 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 ، امکان عملکرد بهتر در حدس زدن وضعیت دیتاهای موجود در متغیر و در نتیجه افزایش کارایی رو فراهم میکنه .
منبع :