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

یافتن پر هزینه ترین کوئری های در حال اجرا

تا به حال سرور دیتابیس شما کند شده یا مصرف منابع سرور بالا رفته است و در پی یافتن کوئری هایی که باعث بوجود آوردن این شرایط شده اند برآیید؟ در این مقاله یاد خواهیم گرفت که چگونه پر هزینه ترین کوئرهای در حال اجرای سرور دیتابیس خود را بر اساس (مصرف CPU ، زمان اجرا ، Physical IO  ، Logical IO و …) بدست آوریم. قبل از شروع ابتدا dvm کاربردی sys.dm_exec_requests را معرفی می کنیم و بعد از آن به سراغ یافتن کوئری های پرهزینه در حال اجرا می رویم.

  • معرفی sys.dm_exec_requests
  • یافتن کوئری های پرهزینه در حال اجرا

 

معرفی sys.dm_exec_requests

یکی از کاربردی ترین dvmهایی که حاوی اطلاعاتی از درخواست های در حال اجرا بر روی SQL Server است. این dmv شامل اطلاعات مفیدی از جمله:

  • Session_id (شماره سشن مربوط به درخواست)
  • start_time (زمان شروع درخواست)
  • staus (وضعیت درخواست)
  • database_id (شماره دیتابیس مربوط به درخواست)
  • wait_type (نوع انتظار)
  • wait_time (زمان انتظار تا به الان بر اساس میلی ثانیه)
  • cpu_time (زمان مصرف CPU تا به الان بر اساس میلی ثانیه)
  • total_elapsed_time (زمان اجرای درخواست تا به الان بر اساس میلی ثانیه)
  • reads (تعداد page های فیزیکی که تا الان برای اجرای درخواست از دیسک خوانده شده است)
  • Writes (تعداد page های فیزیکی که تا الان برای اجرای درخواست در دیسک نوشته شده است)
  • logical_reads (تعداد page های که در حافظه تا الان برای اجرای درخواست خوانده شده است)
  • و …

است که می توان با استفاده از آن براحتی کوئری های پرهزینه در حال اجرای سرور را یافت.

 

یافتن کوئری های پرهزینه در حال اجرا

با استفاده از کوئری زیر می توان پرهزینه ترین کوئری های در حال اجرا بر اساس مصرف CPU را مشاهده کرد:

SELECT r.session_id, DB_NAME(r.database_id) DatabaseName, t.text, r.start_time, r.status ,r.wait_type, r.wait_time, r.cpu_time, r.reads, r.writes, r.logical_reads, r.total_elapsed_time 
FROM sys.dm_exec_requests r
	 CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id <> @@SPID
ORDER BY cpu_time DESC

با تغییر order by کوئری بالا می توان کوئری های پرهزینه در حال اجرا را بر اساس زمان اجرا (total_elapsed_time) ، physical read (reads) ، physical write (writes) ، logical read  و … بدست آورد.

چند نکته:

  • فانکشن DB_NAME ورودی id دیتابیس را می گیرد و خروجی نام دیتابیس را بر می گرداند
  • sys.dm_exec_sql_text یک dmf است که می توان ورودی به آن sql_handle را داد و خروجی متن کوئری را تحویل گرفت
  • شرط مخالف spid@@ به این جهت نوشته شده است که خود کوئری بالا در لیست کوئری های در حال اجرا قرار نگیرد

 

نتیجه گیری:

همانطور که در ابتدای مقاله بیان شد خیلی از مواقع سرور دیتابیس کند می شود یا مصرف منابع سرور به شدت بالا می رود (مثلا CPU Usage بسیار بالاست) در این مواقع نیاز است بررسی شود که چه کوئری هایی بیشترین مصرف منابع را دارند که با کوئری بالا به راحتی می توان به این مهم دست یافت. یکی دیگر از کاربردهای کوئری بالا بررسی وضعیت کوئری در حال اجرای خود است. فرض کنید یک کوئری اجرا کرده اید و می خواهید وضعیت استفاده کوئری خود از منابع و یا مدت زمان انتظار و نوع آن را بررسی کنید که باز می توانید با نوشتن شرط مناسب وضعیت کوئری خود را مشاهده نمایید.


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

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