SARGability SQL Server بهینه‌سازی کوئری AdventureWorksDW Index Seek Execution Plan Table Scan آموزش SQL عملکرد پایگاه‌داده DBA

SARGability چیست؟

SARGability مخفف عبارت Search ARGument ABLE است و به شرایطی گفته می‌شود که SQL Server بتواند با استفاده از ایندکس، شرط‌های موجود در کوئری را ارزیابی کند.

به زبان ساده‌تر: اگر کوئری به گونه‌ای نوشته شده باشد که SQL بتواند از Index استفاده کند، آن کوئری SARGable است؛ در غیر این صورت ممکن است باعث Table Scan یا Index Scan شود که عملکرد را به شدت کاهش می‌دهد.

چرا SARGability اهمیت دارد؟

عبارات SARGable می‌توانند:

  • به SQL Server امکان دهند از Indexها بهینه استفاده کند (به‌جای اسکن کامل جدول‌ها)
  • زمان پاسخ‌گویی کوئری‌ها را به‌شدت کاهش دهند.
  • منابع سرور را بهینه کنند، خصوصاً در سیستم‌های با حجم داده بالا

عبارات غیر SARGable:

مثال‌های واقعی

استفاده از تابع روی ستون ایندکس‌شده

SELECT * FROM FactInternetSales WHERE YEAR(OrderDate) = 2024;

تابع YEAR() باعث می‌شود SQL نتواند از ایندکس روی OrderDate استفاده کند.

نسخه SARGable:

SELECT * FROM FactInternetSales 
WHERE OrderDate >= '2024-01-01' AND OrderDate < '2025-01-01';

استفاده از عملیات ریاضی روی ستون

SELECT * FROM DimProduct WHERE ListPrice * 1.2 > 1000;

نسخه بهینه‌شده:

SELECT * FROM DimProduct WHERE ListPrice > 833.33;

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

استفاده از توابع متنی

SELECT * FROM DimCustomer WHERE LEFT(LastName, 1) = 'A';

نسخه SARGable:

SELECT * FROM DimCustomer WHERE LastName LIKE 'A%';

عبارت LIKE با wildcard در انتها، به SQL Server اجازه استفاده از ایندکس را می‌دهد.

ابزارهای تحلیل SARGability

برای بررسی نوع دسترسی SQL به داده‌ها، می‌توان از این ابزارها استفاده کرد:

ابزار توضیحات
Execution Plan نمایش Index Seek، Scan یا Table Scan
Query Store مشاهده رفتار کوئری‌ها در طول زمان
Database Engine Tuning Advisor پیشنهاد ایندکس‌های مناسب
Extended Events ثبت رویدادهای عملکردی SQL

تکنیک‌های نگارشی برای کوئری‌های SARGable

اصل توضیح
اجتناب از توابع روی ستون‌ها توابع مثل UPPER, ISNULL, DATEPART را در شرط‌ها استفاده نکنید.
اجتناب از مقایسه‌های پیچیده <>, NOT IN, NOT LIKE معمولاً ایندکس را غیرفعال می‌کنند.
استفاده از محدوده‌های عددی یا تاریخی از BETWEEN یا محدوده‌های واضح استفاده کنید.
بهینه‌سازی پارامترهای ورودی در Stored Procedure کوئری‌های پارامتری معمولاً SARGable هستند.

کلید موفقیت: اجرای تست با Execution Plan

برای مقایسه نسخه‌های مختلف کوئری:

  1. گزینه “Include Actual Execution Plan” را در SSMS فعال کنید.
  2. نسخه SARGable و غیر SARGable را اجرا کنید.
  3. تفاوت نوع دسترسی و هزینه I/O را بررسی کنید.

نتیجه‌گیری

اگر هدف شما افزایش سرعت اجرای کوئری‌ها، کاهش بار سرور و ساخت کوئری‌های قابل نگهداری است، رعایت اصول SARGability ضروری است. با مثال‌هایی از AdventureWorksDW دیدیم که اصلاح ساده‌ی ساختار شرط‌ها می‌تواند تفاوت چشمگیری در عملکرد ایجاد کند.

تماس و مشاوره با لاندا

برای اطلاعات بیشتر و مشاوره می‌توانید از طریق زیر با ما در ارتباط باشید:

  • تماس  با شرکت لاندا برای مشاوره، اجرا و یا آموزش تخصصی.

بدون دیدگاه

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

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