MSSQL Server Resumable Index Nedir

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.

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;

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. Resumable index işlemleri yalnızca ONLINE = ON seçeneğiyle birlikte çalışabilir. İşlemin geçici bilgileri TempDB‘de saklanır. Dolayısıyla yeterli disk alanı olması gerekir.

Ö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);

2. Yoğun saatlerde işlemi durdurun:

ALTER INDEX IX_Sales_CustomerID
ON Sales PAUSE;

3. Yoğunluk azaldığında işlemi devam ettirin:

ALTER INDEX IX_Sales_CustomerID
ON Sales RESUME;

SORT_IN_TEMPDB=ON ifadesi RESUMABLE index’lerde desteklenmiyor. Disable edilmiş index’lerin rebuild işlemini RESUMABLE ile yapamıyoruz.

Resumable Index özelliği, SQL Server yöneticilerine büyük indeks oluşturma ve yeniden oluşturma işlemlerini daha esnek bir şekilde yönetme imkanı tanır. Bu özellik, kesintisiz iş sürekliliği sağlamaya yardımcı olur ve büyük veritabanlarının yönetimini kolaylaştırı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+ CREATE INDEX ile birlikte RESUMABLE kullanılabilir
SQL Server Express/Standard ONLINE = ON ve dolayısıyla RESUMABLE = ON desteklenmeyebilir

İ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.

NOT

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.

NOT

Resumable indeks oluşturma veya yeniden oluşturma işlemleri sırasında, işlem durdurulduğunda (pause), SQL Server aşağıdaki adımları izler:
. İndeks oluşturma veya yeniden oluşturma işlemi durdurulduğunda, SQL Server bu işlemin ilerleme durumunu ve gerekli geçici verileri disk üzerinde saklar. Bu veriler, işlemin kaldığı yerden devam etmesi için gereklidir.
. İndeks oluşturma veya yeniden oluşturma işlemi durdurulduğunda, temel tabloya yapılan veri değişiklikleri (INSERT, UPDATE, DELETE) geçici olarak hem eski indekse hem de oluşturulmakta olan yeni indekse uygulanır. Bu, işlemin devam ettirilmesi sırasında tutarlılığı sağlar.
. Kullanıcılar, indeksin durdurulmuş olmasından etkilenmezler. Veri okuma ve yazma işlemleri devam eder. Ancak, durdurulan indeksin performansından yararlanmak için, işlemin tamamlanması ve indeksin yeniden kullanılabilir duruma gelmesi gerekir.


İndeks oluşturma veya yeniden oluşturma işlemi tamamlandığında, geçici veriler temizlenir ve indeks normal şekilde kullanılabilir hale gelir. Bir başka önemli nokta ise Geçici veriler nerde durur. Değişen veriler hangi disk üzerinde durur Resumable indeks oluşturma veya yeniden oluşturma işlemleri sırasında, SQL Server geçici verileri ve değişen verileri belirli disk alanlarında saklar. Bu süreçlerin nasıl işlediğini daha ayrıntılı olarak açıklayalım:

  • Tempdb Veritabanı: İndeks oluşturma veya yeniden oluşturma işlemleri sırasında, özellikle sıralama (sorting) gibi geçici işlemler için ek disk alanına ihtiyaç duyulur. Bu geçici veriler, tempdb veritabanında saklanır. Eğer SORT_IN_TEMPDB seçeneği ON olarak ayarlanmışsa, sıralama işlemleri için kullanılan geçici nesneler tempdb’de oluşturulur. Aksi takdirde, bu nesneler hedef indeksin bulunduğu dosya grubunda oluşturulur.
  • İndeks ve Veri Sayfaları: İndeks oluşturma veya yeniden oluşturma işlemleri sırasında, veritabanındaki veri sayfaları ve indeks sayfaları üzerinde değişiklikler yapılır. Bu sayfalar, veritabanının fiziksel dosyalarında (örneğin, .mdf veya .ndf dosyaları) saklanır. İşlem durdurulduğunda, SQL Server bu değişiklikleri disk üzerinde tutar ve işlemi yeniden başlattığınızda kaldığı yerden devam eder.
  • Veri Manipülasyonu ve Erişim: İndeks oluşturma veya yeniden oluşturma işlemi sırasında, temel tabloya yapılan veri değişiklikleri (INSERT, UPDATE, DELETE) hem eski indekse hem de oluşturulmakta olan yeni indekse uygulanır. Bu, işlemin devam ettirilmesi sırasında veri tutarlılığını sağlar. Kullanıcılar, indeksin durdurulmuş olmasından etkilenmezler ve veri okuma/yazma işlemleri devam eder. Ancak, durdurulan indeksin performansından yararlanmak için, işlemin tamamlanması ve indeksin yeniden kullanılabilir duruma gelmesi gerekir.

Bu nedenle, geçici veriler genellikle tempdb veritabanında, değişen veriler ise ilgili veritabanının fiziksel dosyalarında saklanır.

SORT_IN_TEMPDB seçeneğinin kapalı olması durumunda, SQL Server indeks oluşturma veya yeniden oluşturma işlemlerinde sıralama işlemleri için geçici alanı kullanıcı veritabanının içinde ayırır. Bu, sıralama işlemleri sırasında hem veritabanı dosyasında hem de log dosyasında ek disk alanı kullanımı anlamına gelir. Özellikle büyük veritabanlarında veya sınırlı disk alanına sahip sistemlerde, bu durum disk alanı baskılarına yol açabilir.

İndeks oluşturma veya yeniden oluşturma işlemi sırasında, sıralama işlemleri için kullanılan geçici veriler, tempdb veritabanında saklanır. SORT_IN_TEMPDB seçeneği kapalı olduğunda, bu geçici veriler kullanıcı veritabanının içinde oluşturulur. İşlem durdurulduğunda, bu geçici veriler disk üzerinde saklanır ve işlemin devam ettirilmesi sırasında kullanılabilir.

Öneriler:

  • Disk Alanı Yönetimi: SORT_IN_TEMPDB seçeneğini kapalı tutmak, kullanıcı veritabanı içinde daha fazla disk alanı kullanımına neden olabilir. Bu durum, özellikle sınırlı disk alanına sahip sistemlerde sorun yaratabilir. Bu nedenle, disk alanı yönetimini dikkate almanız önemlidir
  • Performans ve Kaynak Kullanımı: SORT_IN_TEMPDB seçeneğini açmak, sıralama işlemleri için kullanılan geçici verileri tempdb veritabanına yönlendirerek, kullanıcı veritabanının disk alanını koruyabilir ve performansı artırabilir. Ancak, tempdb’nin yeterli disk alanına sahip olması ve performansının izlenmesi önemlidir, çünkü tempdb’deki geçici veriler disk üzerinde yer kaplar ve sistem performansını etkileyebilir.

Sonuç olarak, SORT_IN_TEMPDB seçeneğinin durumu, indeks oluşturma ve yeniden oluşturma işlemlerinin disk alanı kullanımı ve performansı üzerinde önemli bir etkiye sahiptir. Sisteminizin disk yapılandırmasını ve kaynaklarını dikkate alarak, bu seçeneği yapılandırmanız ö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

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir