مقایسه 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 استفاده کرده ولی در آخر نتیجه عملگر را مرتب می کند. چرا که مرتب کردن داده های نتیجه خیلی کم هزینه تر از مرتب کردن داده های جدول است.
شکل ۴
متخصص پایگاه داده 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
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود