SQL Server'da Dizin Parçalanması Nasıl Tespit Edilir ve Ölçülür?
Yayınlanan: 2023-06-15Bugün, veritabanlarını yönetmek için kullanılan bir sistem olan SQL Server'ın ( wiki ) büyüleyici bir yönünü keşfedeceğiz. Bugünkü konumuz “SQL Server'da Index Fragmentation”. Bunu nasıl tespit edip ölçeceğimizi öğreneceğiz. Endişelenme, göründüğü kadar karmaşık değil!
En sevdiğiniz şarkı çalma listesini düşünelim. Şarkılar, tam olarak istediğiniz gibi keyfini çıkarabilmeniz için belirli bir sırada düzenlenmiştir. Peki ya zamanla bazı şarkılar silinirse, yenileri eklenirse ve diğerleri taşınırsa? Çalma listenizin sırası bozuluyor, değil mi? Bu, dizin parçalanması hakkında konuştuğumuzda bir veritabanında olana benzer.
Bir veritabanında, veriler hızlı ve kolay erişim sağlamak için belirli bir şekilde düzenlenir. Ancak veriler eklendikçe, güncellendikçe veya kaldırıldıkça bu düzen bozulabilir ve "dizin parçalanması" dediğimiz duruma yol açabilir. Bu, tıpkı karışık bir çalma listesinin dinleme deneyiminizi nasıl bozduğu gibi veritabanını yavaşlatabilir.
Bu makalede, bu "karıştırma"nın ne zaman gerçekleştiğini nasıl anlayacağımızı ve verilerin ne kadar "karıştırıldığını" nasıl ölçeceğimizi öğreneceğiz. DJ olmak gibi ama veritabanları için! Öyleyse desteleri döndürmeye hazırlanın ve başlayalım!
- Dizin Fragmentasyonunu Anlamak
- Dizin Parçalanmasını Algılama
- İndeks Fragmentasyonunu Ölçme
- Sonuçları Yorumlama
- Çözüm
Dizin Fragmentasyonunu Anlamak
Pekala, dizin parçalanmasının gerçekte ne olduğunu biraz daha derinlemesine inceleyelim. Çalma listesi örneğimizi hatırlıyor musunuz? Tıpkı bir çalma listesindeki şarkılar gibi, bir veri tabanındaki veriler de belirli bir sırada saklanır. Bu düzen, her şeyin depolandığı yeri gösteren bir harita veya kılavuza benzeyen 'dizin' adı verilen bir şey kullanılarak sağlanır.
Şimdi, yeni şarkılar (veya veriler) eklerken, bazılarını kaldırırken veya onları hareket ettirirken, çalma listemiz (veya dizinimiz) karıştırılabilir veya parçalanabilir. Veritabanı açısından buna 'dizin parçalanması' diyoruz.
İki tür parçalanma vardır: iç ve dış.
- Çalma listemizde boş parçaların olması gibi, veri sayfalarında boş alan olduğunda dahili parçalanma gerçekleşir.
- Öte yandan harici parçalanma , sayfaların mantıksal sırasının fiziksel sıralarıyla eşleşmemesidir, örneğin şarkılarımızın olmasını istediğimiz sırada olmaması gibi.
Şimdi, indeks parçalanmasını neden önemsemeliyiz? Bir dizin parçalandığında, SQL Server'ın ihtiyaç duyduğu verileri bulmak için daha çok çalışması gerekir. Karışık bir çalma listesini belirli bir sırayla dinlemeye çalışmak gibi - daha fazla çaba gerektirir, değil mi? Benzer şekilde, parçalanmış bir dizin veritabanının performansını yavaşlatarak veri alımını daha yavaş ve daha az verimli hale getirebilir.
Sonraki bölümlerde, bu parçalanmayı nasıl tespit edeceğimizi ve düzeltmek için neler yapabileceğimizi öğreneceğiz. Müziğimizin keyfini istediğimiz gibi çıkarabilmemiz için çalma listelerimizi nasıl düzenleyeceğimizi öğrenmek gibi! Öyleyse, yolculuğumuzun bir sonraki bölümüne geçelim.
Size önerilen: SQL Injection: Hala Bir Tehdit mi? Bundan Nasıl Kaçınabilirsiniz?
Dizin Parçalanmasını Algılama
Artık indeks parçalanmasının ne olduğunu anladığımıza göre, onu nasıl tespit edebileceğimizden bahsedelim. SQL Server, bunu yapmak için bize bazı kullanışlı araçlar ve komutlar sağlar. Bu, oynatma listemizin ne zaman karıştırıldığını ve yeniden düzenlenmesi gerektiğini bize bildiren özel bir uygulamaya sahip olmak gibidir.
SQL Server'da kullandığımız birincil araç, sys.dm_db_index_physical_stats adlı bir sistem işlevidir. Oldukça ağız dolusu, değil mi? Ama merak etmeyin, göründüğü kadar karmaşık değil. Bu işlev, veritabanımızı inceleyebilen ve dizinlerimizin ne kadar parçalanmış olduğunu bize söyleyebilen bir dedektif gibidir. Bunu şu şekilde kullanıyoruz:
1. Veritabanı ve Tablo Seçimi:
İlk önce fonksiyona hangi veritabanını ve tabloyu incelemek istediğimizi söylüyoruz. Hangi çalma listesini kontrol etmek istediğimizi seçmek gibi.
2. İşlevi Çalıştırma:
Daha sonra fonksiyonu çalıştırıyoruz. Bu, şuna benzeyen bir SQL komutu yürütülerek yapılır:
SELECT * FROM sys.dm_db_index_physical_stats (DB_ID(N'YourDatabaseName'), OBJECT_ID(N'YourTableName'), NULL, NULL, 'DETAILED');
Bu komutta, 'YourDatabaseName' ve 'YourTableName' öğelerini veritabanınızın ve tablonuzun adıyla değiştirin.
3. Sonuçları Okumak:
İşlev pek çok bilgi döndürür, ancak ilgilendiğimiz en önemli şey avg_fragmentation_in_percent adlı bir değerdir. Bu bize indeksimizin yüzde olarak ne kadar parçalanmış olduğunu söyler. Bize çalma listemizin ne kadar karışık olduğunu söylemek gibi.
İndeks Fragmentasyonunu Ölçme
Ne kadar uzun olduğumuzu veya ne kadar kilo aldığımızı ölçtüğümüz gibi, indekslerimizin ne kadar parçalanmış olduğunu da ölçebiliriz. SQL Server'da bunu yapmak için birkaç temel ölçü kullanırız. Çalma listemizin ne kadarının bozuk olduğunu ölçmek gibi düşünün. Bunu şu şekilde yapıyoruz:
Metrikleri Anlamak:
Kullandığımız ana metriğe avg_fragmentation_in_percent denir. Bu bize dizindeki mantıksal parçalanmanın (sıra dışı sayfalar) yüzdesini söyler. Bize çalma listemizin yüzde kaçının karıştırıldığını söylemek gibi.
Diğer bir önemli metrik ise page_count . Bu bize dizindeki toplam dizin veya veri sayfası sayısını söyler. Çalma listemizdeki toplam şarkı sayısı olarak düşünün.
Komutu Çalıştırmak:
Tıpkı parçalanmayı saptamak için yaptığımız gibi sys.dm_db_index_physical_stats işlevini çalıştırarak dizin parçalanmasını ölçüyoruz. Ancak bu sefer avg_fragmentation_in_percent ve page_count değerlerine dikkat ediyoruz.
İşte komut tekrar:
SELECT * FROM sys.dm_db_index_physical_stats (DB_ID(N'YourDatabaseName'), OBJECT_ID(N'YourTableName'), NULL, NULL, 'DETAILED');
'YourDatabaseName' ve 'YourTableName' öğelerini veritabanınızın ve tablonuzun adıyla değiştirmeyi unutmayın. Aşağıda, basit olması için yalnızca birkaç sütunla görebileceklerinize bir örnek verilmiştir:
Bu basitleştirilmiş tabloda:
- object_id, tablonun kimliğidir.
- index_id, dizinin kimliğidir.
- index_type_desc, dizinin türünü tanımlar (örneğin, “KÜMELENMİŞ ENDEKS”).
- avg_fragmentation_in_percent, dizinin yüzde cinsinden ortalama parçalanmasıdır.
- fragman_sayım, dizindeki parçaların (bitişik sayfa grupları) sayısıdır.
- page_count, dizindeki toplam sayfa sayısıdır.
Bu tablo size dizinin parçalanma durumunun net bir görünümünü sunar.
Sonuçların Yorumlanması:
avg_fragmentation_in_percent %5'in altındaysa, dizinimiz oldukça iyi durumda demektir; yalnızca biraz karıştırılmış bir oynatma listesi gibi. %5 ile %30 arasındaysa, dizinimizin biraz yeniden düzenlenmesi gerekebilir. Ve %30'un üzerindeyse, oynatma listemizi sıfırdan yeniden sıralamak gibi dizinimizi tamamen yeniden oluşturmamız gerekebilir.
page_count değeri bize dizinimizin (veya çalma listemizin) ne kadar büyük olduğunu söyler. Küçük bir sayıysa, parçalanma konusunda çok fazla endişelenmemize gerek olmayabilir. Ama eğer büyük bir sayıysa, parçalanma işleri gerçekten yavaşlatabilir ve kesinlikle düzeltmek için adımlar atmalıyız.
Sonuçları Yorumlama
Unutmayın, dizinlerimizin durumu hakkında bize bilgi veren bir tabloya bakıyoruz, veritabanımız için bir tür sağlık kontrol raporu gibi.
1. Parçalanma Düzeyini Anlamak
avg_fragmentation_in_percent sütunu dizinimizin kalp atışı gibidir. Dizinimizin ne kadar parçalı veya düzensiz olduğunu bize söyler. Yüzde 0 veya 1 gibi düşük bir sayı, dizinimizin mükemmel durumda olduğu anlamına gelir; bakımlı bir kitaplık kadar düzenlidir. Ancak yüzde 60 veya 70 gibi yüksek bir sayı, dizinimizin oldukça parçalı olduğu anlamına gelir; düzenli bir kitaplıktan çok dağınık bir oda gibidir.
2. Parça Sayısı ve Sayfa Sayısı
fragment_count ve page_count sütunları bize dizinimiz hakkında daha fazla ayrıntı verir. Bir 'parçayı' bir kitabın bir bölümü gibi düşünebilirsiniz ve 'sayfalar' da tıpkı o kitaptaki sayfalar gibidir. Çok fazla parçamız varsa, bu, kitabımızın birçok bölüme ayrıldığı anlamına gelir, bu da hızlı okumayı zorlaştırabilir. Ve çok fazla sayfamız varsa, bu, kitabımızın (veya bu durumda dizinimizin) oldukça büyük olduğu anlamına gelir.
3. Ne Zaman Harekete Geçmeli?
Öyleyse, parçalanma konusunda endişelenmeye ne zaman başlamalıyız? Genel bir kural olarak, yüzdede avg_fragmentation_in_yüzde 5'in altındaysa, dizinimiz sağlıklıdır ve herhangi bir şey yapmamıza gerek yoktur. Yüzde 5 ile 30 arasındaysa, indeksimiz biraz dağınık bir odayı temizlemek gibi biraz toparlamayı kullanabilir. Ve eğer yüzde 30'un üzerindeyse, dizinimiz büyük ölçüde parçalanmıştır ve tıpkı odamız çok dağınıksa büyük bir temizlik yapmamız gerektiği gibi, onu yeniden düzenlemek için harekete geçmemiz gerekir.
Unutmayın, bunlar sadece yönergelerdir. Kesin sayılar, veritabanınızın özel gereksinimlerine ve performansına bağlı olarak değişebilir. Ancak bu sonuçları anlayarak dizinlerinizin ve veritabanınızın sorunsuz çalışmasını sağlayabilirsiniz.
Şunlar da ilginizi çekebilir: Asp.Net MVC Geliştirmede GeoGraphy DataType of SQL Nasıl Kullanılır.
Çözüm
Nasıl iyi organize edilmiş bir çalma listesi en sevdiğiniz şarkıları bulup çalmayı kolaylaştırıyorsa, iyi organize edilmiş bir veritabanı da SQL Server'ın ihtiyaç duyduğu verileri bulmasını ve almasını kolaylaştırır. Bu nedenle dizin parçalanmasını tespit etmek ve ölçmek çok önemlidir - veritabanımızın sorunsuz ve verimli bir şekilde çalışmasını sağlamamıza yardımcı olur.
Bu makale boyunca, dizin parçalamanın biraz karıştırılmış bir çalma listesine benzediğini öğrendik. Dizinlerimiz parçalandığında veya karıştırıldığında, SQL Server'ın ihtiyaç duyduğu verileri bulmak için daha çok çalışması gerekir. Bu, sorgularımızı yavaşlatabilir ve veritabanımızı daha az verimli hale getirebilir.
Ancak tartıştığımız araçları ve komutları kullanarak dizin parçalanmasını saptayabilir ve ölçebiliriz. Bu, dizinlerimizi yeniden düzenleyerek veya tamamen yeniden oluşturarak, herhangi bir sorunu belirlememize ve bunları düzeltmek için harekete geçmemize olanak tanır. Bu, biraz karıştırılmış bir oynatma listesini yeniden sıralamaya benziyor - her şeyi yerine koyarak, aradığımızı bulmayı kolaylaştırıyoruz.
Sonuç olarak, dizinlerimizi korumak, veritabanımızı korumanın çok önemli bir parçasıdır. Dizin parçalanmasını düzenli olarak kontrol ederek ve ele alarak, veritabanımızın en iyi performansı göstermeye devam etmesini sağlayabiliriz.
SQL Server'da dizin parçalama hakkında daha fazla bilgi edinmek istiyorsanız, bu ayrıntılı makaleye göz atmanızı tavsiye ederim. Bu konuyu daha derine inmek isteyen herkes için harika bir kaynak.
Unutmayın, tıpkı bir oynatma listesini düzenli tutmak gibi, dizinlerinizi korumanın da devam eden bir görev olduğunu unutmayın. Ancak doğru bilgi ve araçlarla, veritabanı performansı açısından büyük kazançlar sağlayabilecek bir görevdir. Mutlu indeksleme!