SQL Server Resumable Online Index Operasyonları

Veritabanı sistemlerimiz için index bakımı çok önemlidir. Sistem performansına büyük etkisi olan index bakımlarının zamanında ve sorunsuz şekilde yapılması özellikle Veritabanı Yöneticileri için en önemli görevlerden biridir. Bu hususta uzun süren ve mesai saatleri dışında bitmeyen index bakımları can sıkıcı bir hal almaktadır. Böyle durumlarda index bakımı iptal etmek zorunda kalınıyor ve yapılan işlem SQL Server tarafından rollback ediliyordu.

SQL Server 2017 ile beraber gelen Resumable Online Index Rebuild özelliği, index bakımlarını iptal etmek zorunda kalmadan o ana kadar yapılan operasyonu duraklatıp daha sonra kaldığı yerden devam edilmesine olanak sağlayan bir özelliktir. Bu özellik sayesinde mesai saati dışında başlatılan index rebuild operasyonu mesai başlangıcında duraklatılıp tekrar mesai bitiminde veya uygun bir zaman diliminde kaldığı yerden devam edilmesi sağlanabilir.

SQL Server 2019’da bu özellik index oluşturulurken de kullanılabilmektedir. Resumable Online Index Create olarak geçen bu özellikle, büyük tablolarda oluşturulmak istenen yeni bir index hedeflediğimiz süre içinde yetişmediği durumda yine duraklatılıp daha sonra işleme kaldığı yerden devam edilebilmektedir.

Şimdi bu özelliği kullanarak hem index oluşturma hemde index rebuild etme senaryolarını gösteren demo yapalım.

Ortam olarak iki özelliğide barındırdığı için SQL Server 2019 sürümü üzerinde bu senaryoları göstereceğim.

Resim – 1

İşlem yapacağım tabloda yaklaşık 11 milyon satırlık veri vardır. Mevcut haliyle tabloda sadece Id alanında PK Clustered Index mevcuttur.

Resim – 2

Resim – 3

Aşağıdaki gibi yeni bir Non-Clustered index ekleyelim. Index scriptimde RESUMABLE=ON olarak oluşturulmasını istiyorum. Fakat görüldüğü gibi bu işlemi tek başına kullanmama izin vermeyip hata mesajında benden ONLINE=ON yani hem Online hemde Resumable seçeneklerinin açık olarak oluşturulmasının mümkün olduğunu belirtmektedir.

Resim – 4

Resim – 5’de görüldüğü üzere ONLINE=ON seçeneğini ekleyip index oluşturma scriptimi çalıştırıyorum.

Resim – 5

Yeni bir sorgu sayfası açıp bu işlemi PAUSE (Duraklat) ediyorum.

Resim – 6

Resim – 7’da gördüğünüz gibi önceki sorgu sayfasında indexi oluşturduğum script durdurulmuş durumdadır.

Resim – 7

Aşağıdaki script ile veritabanı sistemi üzerindeki resumable indexler hakkında durum bilgisini öğrenebilirim. Resim – 8’de görüldüğü gibi oluşturmak istediğim index PAUSED durumda ve o ana kadar ki işlem yüzdesini görmekteyiz.

SELECT 
name, 
percent_complete, 
state_desc, 
last_pause_time, 
page_count 
FROM sys.index_resumable_operations;

Resim – 8

RESUME komutu ile işlemimizi kaldığımız yerden devam edebiliriz. Fakat ben RESUME ederken ilgili scripti durdurup index oluşturma işlemimin yüzde kaç olduğunu tekrar görmek istiyorum.

Resim – 9

Resim – 10’da tamamlanma yüzdesinin artmış olduğunu ve page_count kolonumun dolduğunu görüyoruz.

Resim – 10

PAUSED durumundayken ben aynı kolona farklı isimde bir index oluşturmak istedğimde aşağıdaki görüldüğü gibi bu nesne üzerinde zaten bir index oluşturulmaya başlandığını ve bu indexin son durumunu kontrol etmemi söylemektedir.

Resim – 11

Tekrar RESUME komutuyla index oluşturma işlemine devam edip tamamlanmasını bekleyebilirim.

Resim – 12

Resim – 13’de yeniden sorguladığımda işlem durumunun RUNNING olduğunu görmekteyim.

Resim – 13

Şimdi aynı işlemleri index rebuild senaryosunda deneyelim. Eklediğimiz index üzerinde rebuild işlemini yine RESUMABLE=ON seçeneği ile yaptığımızda yine hata verecektir. Burada yine ONLINE=ON ifadesini de eklememiz gerekmektedir. Resumable Index operasyonlarımızı mutlaka online seçeneği açık olarak yapmak zorundayız.

Resim – 14

Resim – 15’de görüldüğü gibi rebuild scriptimi çalıştırıyorum.

Resim – 15

Yine yukarıda belirttiğim Resumable Index operasyonlarının durumunu gösteren system sorgumu çalıştırıp son durumunu kontrol edebilirim.

Resim – 16

Aynı şekilde PAUSE ve RESUME komutlarım ile rebuild başlattığım index üzerinde işlem yapabiliyorum. Resim – 17’de PAUSE komutumu çalıştırıp, Resim – 18’de rebuild scriptimin durdurulduğunu görmekteyiz.

Resim – 17

Resim – 18

Resim – 19

Eğer veritabanı üzerinde PAUSED durumda bir index varsa ilgili tablo üzerinde hiç bir şekilde DDL işlemi yapmama izin vermemektedir. Örnek olarak ben bu indexi silmek istediğimde veya tabloyu kaldırmak istediğimde bana izin vermeyecektir.

Resim – 20

Resim – 21

Index rebuild işlemleri bilindiği üzere veritabanı log dosyasını büyütmektedir. Aşağıda görüldüğü gibi %44’lük bir log kullanım yüzdesi ve 952 MB kullanılan log boyutu bulunmaktadır.

Resim – 22

Index rebuild işlemimi duraklatıp (PAUSED), log shrink yapabilirim. Bu sayede log dosyamın daha fazla büyümesini engelleyip küçültebilirim.

Resim – 23

Resim – 24’de görüldüğü gibi log kullanım yüzdesi ve kullanılan log boyutu düşmüştür.

Resim – 24

Eğer PAUSED durumdaki veya çalışan RUNNING durumdaki index operasyonunu sonlandırmak istersem, ABORT komutunu kullanıyorum.

Resim – 25

Son olarak index rebuild operasyonuma süre kısıtı da verebilmekteyim. 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 )

Resumable yapıda oluşturulan veya rebuild edilen index kill edilerek sonlanmak istendiğinde PAUSED olmuş olur. O ana kadar işlemin ne kadar tamamlandığını yine yukarıda belirttiğim sys.index_resumable_operations tablosundan görülebilmektedir. Sistem üzerinde uzun süre PAUSED durumda kalan indexler ilgili tablolardaki DDL işlemlerine izin vermeyeceği için kontrollü şekilde sonlandırılmalıdır. Bu noktada index RESUME edilerek operasyonun bitirlmesi beklenmeli veya ABORT edilip sonlandırılmalıdır.

Bu yazıda sizlere Resumable Index yapısını anlatıp index oluşturma ve index rebuild etme senaryolarında nasıl kullanıldığının demosunu gösterdim. Yazının başında belirttiğim gibi bu özellik doğru bir şekilde kullanıldığında mevcut çalışma ortamlarımızda iş sürecini etkilemeyecek bir yapı oluşturmaktadır.

Referanslar

https://www.mssqltips.com

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir