Resumable Index (Devam Ettirilebilir İndeks) özelliği, Microsoft SQL Server’ın 2017 (14.x) ve sonraki sürümlerinde sunulan bir özelliktir. Bu özellik, indeks oluşturma veya yeniden oluşturma (rebuild) işlemlerini durdurup (pause) daha sonra kaldığı yerden devam ettirebilme (resume) yeteneği sağlar. Özellikle büyük veritabanlarında uzun süren indeks işlemlerini daha esnek bir şekilde yönetmeyi mümkün kılar. Yada büyük kolonlu index yapılarında yanlış belirtilen bir değer değiştirilmek istenebilir. Bunun için durdurup tekrardan devam ettirilmesi sağlanmaktadır.
Index’leri online rebuild ederken failover, disk yetmezliği, manual durdurma(PAUSE) gibi nedenlerden dolayı index rebuild işlemi fail olabiliyordu. Bu tip durumlarda fail olduktan sonra rebuild işleminin kaldığı yerden devam etmesi için index’i RESUMABLE=ON şeklinde işaretlemeniz gerekiyor.
Resumable Index’in Avantajları
– Büyük indeks oluşturma veya yeniden oluşturma işlemlerini herhangi bir noktada durdurabilir ve daha sonra devam ettirebilirsiniz.
– Örneğin, işlem sırasında sistem kaynağı sınırlamaları yaşarsanız, işlemi durdurup uygun bir zamanda yeniden başlatabilirsiniz.
– Yoğun iş saatlerinde indeks işlemini durdurabilir ve kaynakları kritik iş yüklerine ayırabilirsiniz.
– Az yoğunluklu saatlerde işlemi tekrar başlatabilirsiniz.
– Disk alanı tasarrufu konusunda ise işlem sırasında SQL Server, sadece gereken kısmı tamamlar ve henüz işlenmeyen bölümler için veri saklar. Bu, gereksiz veri yeniden yazımını önler.
– Geleneksel indeks oluşturma işlemleri genellikle uzun süreli kesintilere neden olabilir. Resumable index özelliğiyle, bu kesintiler minimuma indirgenir.
Not: Resumable parametresi ile oluşturulan index yapısında online=on ifadesinin kullanılmaması hataya sebebiyet vermektedir. Pause veya Resume ifadesinde kullanılmasında gerek yoktur.

Aşağıdaki komut ile veritabanı altında resumable index’ler hakkında durum bilgisini öğrenebiliriz.
SELECT
name,
percent_complete,
state_desc,
last_pause_time,
page_count
FROM sys.index_resumable_operations;
Desteklenen İşlemler
– CREATE INDEX: Yeni bir indeks oluşturulurken kullanılabilir.
– ALTER INDEX … REBUILD: Mevcut bir indeksi yeniden oluştururken kullanılabilir.
Kullanım Senaryoları
1. Oluşturma (CREATE INDEX):
CREATE INDEX IX_IndexName
ON TableName (ColumnName)
WITH (RESUMABLE = ON, MAXDOP = 4);
RESUMABLE = ON: Resumable özelliğini etkinleştirir.
MAXDOP: Maksimum paralel iş parçacığı sayısını belirler.
2. Yeniden Oluşturma (ALTER INDEX … REBUILD):
ALTER INDEX IX_IndexName
ON TableName
REBUILD WITH (RESUMABLE = ON, MAXDOP = 4);
3. Durdurma (PAUSE):
Herhangi bir değer yanlış girildiğinde durdurulur.
ALTER INDEX IX_IndexName
ON TableName PAUSE;
Not: Durdurma işleminde sonra aynı yapıda bir index oluşturmak istediğimizde hata mesajıyla karşılarız.
Not. Eğer veritabanı üzerinde Pause durumunda olan bir index yapımız mevcutsa hiç bir şekilde index’in bulunduğu tabloyu silmenize (DROP TABLE) izin verilmez. Tablo şemasını değiştirmenize (ALTER TABLE – sütun silme/değiştirme gibi) izin verilmez. Ancak, tablo üzerinde DML (INSERT, UPDATE, DELETE) işlemleri yapmaya devam edebilirsiniz. Yani veri akışı durmaz, sadece tablonun yapısını değiştiren (DDL) işlemler engellenir.
Not: Bir indeksi duraklattığınızda (PAUSE), o ana kadar kullanılan Transaction Log kayıtları “aktif” kabul edilir. SQL Server, işlemi kaldığı yerden devam ettirebilmek için bu loglara ihtiyaç duyar. Log dosyasını SHRINK etmeye çalışsanız bile, SQL Server duraklatılmış indekse ait logları “active” olarak işaretlediği için log dosyası küçülmeyecektir. Logun boşalması için işlemin ya tamamen bitmesi (RESUME) ya da tamamen iptal edilmesi (ABORT) gerekir.
4. Devam Ettirme (RESUME):
Durdurulan işlemi yeniden başlatmak için aşağıdaki komut kullanılır.
ALTER INDEX IX_IndexName
ON TableName
RESUME;
Eklenmesini istediğimiz ifadeleri RESUME ifadesinden sonra ekleyebiliriz.
ALTER INDEX IX_IndexName
ON TableName
RESUME WITH (MAXDOP=4);
5. Durumu Kontrol Etme:
İndeks durumunu kontrol etmek için:
SELECT name, state_desc
FROM sys.index_resumable_operations
‘state_desc’ alanı işlemin RUNNING, PAUSED veya COMPLETED durumunda olup olmadığını gösterir.
Resumable Index Özelliğinin Sınırlamaları
Sadece Clustered veya Non-Clustered Index İçin desteklenirken Spatial, XML veya diğer özel indeks türlerini desteklemez. Veritabanı uyumluluk seviyesi en az 140 (SQL Server 2017) olmalıdır. Duraklatılabilir işlemler, doğası gereği arka planda çalışıp tabloya erişimi kesmemeyi amaçlar. Bu yüzden RESUMABLE = ON kullandığınızda mutlaka ONLINE = ON ifadesini de eklemelisiniz. Aksi takdirde SQL Server hata verecektir.
Normal (Resumable Olmayan) Online Index: Sıralama (sorting) ve geçici işlemler için TempDB’yi yoğun şekilde kullanır.
Resumable Index: İndeks oluşturma işleminin hangi aşamada olduğunu, hangi sayfaların işlendiğini ve mevcut ilerlemeyi User Database (Kullanıcı Veritabanı) içerisinde saklar.
- Duraklattığınızda (PAUSE) SQL Server bu durumu veritabanı meta verilerinde tutar.
- Bu yüzden asıl risk TempDB’nin dolması değil, Transaction Log (LDF) dosyasının ve kullanıcı veritabanındaki Data File (MDF) alanının dolmasıdır.
Örnek Senaryo
Bir veritabanında büyük bir tablo için indeks oluşturmak istiyorsunuz ancak yoğun iş saatlerinde işlem sistemi yavaşlatabilir. Bu durumda Resumable Index özelliği kullanılabilir:
1. İndeks oluşturun ve gerektiğinde durdurun:
CREATE INDEX IX_Sales_CustomerID
ON Sales (CustomerID)
WITH (RESUMABLE = ON, MAXDOP = 4,ONLINE=ON);
2. Yoğun saatlerde işlemi durdurun:
ALTER INDEX IX_Sales_CustomerID
ON Sales PAUSE;
İndeksi manuel olarak PAUSE etmek yerine, SQL Server’a “Bu işlemi sadece 60 dakika boyunca yap, bitmezse otomatik duraklat” diyebilirsiniz. Bu, bakım pencereleri için mükemmeldir:
ALTER INDEX IX_Sales_CustomerID ON Sales
RESUME WITH (MAX_DURATION = 60 MINUTES);
Eğer indeks oluşturma işlemini PAUSE durumunda bırakıp unutursanız:
- Log Dosyası Şişer: Daha önce konuştuğumuz gibi, işlem bitene kadar SQL Server o işlemle ilgili logları temizleyemez (Truncate edemez).
- Şema Kilidi: Tablo üzerinde ALTER TABLE gibi yapısal değişiklikler yapamazsınız.
3. Yoğunluk azaldığında işlemi devam ettirin:
ALTER INDEX IX_Sales_CustomerID
ON Sales RESUME;
İşlemi duraklattığınızda veya devam ettirdiğinizde, yüzde kaçının bittiğini görmek için şu sorguyu kullanmalısınız. Aksi takdirde “karanlıkta” ilerlemiş olursunuz:
SELECT
name,
percent_complete,
state_desc,
last_pause_time
FROM sys.index_resumable_operations;
Disable edilmiş index’lerin rebuild işlemini RESUMABLE ile yapamıyoruz. SQL Server’da bir indeksi DISABLE ettiğinizde, o indeksin metadata bilgisi kalır ancak fiziksel verisi (B-Tree yapısı) tamamen silinir.
Ancak devre dışı bırakılmış bir indekste üzerinde çalışılacak bir “fiziksel yapı” bulunmadığı için SQL Server bu işlemi duraklatılabilir (resumable) bir iş akışına sokamaz.
Resumable özelliği, mevcut bir ağaç yapısını adım adım inşa etmek veya yeniden düzenlemek için tasarlanmıştır.
Ola Hallengren’in SQL Server bakım çözümü, resumable (devam edilebilir) indeks oluşturma ve yeniden oluşturma işlemlerini destekler. Bu özellik, özellikle büyük veritabanlarında uzun süren indeks işlemlerini daha esnek bir şekilde yönetmeyi sağlar. IndexOptimize prosedüründe, @Resumable parametresini ‘Y’ olarak ayarlayarak bu özelliği etkinleştirebilirsiniz. Örnek kullanım:
EXECUTE [dbo].[IndexOptimize]
@Databases = 'USER_DATABASES, -DB1, -DB2, -DB3',
@Indexes = 'ALL_INDEXES, -DBNAME.SCHEMENAME.TABLONAME'
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE',
@FragmentationLevel1 = 10,
@FragmentationLevel2 = 30,
@LogToTable = 'Y',
@MaxDop= 16,
@Resumable = 'Y',
@TimeLimit = 36000;
Resumble ifademizle index jobımızı oluşturduktan sonra hata mesajı alabiliriz.
@Resumable is not a parameter for procedure IndexOptimize. [SQLSTATE 42000] (Error 8145). The step failed.
SQL Server 2017(v14) ile birlikte online index rebuild sırasında RESUMABLE = ON desteği geldi. Sadece ONLINE = ON ile birlikte kullanılabilir. Yukarıda scriptlerle bu işlemi yapabilirsin.
Daha da önemlisi:
• SQL Server 2017’de sadece ALTER INDEX REBUILD komutunda RESUMABLE = ON desteklenir.
• SQL Server 2019 ve sonrası sürümlerde CREATE INDEX komutu ile birlikte RESUMABLE = ON kullanılabilir.
Eğer sürümünüz uygunsa bile, RESUMABLE ancak ONLINE = ON ile birlikte kullanılır.
SQL Server sürümünüz 2017’den düşük RESUMABLE özelliği yok
SQL Server 2017 Sadece ALTER INDEX REBUILD ile kullanabilirsiniz
SQL Server 2019+ ALTER INDEX REBUILD ve CREATE INDEX ile birlikte RESUMABLE kullanılabilir
SQL Server Express/Standard ONLINE = ON ve dolayısıyla RESUMABLE = ON desteklenmeyebilir
Resumable Index = Online Index demektir.
- SQL Server Standard Edition kullanıyorsanız; 2017 ve 2019 sürümlerinde “Online Index Rebuild” desteği kısıtlıdır veya yoktur (sadece Enterprise’da tam desteklenir).
- Eğer sürümünüz Standard ise @Resumable = ‘Y’ yapsanız bile SQL Server “Online index operations can only be performed in Enterprise Edition” hatası verecektir.
Burada küçük bir kavram netleştirmesi yapalım:
- @TimeLimit (Ola Hallengren Parametresi): Prosedürün toplamda ne kadar süre çalışacağını belirler. Süre dolunca prosedür bir sonraki indekse geçmez ve durur.
- @ResumableMaxDuration (Ola Hallengren Parametresi): Bu, SQL Server’ın kendi
MAX_DURATIONkomutuna karşılık gelir. Tek bir indeks işleminin kaç dakika süreceğini belirler. Eğer bu süre dolarsa indeks otomatik olarakPAUSEmoduna geçer.
Örnek kullanımda şu iki parametreyi birlikte düşünmelisiniz:
EXECUTE [dbo.IndexOptimize]
...
@Resumable = 'Y',
@ResumableMaxDuration = 60, -- Her bir indeks işlemi max 60 dk sürsün, bitmezse PAUSE et.
@TimeLimit = 3600; -- Tüm bakım operasyonu max 1 saat sürsün.
İkinci kontrol edilmesi gereken @Resumable parametresi, Ola Hallengren’in IndexOptimize prosedürüne ilk defa 2020 versiyonunda eklendi. Eğer sisteminizde eski bir sürüm yüklüyse, @Resumable parametresi bilinmeyen bir parametre olur ve bu hatayı alırsın. En güncel IndexOptimize prosedürünü indir ve yeniden oluşturulması gerekmektedir. Ola.hallengren sayfasından MaintenanceSolution.sql scriptinin indirilip çalıştırılması gerekmektedir.
Aşağıdaki scriptte rebuild işlemime MAX_DURATION komutu ekleyip belirttiğimiz dakika kadar işlemi yapıp sonrasında işlemi durduracaktır. Aynı şekilde ilgili index üzerinde farklı bir zaman diliminde işleme yine zaman kısıtı koyarak devam (RESUME) edebilirim.
ALTER INDEX IX_Ad_Resumable ON dbo.ResumableIndexTestTablo
REBUILD WITH ( RESUMABLE=ON , ONLINE=ON , MAX_DURATION=120 MINUTES)
GO
ALTER INDEX IX_Ad_Resumable ON dbo.ResumableIndexTestTablo RESUME WITH ( MAX_DURATION=60 MINUTES )
Bu özelliği kullanmak için, indeks oluşturma veya yeniden oluşturma işlemi sırasında RESUMABLE=ON seçeneğini belirtmeniz gerekir. Örneğin, SQL Server 2017’de yalnızca çevrimiçi indeks yeniden oluşturma işlemleri için resumable özelliği kullanılabilirken, SQL Server 2019 ile birlikte hem indeks oluşturma hem de yeniden oluşturma işlemleri için bu özellik kullanılabilir.
Resumable Index İşleyiş Özeti
1. Duraklatma (Pause) Mekanizması: İşlem duraklatıldığında SQL Server, ilerleme durumunu ve o ana kadar oluşturulan indeks sayfalarını kullanıcı veritabanı (User DB) içinde saklar. İşlem durduğunda kaydedilen bu meta veriler, RESUME komutu verildiğinde SQL Server’ın kaldığı sayfadan devam etmesini sağlar.
2. Veri Tutarlılığı ve DML İşlemleri: İşlem ister çalışıyor ister “PAUSE” durumunda olsun, ana tabloya gelen tüm INSERT, UPDATE ve DELETE işlemleri hem mevcut indekse hem de oluşturulmakta olan yeni indeks yapısına eş zamanlı olarak uygulanır. Bu sayede işlem devam ettirildiğinde veri kaybı yaşanmaz ve tam tutarlılık sağlanır.
3. Kullanıcı Erişimi ve Performans: İndeks işlemi duraklatılmış olsa bile kullanıcılar tabloya okuma ve yazma yapmaya devam edebilir (Online). Ancak, oluşturulmakta olan indeks henüz “tamamlanmış” sayılmadığından, sorgular bu indeksi işlem bitene kadar performans artışı için kullanamaz.
4. Disk ve Depolama Yönetimi:
- Sıralama işlemleri için SORT_IN_TEMPDB = ON ise TempDB kullanılır;
OFFise bu alan kullanıcı veritabanının kendi içinde ayrılır. - Duraklatma boyunca biriken tüm değişiklikler ve yeni indeks sayfaları veritabanının kendi fiziksel dosyalarında (.mdf/.ndf) tutulur.
- Resumable işlemlerde en kritik nokta Log dosyasıdır. İndeks işlemi bitene veya iptal edilene (
ABORT) kadar, işlemle ilgili log kayıtları “aktif” tutulur ve temizlenemez (Truncate edilemez). Bu nedenle büyük operasyonlarda log diski kapasitesi titizlikle izlenmelidir.
Yukarıdaki işlem tamamlandığında SQL Server tüm geçici yapıları temizler ve indeksi kullanıma açar. Disk alanı baskısını yönetmek için büyük indekslerde SORT_IN_TEMPDB = ON kullanılması ve bakım pencereleri dışında işlemin PAUSE moduna alınarak sistem yükünün dengelenmesi önerilir.
Başka makalede görüşmek dileğiyle..
“Her kim şan ve şeref istiyorsa bilsin ki, şan ve şeref bütünüyle Allah’a aittir. Güzel sözler ancak ona yükselir. Salih ameli de güzel sözler yükseltir. Kötülükleri tuzak yapanlar var ya, onlar için çetin bir azap vardır. İşte onların tuzağı boşa çıkar. “Fâtır-10
