مثالهای عملی
مثال 1: توقف موقت عملیات پایه
یک عملیات Resumable موجود با فرمان PAUSE مدیریت میشود.
ALTER INDEX IX_BigSales_OrderDate ON dbo.BigSales PAUSE;
| شاخص | خروجی نمونه | توضیح |
|---|
| فرمان | PAUSE | نتیجه نمایشی |
| نتیجه | در صورت وجود عملیات معتبر اجرا میشود | نتیجه نمایشی |
این فرمان فقط برای عملیات Resumable و ایندکس مشخص معنا دارد.
مثال 2: مشاهده وضعیت پیش از اقدام
Catalog View وضعیت، درصد پیشرفت و زمان باقیمانده عملیات را نشان میدهد.
SELECT
object_name = OBJECT_SCHEMA_NAME(object_id) + N'.' + OBJECT_NAME(object_id),
index_name = name,
state_desc,
percent_complete,
total_execution_time,
last_pause_time
FROM sys.index_resumable_operations
WHERE object_id = OBJECT_ID(N'dbo.BigSales');
| شاخص | خروجی نمونه | توضیح |
|---|
| state_desc | PAUSED | نتیجه نمایشی |
| percent_complete | 48.60 | نتیجه نمایشی |
پیش از توقف موقت، state_desc را بررسی کنید تا پیام خطای قابل پیشبینی رخ ندهد.
مثال 3: اجرای شرطی بر اساس State
فرمان فقط هنگامی اجرا میشود که وضعیت عملیات با اقدام درخواستی سازگار باشد.
IF EXISTS
(
SELECT 1
FROM sys.index_resumable_operations
WHERE object_id = OBJECT_ID(N'dbo.BigSales')
AND index_id = INDEXPROPERTY(OBJECT_ID(N'dbo.BigSales'), N'IX_BigSales_OrderDate', 'IndexID')
AND state_desc = N'RUNNING'
)
ALTER INDEX IX_BigSales_OrderDate ON dbo.BigSales PAUSE;
| شاخص | خروجی نمونه | توضیح |
|---|
| شرط | سازگار | نتیجه نمایشی |
| Action | PAUSE | نتیجه نمایشی |
کنترل State باعث میشود Job قابل تکرار و کمخطاتر باشد.
مثال 4: ساخت فرمان امن برای چند پایگاه
نامهای Catalog اعتبارسنجی و سپس با QUOTENAME به فرمان تبدیل میشوند.
DECLARE @Schema sysname = N'dbo',
@Table sysname = N'BigSales',
@Index sysname = N'IX_BigSales_OrderDate';
IF EXISTS
(
SELECT 1
FROM sys.index_resumable_operations
WHERE object_id = OBJECT_ID(QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table))
AND name = @Index
)
BEGIN
DECLARE @Sql nvarchar(max) =
N'ALTER INDEX ' + QUOTENAME(@Index) + N' ON '
+ QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + N' PAUSE;';
EXEC sys.sp_executesql @Sql;
END;
| شاخص | خروجی نمونه | توضیح |
|---|
| Dynamic action | PAUSE | نتیجه نمایشی |
نامهای دریافتشده از ورودی بیرونی را بدون Catalog Check و QUOTENAME اجرا نکنید.
مثال 5: مدیریت NULL و نبود عملیات
اگر عملیات Resumable موجود نباشد، پیام قابل فهم برگردانده میشود.
DECLARE @OperationId bigint =
(
SELECT TOP (1) index_id
FROM sys.index_resumable_operations
WHERE object_id = OBJECT_ID(N'dbo.BigSales')
);
IF @OperationId IS NULL
SELECT N'عملیات Resumable پیدا نشد' AS ResultText;
ELSE
ALTER INDEX IX_BigSales_OrderDate ON dbo.BigSales PAUSE;
| شاخص | خروجی نمونه | توضیح |
|---|
| ResultText | عملیات Resumable پیدا نشد | نتیجه نمایشی |
نبود عملیات وضعیت عادی است و میتواند بدون Failed کردن کل Job گزارش شود.
مثال 6: ثبت اقدام در جدول لاگ
اقدام PAUSE همراه با درصد پیشرفت پیش از اجرا ثبت میشود.
DECLARE @Percent decimal(6,2);
SELECT @Percent = percent_complete
FROM sys.index_resumable_operations
WHERE object_id = OBJECT_ID(N'dbo.BigSales')
AND name = N'IX_BigSales_OrderDate';
ALTER INDEX IX_BigSales_OrderDate ON dbo.BigSales PAUSE;
INSERT dbo.IndexMaintenanceLog
(IndexName, StartedAt, FinishedAt, ResultText)
VALUES
(N'IX_BigSales_OrderDate', SYSDATETIME(), SYSDATETIME(),
CONCAT(N'PAUSE at ', COALESCE(CONVERT(nvarchar(20), @Percent), N'unknown'), N' percent'));
| شاخص | خروجی نمونه | توضیح |
|---|
| ResultText | PAUSE at 48.60 percent | نتیجه نمایشی |
در رخدادهای عملیاتی، دانستن درصد پیشرفت هنگام اقدام برای تحلیل ظرفیت مفید است.
مثال 7: اجرای کنترلشده در TRY/CATCH
خطای ناشی از State ناسازگار ثبت و دوباره پرتاب میشود.
BEGIN TRY
ALTER INDEX IX_BigSales_OrderDate ON dbo.BigSales PAUSE;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_MESSAGE() AS ErrorMessage,
N'PAUSE' AS RequestedAction;
THROW;
END CATCH;
| شاخص | خروجی نمونه | توضیح |
|---|
| RequestedAction | PAUSE | نتیجه نمایشی |
| ErrorNumber | وابسته به وضعیت | نتیجه نمایشی |
CATCH نباید خطا را پنهان کند؛ ثبت و THROW مجدد رفتار Job را شفاف نگه میدارد.
مثال 8: گزارش عملیاتهای طولانی
عملیاتهایی با زمان اجرای زیاد یا پیشرفت پایین برای تصمیم اپراتور جدا میشوند.
SELECT
table_name = OBJECT_NAME(object_id),
name,
state_desc,
percent_complete,
total_execution_time
FROM sys.index_resumable_operations
WHERE total_execution_time >= 30
OR percent_complete < 50
ORDER BY total_execution_time DESC;
| شاخص | خروجی نمونه | توضیح |
|---|
| Index | State | Percent |
| IX_BigSales_OrderDate | PAUSED | 48.60 |
این گزارش ورودی تصمیم توقف موقت است و خودش تغییری در عملیات ایجاد نمیکند.
مثال 9: اصلاح فرمان اشتباه ALTER INDEX ALL
عملیات Resumable با نام ایندکس مشخص مدیریت میشود و ALL جایگزین امنی برای آن نیست.
DECLARE @IndexName sysname = N'IX_BigSales_OrderDate';
IF @IndexName = N'ALL'
THROW 51020, N'برای عملیات Resumable نام ایندکس مشخص لازم است.', 1;
ALTER INDEX IX_BigSales_OrderDate ON dbo.BigSales PAUSE;
| شاخص | خروجی نمونه | توضیح |
|---|
| IndexName | IX_BigSales_OrderDate | نتیجه نمایشی |
| Action | PAUSE | نتیجه نمایشی |
صریح بودن نام ایندکس احتمال اقدام روی عملیات دیگر را حذف میکند.
مثال 10: داشبورد عملیاتی برای تصمیم کارایی
وضعیت Resumable همراه با مدت اجرا و زمان آخرین Pause برای داشبورد نگهداری استخراج میشود.
SELECT
DatabaseName = DB_NAME(),
TableName = OBJECT_NAME(object_id),
IndexName = name,
state_desc,
percent_complete,
total_execution_time,
last_pause_time,
page_count
FROM sys.index_resumable_operations
ORDER BY percent_complete, total_execution_time DESC;
| شاخص | خروجی نمونه | توضیح |
|---|
| State | Percent | Pages |
| PAUSED | 48.60 | 1250000 |
تصمیم توقف موقت باید بر ظرفیت لاگ، پنجره باقیمانده و اولویت بار کاری متکی باشد.
سؤالات متداول
سؤال متداول 1: ALTER INDEX ... PAUSE دقیقاً چه کاری انجام میدهد؟
این فرمان بخشی از چرخه مدیریت فیزیکی یا چرخه عمر ایندکس است. اثر دقیق آن به نوع فرمان، نوع ایندکس و State فعلی بستگی دارد؛ بنابراین پیش از اجرا Catalog Viewها و مستند نسخه نصبشده را بررسی کنید.
سؤال متداول 2: آیا ALTER INDEX ... PAUSE برای افراد مبتدی مناسب است؟
یادگیری Syntax ساده است، اما اجرای تولیدی نیازمند شناخت قفل، Log، tempdb، Availability و برنامه بازگشت است. ابتدا روی پایگاه آزمایشی و نسخه پشتیبان تمرین کنید.
سؤال متداول 3: هزینه اجرای ALTER INDEX ... PAUSE چگونه برآورد میشود؟
اندازه ایندکس، page_count، نرخ تغییر داده، سرعت ذخیرهساز، مدت پنجره و رشد لاگ را اندازه بگیرید. برای برآورد دقیقتر میتوان از خدمات مشاوره و تحلیل کارایی SQL Server استفاده کرد.
سؤال متداول 4: آیا اجرای ALTER INDEX ... PAUSE میتواند سرعت سامانه را بیشتر کند؟
ممکن است، اما تضمینی نیست. بهبود تنها وقتی رخ میدهد که مشکل واقعی با ساختار ایندکس مرتبط باشد؛ Query Store و معیارهای قبل و بعد باید اثر را ثابت کنند.
سؤال متداول 5: تفاوت ALTER INDEX ... PAUSE با فرمانهای نزدیک چیست؟
REBUILD ساختار را دوباره میسازد، REORGANIZE مرتبسازی تدریجی است، DISABLE استفاده را متوقف میکند، DROP حذف دائمی است و PAUSE، RESUME و ABORT چرخه عملیات Resumable را مدیریت میکنند.
سؤال متداول 6: برای اجرای سازمانی ALTER INDEX ... PAUSE چه خدماتی لازم است؟
طراحی Job، پایش، گزارش خطا، آزمون بازیابی و تنظیم آستانهها بخشهای اصلی هستند. تیم آموزش یا مشاوره پایگاه داده میتواند اسکریپت را با SLA و معماری همان سازمان هماهنگ کند.
سؤال متداول 7: خطای رایج در ALTER INDEX ... PAUSE چیست؟
اجرای فرمان با نام یا State نامعتبر، کمبود فضا، محدودیت Edition، قفل Schema و فراموش کردن وابستگیها از خطاهای رایجاند. ERROR_NUMBER و ERROR_MESSAGE را ثبت و خطا را دوباره THROW کنید.
سؤال متداول 8: ALTER INDEX ... PAUSE چه اثری بر Performance دارد؟
اثر میتواند هم مثبت و هم منفی باشد. CPU، I/O، Waitها، رشد Log و زمان Queryهای مهم را در بازهای قابل مقایسه ثبت کنید و به یک درصد Fragmentation اکتفا نکنید.
سؤال متداول 9: Best Practice اجرای ALTER INDEX ... PAUSE چیست؟
دستور را هدفمند، تکرارپذیر، قابل ثبت و دارای Guard Clause بنویسید. نام اشیا در Dynamic SQL باید از Catalog اعتبارسنجی و با QUOTENAME محافظت شود.
سؤال متداول 10: ALTER INDEX ... PAUSE در کدام نسخههای SQL Server کار میکند؟
Syntax پایه بسیاری از فرمانها قدیمی است، ولی گزینههایی مانند IF EXISTS، ONLINE، WAIT_AT_LOW_PRIORITY و RESUMABLE در نسخهها و Editionهای متفاوت عرضه شدهاند. سازگاری دقیق را با نسخه سرور و مستندات همان نسخه کنترل کنید.