آموزش ALTER INDEX ALL در SQL Server با مثال عملی و نکات Performance

آموزش ALTER INDEX ALL در SQL Server

توسط admin | گروه SQL Server | 1405/04/31

نظرات 0

آموزش ALTER INDEX ALL در SQL Server

مقدمه

کلمه ALL به ALTER INDEX اجازه می‌دهد عملیات پشتیبانی‌شده را روی همه ایندکس‌های یک جدول اجرا کند. این قابلیت برای مدیریت گروهی ساده است، اما تفاوت اندازه، Fragmentation، Fill Factor و اهمیت هر ایندکس را پنهان می‌کند.

در این راهنما فرمان ALTER INDEX ALL از Syntax پایه تا کنترل خطا، پایش، سناریوی سازمانی و تصمیم کارایی بررسی می‌شود. همه مثال‌ها برای Microsoft SQL Server نوشته شده‌اند و پیش از استفاده در تولید باید با نام اشیا، نسخه و Edition محیط شما تطبیق داده شوند.

بازگشت به راهنمای جامع دستورات نگهداری ایندکس در SQL Server

تعریف، نحو و اجزای فرمان

کلمه ALL به ALTER INDEX اجازه می‌دهد عملیات پشتیبانی‌شده را روی همه ایندکس‌های یک جدول اجرا کند. این قابلیت برای مدیریت گروهی ساده است، اما تفاوت اندازه، Fragmentation، Fill Factor و اهمیت هر ایندکس را پنهان می‌کند.

Syntax استاندارد

ALTER INDEX ALL
    ON [schema_name].[table_name]
    REBUILD
    WITH (SORT_IN_TEMPDB = ON, MAXDOP = 2);
    

پارامترها و پیش‌نیازها

  • ALL دامنه را به تمام ایندکس‌های جدول گسترش می‌دهد.
  • نوع عملیات می‌تواند REBUILD، REORGANIZE یا در سناریوی پرریسک DISABLE باشد.
  • گزینه‌های WITH برای همه اعضای دامنه اعمال می‌شوند.
  • PARTITION می‌تواند عملیات گروهی را محدود کند.

نوع خروجی

خروجی جدولی ندارد و هر خطا می‌تواند Batch گروهی را متوقف کند. Catalog و لاگ نگهداری برای کنترل نتیجه لازم‌اند.

کاربرد واقعی

برای جدول‌های کوچک یا Stage Tableهای کنترل‌شده مفید است، ولی در سامانه بزرگ باید با گزارش هزینه و تأیید اجرا شود.

در محیط عملیاتی، فرمان باید در یک Change کنترل‌شده اجرا شود. ظرفیت فایل داده و لاگ، نقش سرور، Replicaها، قفل‌های جاری و بازه اوج مصرف پیش از اقدام ثبت شوند. اجرای موفق فنی بدون ارزیابی اثر بر کاربران، معیار کافی برای پایان کار نیست.

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

مثال 1: بازسازی همه ایندکس‌های جدول آزمایشی

دو ایندکس ساخته و با یک فرمان ALL بازسازی می‌شوند.

DROP TABLE IF EXISTS #IndexLab;
    CREATE TABLE #IndexLab
    (
        RowID int IDENTITY(1,1) NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        Amount decimal(12,2) NOT NULL
    );

    INSERT INTO #IndexLab (OrderDate, CustomerID, Amount)
    VALUES ('2026-01-01', 101, 125000),
           ('2026-01-02', 102, 98000),
           ('2026-01-03', 101, 143500);

    CREATE INDEX IX_IndexLab_OrderDate
    ON #IndexLab (OrderDate);
    CREATE INDEX IX_IndexLab_CustomerID ON #IndexLab(CustomerID);

    ALTER INDEX ALL ON #IndexLab REBUILD;
    SELECT name, is_disabled FROM tempdb.sys.indexes WHERE object_id = OBJECT_ID(N'tempdb..#IndexLab') AND index_id > 0;
    
شاخصخروجی نمونهتوضیح
IX_IndexLab_OrderDate0نتیجه نمایشی
IX_IndexLab_CustomerID0نتیجه نمایشی

ALL کدنویسی را کوتاه می‌کند اما هزینه همه ساختارها را یکسان تحمیل می‌کند.

مثال 2: Reorganize همه ایندکس‌ها

برای جدول کوچک آزمایشی تمام ایندکس‌ها به صورت آنلاین مرتب می‌شوند.

DROP TABLE IF EXISTS #IndexLab;
    CREATE TABLE #IndexLab
    (
        RowID int IDENTITY(1,1) NOT NULL,
        OrderDate date NOT NULL,
        CustomerID int NOT NULL,
        Amount decimal(12,2) NOT NULL
    );

    INSERT INTO #IndexLab (OrderDate, CustomerID, Amount)
    VALUES ('2026-01-01', 101, 125000),
           ('2026-01-02', 102, 98000),
           ('2026-01-03', 101, 143500);

    CREATE INDEX IX_IndexLab_OrderDate
    ON #IndexLab (OrderDate);
    CREATE INDEX IX_IndexLab_CustomerID ON #IndexLab(CustomerID);

    ALTER INDEX ALL ON #IndexLab REORGANIZE;
    
شاخصخروجی نمونهتوضیح
ActionREORGANIZE ALLنتیجه نمایشی

اگر بعضی ایندکس‌ها نیاز متفاوت داشته باشند، فرمان جداگانه دقیق‌تر است.

مثال 3: بازسازی ALL با گزینه‌های مشترک

MAXDOP و SORT_IN_TEMPDB برای تمام ایندکس‌های جدول اعمال می‌شود.

ALTER INDEX ALL ON dbo.Sales
    REBUILD WITH
    (
        SORT_IN_TEMPDB = ON,
        MAXDOP = 2,
        FILLFACTOR = 95
    );
    
شاخصخروجی نمونهتوضیح
MAXDOP2نتیجه نمایشی
FILLFACTOR95نتیجه نمایشی

یک Fill Factor مشترک برای همه ایندکس‌ها همیشه مناسب نیست؛ الگوی کلیدها ممکن است متفاوت باشد.

مثال 4: اندازه‌گیری هزینه پیش از ALL

مجموع صفحات و تعداد ایندکس‌ها برای برآورد فضا و زمان گزارش می‌شود.

SELECT
        IndexCount = COUNT(DISTINCT index_id),
        TotalPages = SUM(page_count),
        EstimatedSizeMB = SUM(page_count) * 8.0 / 1024
    FROM sys.dm_db_index_physical_stats
        (DB_ID(), OBJECT_ID(N'dbo.Sales'), NULL, NULL, 'LIMITED')
    WHERE index_id > 0;
    
شاخصخروجی نمونهتوضیح
IndexCount7نتیجه نمایشی
TotalPages485000نتیجه نمایشی
EstimatedSizeMB3789.06نتیجه نمایشی

برآورد اندازه قبل از ALL از رشد ناگهانی لاگ یا کمبود فضای SORT_IN_TEMPDB جلوگیری می‌کند.

مثال 5: عملیات روی یک Partition برای همه ایندکس‌ها

در جدول پارتیشن‌بندی‌شده، Partition هدف در تمام ایندکس‌های هم‌تراز بازسازی می‌شود.

ALTER INDEX ALL ON dbo.FactSales
    REBUILD PARTITION = 12
    WITH (SORT_IN_TEMPDB = ON, MAXDOP = 2);
    
شاخصخروجی نمونهتوضیح
Partition12نتیجه نمایشی
ScopeALL indexesنتیجه نمایشی

هم‌ترازی ایندکس‌ها و پشتیبانی گزینه‌ها را قبل از اجرای Partition-level بررسی کنید.

مثال 6: جلوگیری از ALL هنگام ورودی NULL

نام جدول الزامی است و از ساخت Dynamic SQL ناقص جلوگیری می‌شود.

DECLARE @Schema sysname = N'dbo',
            @Table sysname = NULL;

    IF NULLIF(LTRIM(RTRIM(@Table)), N'') IS NULL
        THROW 51030, N'نام جدول برای ALTER INDEX ALL الزامی است.', 1;
    
شاخصخروجی نمونهتوضیح
ResultControlled error 51030نتیجه نمایشی

هرگز NULL را به معنی همه جدول‌های پایگاه داده تفسیر نکنید.

مثال 7: گزارش ایندکس‌های Disable پیش از ALL

ساختارهای غیرفعال جدا می‌شوند تا اثر REBUILD ALL روشن باشد.

SELECT name, type_desc, is_disabled
    FROM sys.indexes
    WHERE object_id = OBJECT_ID(N'dbo.Sales')
      AND index_id > 0
    ORDER BY index_id;
    
شاخصخروجی نمونهتوضیح
Indexis_disabledنتیجه نمایشی
IX_Sales_Date1نتیجه نمایشی
IX_Sales_Customer0نتیجه نمایشی

REBUILD ALL می‌تواند ایندکس‌های غیرفعال را فعال کند؛ این اثر باید از پیش تأیید شده باشد.

مثال 8: ثبت عملیات گروهی

آمار همه ایندکس‌ها پیش از عملیات Snapshot و سپس نتیجه گروهی ثبت می‌شود.

INSERT dbo.IndexMaintenanceSnapshot
        (CapturedAt, ObjectID, IndexID, Fragmentation, PageCount)
    SELECT
        SYSDATETIME(), object_id, index_id,
        avg_fragmentation_in_percent, page_count
    FROM sys.dm_db_index_physical_stats
        (DB_ID(), OBJECT_ID(N'dbo.Sales'), NULL, NULL, 'SAMPLED');

    ALTER INDEX ALL ON dbo.Sales REBUILD;

    SELECT N'Completed' AS BatchState;
    
شاخصخروجی نمونهتوضیح
BatchStateCompletedنتیجه نمایشی

Snapshot پیش از عملیات امکان مقایسه و ممیزی نتیجه را فراهم می‌کند.

مثال 9: اصلاح استفاده کورکورانه از ALL

اگر فقط یک ایندکس Fragmentation بالا دارد، همان ایندکس هدف قرار می‌گیرد.

SELECT
        i.name,
        ips.avg_fragmentation_in_percent,
        ips.page_count
    FROM sys.dm_db_index_physical_stats
        (DB_ID(), OBJECT_ID(N'dbo.Sales'), NULL, NULL, 'LIMITED') AS ips
    JOIN sys.indexes AS i
      ON i.object_id = ips.object_id
     AND i.index_id = ips.index_id
    WHERE ips.page_count >= 1000
      AND ips.avg_fragmentation_in_percent >= 30;
    
شاخصخروجی نمونهتوضیح
IndexFragmentationنتیجه نمایشی
IX_Sales_Date38.20نتیجه نمایشی

نتیجه نشان می‌دهد چرا هدف‌گیری یک ایندکس می‌تواند از REBUILD ALL کم‌هزینه‌تر باشد.

مثال 10: مقایسه کارایی سیاست گروهی و انتخابی

زمان تاریخی اجرای ALL با مجموع عملیات انتخابی مقایسه می‌شود.

SELECT
        Strategy,
        AvgDurationSeconds = AVG(DurationSeconds),
        AvgLogGrowthMB = AVG(LogGrowthMB)
    FROM dbo.IndexMaintenanceHistory
    WHERE TableName = N'dbo.Sales'
      AND StartedAt >= DATEADD(day, -90, SYSDATETIME())
    GROUP BY Strategy;
    
شاخصخروجی نمونهتوضیح
StrategyAvgDurationLogGrowth
ALL12807420
SELECTIVE4101860

داده تاریخی بهترین راه برای اثبات سود یا زیان سیاست ALTER INDEX ALL است.

ملاحظات Performance

REBUILD ALL ممکن است مصرف Log، tempdb و CPU بسیار زیادی ایجاد کند، حتی وقتی بیشتر ایندکس‌ها سالم هستند. سیاست انتخابی معمولاً برای جدول‌های بزرگ اقتصادی‌تر است.

برای اندازه‌گیری معتبر، زمان Queryهای منتخب، Logical Read، Waitها و رشد Transaction Log را در یک بازه کاری مشابه مقایسه کنید. Cache گرم یا سرد، اجرای هم‌زمان Jobها و تغییر حجم داده می‌تواند نتیجه را منحرف کند؛ بنابراین یک نمونه منفرد مبنای تصمیم بلندمدت نیست.

خطاهای رایج

  • اجرای ALL روی جدول بزرگ بدون برآورد.
  • یک Fill Factor برای ساختارهای متفاوت.
  • Disable همه ایندکس‌ها بدون برنامه بازیابی.
  • نادیده گرفتن ایندکس‌های Constraint.
  • فرض سازگاری ALL با تمام عملیات Resumable.

بهترین روش‌ها

  • پیش از ALL اندازه کل را محاسبه کنید.
  • اثر روی ایندکس‌های Disable را بررسی کنید.
  • برای جدول بزرگ سیاست انتخابی بسازید.
  • عملیات را در پنجره و MAXDOP محدود اجرا کنید.

اسکریپت نگهداری را در کنترل نسخه قرار دهید، برای آن Owner مشخص کنید و خروجی اجرا را قابل جست‌وجو نگه دارید. عملیات بدون مالک و هشدار ممکن است نیمه‌تمام یا فراموش شود.

سؤالات متداول

سؤال متداول 1: ALTER INDEX ALL دقیقاً چه کاری انجام می‌دهد؟

این فرمان بخشی از چرخه مدیریت فیزیکی یا چرخه عمر ایندکس است. اثر دقیق آن به نوع فرمان، نوع ایندکس و State فعلی بستگی دارد؛ بنابراین پیش از اجرا Catalog Viewها و مستند نسخه نصب‌شده را بررسی کنید.

سؤال متداول 2: آیا ALTER INDEX ALL برای افراد مبتدی مناسب است؟

یادگیری Syntax ساده است، اما اجرای تولیدی نیازمند شناخت قفل، Log، tempdb، Availability و برنامه بازگشت است. ابتدا روی پایگاه آزمایشی و نسخه پشتیبان تمرین کنید.

سؤال متداول 3: هزینه اجرای ALTER INDEX ALL چگونه برآورد می‌شود؟

اندازه ایندکس، page_count، نرخ تغییر داده، سرعت ذخیره‌ساز، مدت پنجره و رشد لاگ را اندازه بگیرید. برای برآورد دقیق‌تر می‌توان از خدمات مشاوره و تحلیل کارایی SQL Server استفاده کرد.

سؤال متداول 4: آیا اجرای ALTER INDEX ALL می‌تواند سرعت سامانه را بیشتر کند؟

ممکن است، اما تضمینی نیست. بهبود تنها وقتی رخ می‌دهد که مشکل واقعی با ساختار ایندکس مرتبط باشد؛ Query Store و معیارهای قبل و بعد باید اثر را ثابت کنند.

سؤال متداول 5: تفاوت ALTER INDEX ALL با فرمان‌های نزدیک چیست؟

REBUILD ساختار را دوباره می‌سازد، REORGANIZE مرتب‌سازی تدریجی است، DISABLE استفاده را متوقف می‌کند، DROP حذف دائمی است و PAUSE، RESUME و ABORT چرخه عملیات Resumable را مدیریت می‌کنند.

سؤال متداول 6: برای اجرای سازمانی ALTER INDEX ALL چه خدماتی لازم است؟

طراحی Job، پایش، گزارش خطا، آزمون بازیابی و تنظیم آستانه‌ها بخش‌های اصلی هستند. تیم آموزش یا مشاوره پایگاه داده می‌تواند اسکریپت را با SLA و معماری همان سازمان هماهنگ کند.

سؤال متداول 7: خطای رایج در ALTER INDEX ALL چیست؟

اجرای فرمان با نام یا State نامعتبر، کمبود فضا، محدودیت Edition، قفل Schema و فراموش کردن وابستگی‌ها از خطاهای رایج‌اند. ERROR_NUMBER و ERROR_MESSAGE را ثبت و خطا را دوباره THROW کنید.

سؤال متداول 8: ALTER INDEX ALL چه اثری بر Performance دارد؟

اثر می‌تواند هم مثبت و هم منفی باشد. CPU، I/O، Waitها، رشد Log و زمان Queryهای مهم را در بازه‌ای قابل مقایسه ثبت کنید و به یک درصد Fragmentation اکتفا نکنید.

سؤال متداول 9: Best Practice اجرای ALTER INDEX ALL چیست؟

دستور را هدفمند، تکرارپذیر، قابل ثبت و دارای Guard Clause بنویسید. نام اشیا در Dynamic SQL باید از Catalog اعتبارسنجی و با QUOTENAME محافظت شود.

سؤال متداول 10: ALTER INDEX ALL در کدام نسخه‌های SQL Server کار می‌کند؟

Syntax پایه بسیاری از فرمان‌ها قدیمی است، ولی گزینه‌هایی مانند IF EXISTS، ONLINE، WAIT_AT_LOW_PRIORITY و RESUMABLE در نسخه‌ها و Editionهای متفاوت عرضه شده‌اند. سازگاری دقیق را با نسخه سرور و مستندات همان نسخه کنترل کنید.

سؤالات مصاحبه SQL Server

سؤال مصاحبه 1: چه زمانی ALTER INDEX ALL را در Production اجرا می‌کنید؟

پاسخ خوب باید به اندازه ایندکس، بار کاری، SLA، ظرفیت Log، قفل‌ها و معیار قبل و بعد اشاره کند، نه فقط یک آستانه ثابت.

سؤال مصاحبه 2: چگونه ریسک Dynamic SQL را کاهش می‌دهید؟

نام‌ها از sys.indexes و sys.objects اعتبارسنجی می‌شوند، QUOTENAME اعمال می‌شود و مقادیر داده‌ای با sp_executesql پارامتری می‌شوند.

سؤال مصاحبه 3: چگونه موفقیت عملیات را ثابت می‌کنید؟

با ثبت زمان، State، Fragmentation، page_count، رشد Log و معیارهای Query Store در قبل و بعد، نتیجه قابل دفاع می‌شود.

سؤال مصاحبه 4: تفاوت نگهداری ایندکس و Update Statistics چیست؟

ساختار فیزیکی و توزیع آماری دو مسئله مرتبط ولی جدا هستند. Rebuild معمولاً آمار ایندکس را تازه می‌کند، Reorganize نیاز به تصمیم جدا برای Statistics دارد.

سؤال مصاحبه 5: در Availability Group چه چیزی مهم است؟

حجم Log تولیدشده، نرخ ارسال و Redo در Replicaها، فضای دیسک و مدت پنجره باید هم‌زمان پایش شوند.

چک‌لیست نهایی

  1. نسخه، Edition و پشتیبانی Syntax کنترل شده است.
  2. نام Schema، جدول و ایندکس از Catalog تأیید شده است.
  3. فضای داده، tempdb و Transaction Log بررسی شده است.
  4. معیارهای پیش از اجرا ثبت شده‌اند.
  5. TRY/CATCH، لاگ و مسیر بازگشت آماده است.
  6. نتیجه و اثر کارایی پس از اجرا مقایسه می‌شود.

خدمات برنامه‌نویسی و پایگاه داده

برنامه‌نویسی اصفهان؛ قبول سفارشات برنامه‌نویسی و پایگاه داده: 09131253620. انجام پروژه‌های برنامه‌نویسی، آموزش برنامه‌نویسی و آموزش پایگاه داده SQL Server با رویکرد عملی و سازمانی ارائه می‌شود.

جمع‌بندی

ALTER INDEX ALL زمانی ارزشمند است که مسئله، دامنه و هزینه آن اندازه‌گیری شده باشد. نمونه‌های این مقاله الگوی ساخت فرمان امن، کنترل State، ثبت نتیجه و ارزیابی کارایی را نشان دادند. پیش از اجرای Production، اسکریپت را روی نسخه‌ای مشابه آزمایش و معیار موفقیت را از قبل تعریف کنید.

مشاهده فهرست کامل دستورات نگهداری ایندکس در SQL Server

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر