تفاوت Stream Aggregate و Hash Match در چیست؟

مقایسه Stream Aggregate و Hash Match در SQL سرور : توابع Aggregate مانند SUM, AVG, COUNT و غیره در Query های ما بسیار دیده می شوند. در SQL Server دو روش متفاوت برای بازیابی و انجام عملیات تابعی وجود دارد که یکی Stream Aggregate و دیگری Hash Match نام دارند. در این پست می خواهیم به اتفاق نوع انتخاب یکی یا هر دو روش توسط SQL Server را بررسی کنیم.به صورت پایه ای. هر Query که اجراء می شود از یک سری عملیات خاصی باید گذارنده شود که این عملیات شامل Parsing, Algebrizer, Query Optimizer, Query Executor است.SQL Server در زمان محدودی باید بهترین Execution Plan را از طریق بررسی Statistics ها پیدا کند.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

Statistics تعداد رکوردهای داخل هر جدول را با مقدار آن ذخیره می کند. توجه داشته باشید که یک فرمولی برای انتخاب عاملان انجام توابع وجود دارد. بگذارید با این دستور شروع کنیم Select Count(*) From Tempdata این دستور برای اجراء از Stream Aggregate استفاده می کند به این دلیل که جدول منبع یک جدول با حجم متوسط است و البته اینکه دستور Group By استفاده نشده است. پس در این حالت Query Optimizer تمامی رکوردهای جدول را در یک گروه قرار می دهد. به شکل زیر توجه کنید.

وب سایت توسینسو

شکل ۱

حالا در Query بالا ما دستور Group By GroupID را اضافه می کنیم که این دستور باعث می شود Query Optimizer یک عملیات Sort قبل از عملیات Stream Aggregate قرار دهد به این دلیل که داده های Build در Stream Aggregate باید به صورت مرتب چیده شده باشند. دستور Stream Aggregate به این صورت عمل می کند که داده های ورودی باید مرتب باشند و بعد رکورد اول خوانده می شود و بعد رکورد دوم. اگر رکورد دوم در یک گروه با رکورد قبلی بود مقدار آنها را با هم در یک گروه قرار می دهد اگر در یک گروه نبودند برای رکورد جدید یک گروه تشکیل می دهد.

وب سایت توسینسو

شکل ۲

حالا ما سعی در اضافه کردن رکوردهای جدول داریم ولی این کار را به صورت فیزیکی انجام نمی دهیم بلکه به طوری SQL Server Query Optimizer را گول می زنیم.در حال حاضر ۱۰۰ میلیون رکورد داخل جدول است و ما Select Count(*) From Tempdata Group By GroupID را اجراء می کنیم. همانطور که در شکل زیر می بینید Query Optimizer به دلیل حجم زیاد رکوردها از Hash Match استفاده کرده به این دلیل که مرتب کردن جدول به مراتب هزینه بردار تر از عملیات Hash است.

وب سایت توسینسو

شکل ۳

حالا زمان آن رسیده که هوش Query Optimizer را بسنجیم با اضافه کردن دستور Order By. همانطور که در شکل زیر مشاهده می کنید باز هم Query Optimizer از عملگر Hash Match استفاده کرده ولی در آخر نتیجه عملگر را مرتب می کند. چرا که مرتب کردن داده های نتیجه خیلی کم هزینه تر از مرتب کردن داده های جدول است.

وب سایت توسینسو

شکل ۴

در ذهن داشته باشید که عمگر Hash Match هزینه بسیار بالایی دارد و اجرای آن برای جداول کوچک به صرفه نیست.


حمید ج. فرد
حمید ج. فرد

متخصص پایگاه داده SQL Server Microsoft Certified Master: SQL Server 2008 Microsoft Certified Solutions Master: Charter - Data Platform Microsoft Certified Solutions Expert: Data Platform Microsoft Certified Solutions Associate: SQL Server 2012 Microsoft Certified IT Professional Microsoft Certified Technology Specialist Microsoft Certified Professional Developer Microsoft Certified Trainer CIW Database Design Specialist

نظرات