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 دیدیم که اصلاح ساده‌ی ساختار شرط‌ها می‌تواند تفاوت چشمگیری در عملکرد ایجاد کند.

ارتباط و مشاوره

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

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

نظری داده نشده

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

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