برای مشاهده یافته ها از کلید Enter و برای خروج از کلید Esc استفاده کنید.

مقایسه هزینه دو کوئری

در این مقاله قصد داریم سه روش مختلف جهت مقایسه سرعت و هزینه دو کوئری را بررسی نماییم. این سه روش عبارتند از:

  • استفاده از Execution Plan
  • استفاده از Statistic IO و Statistic Time
  • استفاده از sys.dm_exec_sessions

استفاده از Execution Plan

در این روش ابتدا از بالای صفحه management studio گزینه Include Actual Execution Plan را فعال می کنیم(یا کلیدهای Ctrl + M را با هم می فشاریم) سپس دو کوئری مورد نظر خود را انتخاب و اجرا می کنیم:

-- Query 1 - return the maximum order id for a customer
SELECT CustomerID, SalesOrderID AS MaxSalesOrderID
FROM Sales.SalesOrderHeader AS s
WHERE SalesOrderID = (SELECT MAX(ss.SalesOrderID)
		      FROM Sales.SalesOrderHeader AS ss
		      WHERE ss.CustomerID = s.CustomerID)
ORDER BY s.CustomerID
GO
-- Query 2 - return the maximum order id for a customer
SELECT CustomerID, MAX(s.SalesOrderID) AS MaxSalesOrderID
FROM Sales.SalesOrderHeader AS s
GROUP BY s.CustomerID
ORDER BY s.CustomerID

Actual Execution Plan

همانطور که در عکس بالا مشخص است یک تب به تب های نتیجه به نام Execution Plan اضافه شده است که با کلیک کردن بر آن نتیجه مقایسه همراه با پلن هر دو کوئری قابل مشاهده است:

Compare Execution Plan

استفاده از Statistic IO و Statistic Time

روشی دیگر جهت مقایسه هزینه دو کوئری فعال کردن آمار IO و Time است که با دستور زیر می توان این کار را انجام داد:

SET STATISTICS IO ON 
SET STATISTICS TIME ON

با فعال کردن این آمار می توان کوئری های خود را در همان Session که آمار فعال شده است اجرا کرد و نتیجه را با هم در تب Message مقایسه کرد:

Compare Set Statistic

استفاده از sys.dm_exec_sessions

روش سوم که روش مورد علاقه خود من هست استفاده از sys.dm_exec_sessions است. روش بدین گونه است که دو صفحه New Query باز کرده و هر کدام ازکوئری ها را در یکی از آنها اجرا می کنیم و در Sessionی مجزا از این dmv استفاده و مقایسه را انجام می دهیم:

SELECT session_id,logical_reads,reads,writes,cpu_time,total_elapsed_time FROM sys.dm_exec_sessions WHERE session_id = 51
SELECT session_id,logical_reads,reads,writes,cpu_time,total_elapsed_time FROM sys.dm_exec_sessions WHERE session_id = 52

Compare dm_exec_sessions

در این روش می بایست Session_id هر کدام از صفحات New Query را در شرط قرار داد که در شکل بالا این موضوع نشان داده شده است.

دو نکته:

  • در روش اول می توان به جای Actual Execution Plan از Estimated Execution Plan استفاده کرد ولی ترجیحا استفاده از Actual اولویت دارد
  • روش اول و دوم یعنی استفاده از Execution Plan و Set Statistic بیشتر جهت یافتن قسمت های پر هزینه کوئری و بهینه کردن آن است ولی روش سوم صرفا جهت مقایسه دو کوئری است

نتیجه گیری:

مقایسه هزینه دو کوئری زمانی که بحث بهینه سازی کوئری مطرح می شود بسیار مهم است و نیاز است برای مقایسه کوئری جدید با کوئری قبلی خود حتما یکی از روش های بالا را مورد استفاده قرار داد و از کاهش هزینه کوئری جدید اطمینان حاصل کرد.


امیدوارم این آموزش برای خوانندگان گرامی مفید واقع شود. لطفا با ارائه نظرات ، سوالات و پیشنهادات خود به بالا بردن کیفیت مطالب آموزشی و همچنین ایجاد دلگرمی برای ادامه مسیر آموزش به ما کمک نمایید. همچنین می توانید با عضویت در کانال تلگرام IranSQL از جدیدترین مقالات و فیلم های آموزشی با خبر شوید.

اشتراک گذاری با دیگران
  •  
  •  
  •  
  •  
  •