SQL Server Resumable Online Index Operasyonları
  1. Anasayfa
  2. SQL Server

SQL Server Resumable Online Index Operasyonları

0

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 hem de 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‘de 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 bitirilmesi 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.

Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

https://www.mssqltips.com

 

TAGs: SQL Server, , SQL 2017, Resumable Online Index, Resumable Online Index Rebuild, Online Index,Index Rebuild, Resume

Bu İçeriğe Tepkin Ne Oldu?
  • 16
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 1
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

1993 yılında İstanbul’da doğdum. İstanbul Ticaret Üniversitesi Bilgisayar Mühendisliği ve Işık Üniversitesi İşletme Yüksek Lisans (MBA) mezunuyum. Lisans mezuniyetimin sonrasında iş hayatına Piri Medya (Albayrak Holding) şirketinde Veritabanı Geliştiricisi olarak başladım. Daha sonra buradaki veritabanı deneyimimi geliştirmek için Bilge Adam’da NBUY (Nitelikli Bilişim Uzmanı Yetiştirme) Veri Analizi ve Raporlama programını başarıyla tamamladım ve MCPS sertifikasını aldım. Program sonrasında kısa süreli SQL Developer olarak çalıştıktan sonra önce Ebebek’te ardından da Mavi’de DBA olarak çalıştım. Ana uzmanlık alanım MS SQL Server yönetimidir. Fakat bu deneyimler ile beraber çeşitli teknoloji ve uygulama üzerinde de yetkinlik kazandım. Bunlar; SAP Basis, SAP HANA DB, Oracle Exadata, Sybase DB, EMC Datadomain, Avamar, HP Storeonce, Idera SQL Tools, Solarwinds, AppDynamics, Oracle Cloud Control. Kariyerime Türkiye Finans Katılım Bankası bünyesinde DBA olarak çalışmaya devam ediyorum.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

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