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
برای مقایسه نسخههای مختلف کوئری:
- گزینه “Include Actual Execution Plan” را در SSMS فعال کنید.
- نسخه SARGable و غیر SARGable را اجرا کنید.
- تفاوت نوع دسترسی و هزینه I/O را بررسی کنید.
نتیجهگیری
اگر هدف شما افزایش سرعت اجرای کوئریها، کاهش بار سرور و ساخت کوئریهای قابل نگهداری است، رعایت اصول SARGability ضروری است. با مثالهایی از AdventureWorksDW دیدیم که اصلاح سادهی ساختار شرطها میتواند تفاوت چشمگیری در عملکرد ایجاد کند.
ارتباط و مشاوره
برای اطلاعات بیشتر و مشاوره میتوانید از طریق زیر با ما در ارتباط باشید:
نظری داده نشده