عملکرد Union و Union All در پایگاه داده های SQL Server

مشکل :

گاهی اوقات در یک مجموعه داده وسیع نیاز به ترکیب چندین جدول و یا چندین View وجود دارد. این امکان برای جداولی با داده‌های مشابه در یک پایگاه داده یکسان و یا اینکه وجود یک نیاز برای ترکیب داده‌های مشابه در میان پایگاه داده‌ها یا حتی در میان سرورها وجود دارد. در این مقاله به نحوه استفاده دستورهای Union در مقایسه با Union All و تفاوت‌های آنها خواهیم پرداخت.

راه حال :

در SQL SERVER ، توانایی ترکیب چندین پایگاه داده در یک پایگاه داده وسیع با استفاده از عملگرهای Union و Union All وجود دارد. تنها یک تفاوت بزرگ در نحوه کارایی آنها و مجموعه نتایج نهایی که برمی‌گردانند وجود دارد.

مختصری از تعاریف :

• Union : این عملگر به شما این اجازه را می‌دهد تا چندین مجموعه داده را در داخل یک مجموعه داده ترکیب کنید و تکراری‌ها را حذف خواهد کرد. به طور کلی، همانند عملگر DISTINCT بر روی تمامی ستون‌ها در مجموعه نتایج عمل می‌کند.

• Union All : این عملگر هم به شما اجازه می‌دهد تا چندین مجموعه داده را در داخل یک مجموعه داده ترکیب کنید، اما در اینجا هیچ سطر تکراری حذف نخواهد شد. این پردازش به دلیل پاک نکردن سطرهای تکراری سریع‌تر انجام می‌شود، اما اگر به سطرهای تکراری احتیاج ندارید بهتر است از عملگر Union استفاده کنید.

قوانین دستور Union :

 تعداد ستون‌های هر دستور باید یکسان باشند.

 ستون‌ها باید Data Type های یکسانی داشته باشند.

 اسامی ستون‌ها در مجموعه نتایج نهایی از دستور اول پیروی می‌کنند.

 عبارت‌های Order By و Compute تنها در مجموعه نتایج کل موثر می‌باشند و در داخل هر مجموعه نتیجه به صورت جداگانه کاربردی ندارند.

 عبارت‌های Group By و Having در هر مجموعه نتیجه به صورت مجزا کاربرد دارند و در مجموعه نتایج کل تاثیری ندارند.

اگر به طور دقیق ستون‌های مشابهی را در تمامی دستورات ندارید می‌توانید از ارزش‌های Null و یا Default همانند مثال‌های زیر استفاده کنید :

مثال‌هایی از UNION و UNION ALL :

ابتدا چند مثال ساده برای آشنایی با تفاوت و نحوه کار این دستورات می‌آوریم. همانطور که مشاهده خواهید کرد مجموعه نتایج نهایی متفاوت خواهند بود، در واقع در SQL SEREVER اطلاعات جالبی برای کامل کردن این پردازش‌ها وجود دارد.

UNION ALL

در مثال اول از عملگر UNION ALL در مقابل جدول Employee از پایگاه داده AdventureWorks استفاده شده است. احتمالا این چیزی نیست که انجام خواهید داد، اما این مثال برای توضیح تفاوت این دو عملگر کمک خواهد کرد.

۲۹۰ سطر در جدول dbo.Employee وجود دارد.

وقتی که این دستور اجرا می‌شود مجموع نتیجه شامل ۸۷۰ سطر می‌شود. تمامی ۲۹۰ سطر سه دفعه برگردانده می‌شوند. یعنی تمامی داده‌ها سه بار روی هم قرار می‌گیرند و در مجموع نتیجه نشان داده می‌شوند.

در اینجا Execution Plan برای این دستور آورده شده است. پس ما می‌توانیم مشاهده کنیم که این جدول سه بار فراخوانی شده و SQL SEREVER توسط یک Concatenation Step این سه دستور را به هم الحاق کرده است.

UNION

مثال بعدی استفاده از عملگر Union  دوباره در مقابل جدول Employee از پایگاه داده AdventureWorks را نشان می‌دهد.

هنگامی که این دستور اجرا می‌شود مجموعه نتایج شامل ۲۹۰ سطر می‌باشد. در حالیکه داده‌ها سه دفعه با هم ترکیب شده‌اند، عملگر Union سطرهای تکراری را حذف کرد و در نهایت تنها ۲۹۰ سطر منحصر به فرد را برگرداند.

در اینجا Execution Plan برای این دستور آورده شده است. می‌توانیم مشاهده کنیم که Sql Server در ابتدا دو جدول را اجرا می‌کند و با عمل Merge Join دو جدول را با هم ترکیب می‌کند و سپس یک Merge Join با جدول سوم انجام می‌دهد. بنابراین متوجه می‌شویم که در استفاده از عملگر Union در مقایسه با Union All برای بدست آوردن نتیجه، کارهای بیشتری انجام می‌گیرد.

مثالی از Union و Union All با جستجوی Clustered Index Column

اگر بخواهیم یک گام فراتر برویم و یک جستجوی Clustered Index Column را روی داده‌ها انجام دهیم، Execution Plan های زیر را خواهیم داشت. از Execution Plan ها می‌توان متوجه شد که SQL Server برای هر دو عملگرها به طور یکسان عمل می‌کند اما با این وجود مجموعه نتایج نهایی همچنان همان ۸۷۰ سطر در Union All و ۲۹۰ سطر در Union  می‌باشد.

Union ALL

مثالی از Union و Union All با جستجوی Non-Indexed Column

در اینجا مثال دیگری برای انجام چیزی مشابه اما این دفعه با استفاده از جستجوی Non-Indexed Column وجود دارد. همانطور که مشاهده می‌کنید Execution Plan ها دوباره به طور یکسان برای هر دو دستور عمل کرده است، اما این سری به جای استفاده از Merge Join از عملگرهای Sort و Concatenation استفاده کرده است.

1 پاسخ
  1. POURMAHBOOB
    POURMAHBOOB گفته:

    با سلام
    ضمن سپاس از توضیحات مفیدتون، متاسفانه کیفیت و اندازه تصاویر برای مشاهده اصلا مطلوب نیست

    پاسخ

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

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

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

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