عملگرهای cross applyو outer applyدر SQL Server:

عملگر apply مانند عملگر join برای ارتباط میان دو جدول سمت چپ/خارجی و سمت راست/درونی استفاده می شود.تفاوت این عملگر با عملگر join زمانی مشهود است، جدول سمت راست به ازای هر سطر از جدول سمت چپ مورد ارزیابی قرار می گیرد. در این مقاله به توضیح بیشتر این عملگر می پردازیم.

هنگامی که دو جدول بخواهند با هم در ارتباط باشند، ابتدا جدول سمت چپ به طور کامل پردازش می شود، سپس جدول سمت راست به ازای هر سطر از جدول سمت چپ بررسی می شود خروجی شامل ستون هایی از جدول سمت چپ است که با جدول سمت راست منطبق باشند.

عملگر apply شامل دو نوع cross apply ,outer apply می باشد. خروجی cross apply شامل ستون هایی از جدول سمت چپ می باشد که با ستون های جدول سمت راست همخوانی داشته باشند. به عبارت دیگر، جدول سمت راست سطرهایی را به عنوان خروجی بر می گرداند که با جدول سمت چپ هماهنگی داشته باشد. در حالی که outer apply سطرهای جدول سمت چپ را بر می گرداند، صرف نظر از اینکه با جدول سمت راست هم خوانی دارد. به عبارت بهتر برای مقادیری از جدول سمت راست که تطبیق وجود ندارد، در جدول سمت راست مقادیر null را داریم. می توانیم cross apply را به عنوان inner join(پیوند داخلی) و نیز outer apply را به عنوان left outer join (پیوند بیرونی سمت چپ) در نظر بگیریم.

حال ممکن است این سوال پیش آید که با وجود شباهت apply با عملگر join دلیل تعریف چنین مفهومی چیست؟ با وجود تشابه نیاز به تعریف این عملگر زمانی احساس می شود که جدولی در سمت راست داشته باشیم که تنها با کمک این عملگر بتوانیم سرعت اجرای query مورد نظر را بالا ببریم تا به نتیجه ی مطلوب برسیم. برای درک بیشتر این مفهوم می توانیم از چندین مثال زیر کمک بگیریم:

مثال اول) ما دو جدول Department وجدول Employee را داریم. هر کارمند متعلق به یک دپارتمان می باشد.

مثال دوم) با کمک عملگر cross apply جدول Employee را به ازای هر سطر از جدول Department بررسی می شود.هم چنین می خواهیم این نتیجه را از طریق join به طریق زیر داشته باشیم:

همان طور که می بینیم خروجی حاصل از این query ها یکسان می باشد و همچنین می توانیم یکسان بودن هزینه ی اجرا و نحوه ی اجرای این ۲ query را با استفاده از execution plan مشاهده نماییم. پیش از اینکه بخواهیم به تفسیر بیشتر در این باره بپردازیم ، درباره ی outer apply مثالی می زنیم.

مثال سوم) در این مثال می خواهیم اطلاعات جدول Department را با استفاده از outer apply که به ازای هر سطر از جدول Employee اجرا می شود، داشته باشیم. به ازای سطر هایی که جدول Employee با این جدول هم خوانی ندارد، مقادیر null را در این جدول داریم. در query دوم از left outer join استفاده می نماییم .این query تمامی سطرهای جدول Department را در خروجی بر می گرداند البته این خروجی شامل سطر هایی از جدول Employee که با این جدول هم خوانی ندارد، نیز هست.

با وجود اینکه خروجی هر دو query یکسان می باشد اما execution plan کمی متفاوت است. گرچه ممکن است هزینه ی اجرا تفاوت چندانی نداشته باشد، query حاویouter apply از عملگرcomputer scalar با هزینه ی تخمینی ۰٫۰۰۰۰۳۱ یا به عبارتی ۰% از هزینه ی کلی استفاده می نماید، پیش از اینکه عملگر حلقه های تو در تو به ارزیابی جدول Employee بپردازد.

مثال چهارم) در این مثال می خواهیم یک تابع تعریف کنیم که Department ID را به عنوان ورودی بپذیرد و تمامی کارمندان آن دپارتمان را در خروجی برگرداند. در این query می خواهیم اطلاعات جدول دپارتمان را با استفاده از cross apply با این تابع مرتبط نماییم. در query بعدی به جای cross apply می توان از outer apply استفاده نماییم با این تفاوت که به ازای سطرهایی که تطبیق وجود ندارد، مقادیر null را برمی گرداند.

هنگامی که به ازای cross apply , outer apply از inner join , outer join استفاده نماییم، نمی توانیم Department ID را محدود نماییم. اگر از join برای اجرا استفاده نماییم، عملکرد متفاوتی برای اجرای query بیرونی و اجرای تابع خواهیم داشت و قادر نخواهیم بود مقادیر query بیرونی را به عنوان پارامتر ورودی به تابع دهیم. هنگامی که بخواهیم از تابع و همچنین select های تو در تو در queryاستفاده کنیم می توانیم apply را به کار گیریم.

مثال پنجم) در این مثال می خواهیم از DMF استفاده نماییم. تمامی query های در حال اجرا را می توانیم با کد زیر ببینیم. ستون حاوی text همه ی query ها را به صورت دسته ای بر می گرداند. می توانیم با کمک statement_start_offset و نیز statement_end_offset کوئری فعال در حال اجرا را ببینیم.

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *