Dizinleri ne zaman yeniden oluşturmalıyım?


Yanıtlar:


41

Cevabımda çok genel olma riski altında, düzenli olarak bir dizin bakım işlemi yürütmeniz gerektiğini söyleyeceğim. Ancak, dizin bakım işleminiz yalnızca özel olarak gerektiren dizinleri yeniden oluşturmalı / yeniden düzenlemelidir.

Bu şu soruyu sunar: Bir endeksin ne zaman yeniden oluşturulması veya yeniden düzenlenmesi gerekir? Rolando buna çok iyi dokundu. Yine, son derece geniş olma riski. Parçalanma seviyesi performansı olumsuz etkilediğinde bir endeks bakım gerektirir. Bu parçalanma seviyesi, indeksin büyüklüğüne ve bileşimine bağlı olarak değişebilir.

SQL Server için konuşursak, indeks bakımı yapmaya başladığım bir indeks büyüklüğü ve indeks parçalanma seviyesi seçme eğilimindeyim. Bir dizinde 100 sayfadan az sayfa varsa, bakım yapmam.

Bir dizin% 10 ile% 30 arasında bir parçalanmışsa, REORGANIZEdizini ve UPDATEistatistikleri alacağım . Eğer bir endeks% 30'un üzerinde parçalanmışsa, REBUILDendeksi alacağım - hayır ile UPDATE STATISTICS, bunun tarafından halledilir REBUILD. Yeniden oluşturma işleminin yalnızca dizinle doğrudan ilişkili olan istatistik nesnesini güncellediğini unutmayın. Diğer sütun istatistiklerinin ayrı tutulması gerekecektir.

Bu cevap gerçekten söylemenin çok uzun bir yoludur: Evet, rutin indeks bakımı yapmalısınız, fakat sadece buna ihtiyaç duyan indekslerde.


19

İlişkisel veritabanımdaki endeksleri ne zaman yeniden oluşturmalıyım (örneğin, SQL Server)?

Dizinler, özel olaylar tarafından yüksek oranda parçalandıklarında yeniden oluşturulmalıdır. Örneğin, dizine alınmış bir tabloya büyük, toplu bir veri yükü gerçekleştiriyorsunuz.

Dizinleri düzenli olarak yeniden oluşturmak için bir durum var mı?

Peki ya indeksleriniz düzenli faaliyet nedeniyle düzenli olarak parçalanıyorsa? Düzenli yeniden yapılanmalar planlamalı mıyım? Ne sıklıkla koşmalılar?

Tom Kyte , bu klasik Tom'a sorun iş parçacığında şunları önerir:

Endeks yeniden yapılandırmaları arasındaki gecikme süresi yaklaşık olarak FOREVER olmalıdır.

...

Nasıl daha iyi söyleyeceğimi bilemiyorum - endeks fazladan boşluk içeren büyük ve şişman olmak istiyor. Güncellediğiniz bir sütunda - dizin girişini dizinden bir yere taşımak. Bir gün satır "A" koduna sahip, ertesi gün kod "G", sonra "Z" sonra "H" ve benzerleri. Bu nedenle, satır için dizin girişi dizinde bir yerden bir yere hareket eder. Öyle olduğu gibi, uzaya ihtiyacı var - olacaktır, eğer boşluk orada değilse, bloğu ikiye böler - ve alan yaratırız. Şimdi endeks şişmanlıyor. Zaman içinde endeks 2-3x büyüklüğündedir ve başladığın zaman “yarı ya da daha fazla boş” olur. Şimdi sıraları hareket ettirdiğimizde, oda yapmak için blokları bölmek zorunda değiliz - oda zaten mevcut.

Ardından gelip yeniden oluşturun veya düşürün ve yeniden yaratın (aynı etkilere sahip - sadece yeniden oluşturma "daha güvenlidir" - dizini kaybetme şansına sahip değildir ve dizin tarafından yeniden oluşturulabileceğinden daha hızlı olabilirsiniz) tabloyu taramak yerine varolan dizini taramak ve yeni bir dizin sıralamak ve oluşturmak). Şimdi, bu güzel alanın hepsi gitti. Blokları tekrar tekrar bölme işlemine başlıyoruz - bizi başladığımız yere geri götürüyoruz.

Yerden tasarruf etmediniz.

Endeks, olduğu gibi geri döndü.

Yeniden yapmak için zamanınızı boşa harcayacaksınız, bu kısır döngünün kendisini tekrar etmesi için.

Buradaki mantık sağlam, ancak yoğun okuma profiline karşı yanlı.

Bir "yağ" indeksi (yani çok fazla boşluk içeren) gerçekten de yeni ve taşınan satırlar için iyi bir yer tutar, böylece sayfa bölünmelerini azaltır ve yazılarınızı hızlı tutar. Bununla birlikte, bu yağ dizininden okuduğunuzda, aynı verileri almak için daha fazla sayfa okumanız gerekir, çünkü şimdi daha fazla boş alana el atıyorsunuz. Bu okurlarınızı yavaşlatır.

Bu nedenle, yoğun okuma veritabanlarında, dizinlerinizi düzenli olarak yeniden oluşturmak veya yeniden düzenlemek istersiniz. (Ne sıklıkta ve hangi koşullar altında? Matt M'nin zaten bu soruya somut bir cevabı var .) Kabaca eşdeğer okuma ve yazma aktivitesi yaşayan veritabanlarında veya yazma ağırlıklı veritabanlarında, büyük olasılıkla indeksleri yeniden oluşturarak veritabanınızın performansına zarar veriyorsunuzdur. düzenli olarak.


11

Çoğu insan onları düzenli olarak yeniden kurar, böylelikle asla parçalanmayacaklar. Onları yeniden inşa etmeniz gerektiğinde, ne kadar çabuk parçalandıklarına dayanır. Bazı endekslerin sık sık yeniden oluşturulması gerekecek, diğerleri ise temelde asla. SQLFool'ün bu konuyu sizin için halletmesini sağlayan bir senaryoyu inceleyin .


Sadece sevgili okuyucular için SQLFool'un senaryosunun> 5 yıldan beri güncellenmediği bir FYI, bu yüzden işini yaparken en yeni zilleri ve ıslıkları birleştirmeyebilir.
LowlyDBA

Aslında, siteyi en son kontrol ettiğimde (şimdi ulaşamıyorum (iyi bir işaret olmayabilir)), Michelle artık SQL Server'da aktif olarak çalışmıyordu ve senaryo üzerinde daha fazla çalışmak istemiyordu. . Sizin için çalışıyorsa, harika! Yeni kurulumlar için, Ola Hallengren'in senaryolarını düşünün : Her ikisini de kullandım ve zor bir geçiş değil.
RDFozz

7

Matt M tarafından kabul edilen cevapta belirtildiği gibi, ortak bir kural,% 30'un üzerinde parçalanmış endekslerin yeniden oluşturulması gerektiğidir.

Bu sorgu,% 30'dan fazla dizine sahip olduğunuz kaç dizine sahip olduğunuzu bulmanıza yardımcı olacaktır (bazılarında, bunları yeniden oluşturmanız gerekir):

SELECT DB_NAME() AS DBName,
       OBJECT_NAME(ind.object_id) AS TableName,
       ind.name AS IndexName,
       indexstats.index_type_desc AS IndexType,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages,
       SUM(p.rows) AS Rows 
  FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
         INNER JOIN sys.indexes AS ind ON (    ind.object_id = indexstats.object_id
                                           AND ind.index_id = indexstats.index_id)
         INNER JOIN sys.partitions AS p ON (    ind.object_id = p.object_id
                                            AND ind.index_id = p.index_id)
 WHERE indexstats.avg_fragmentation_in_percent > 30
 GROUP BY
       OBJECT_NAME(ind.object_id),
       ind.name,
       indexstats.index_type_desc,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages 
 ORDER BY indexstats.avg_fragmentation_in_percent DESC

1
Bu bir cevap vermiyor. Soru değil ben "x", sıkıştırma ile dizinleri bulmak nasıl, o "Ben endeksleri yeniden gerekirken" dir.
Max Vernon,

1
Bu soruya bir cevap vermiyor. Yeterli üne sahip olduğunuzda , herhangi bir gönderi hakkında yorum yapabileceksiniz ; bunun yerine, askerden açıklama gerektirmeyen cevaplar sağlayın . - Şu kaynaktan
LowlyDBA

2
@LowlyDBA - Biraz özlü olabilirdi, ancak soruyu yanıtladığını ve tartışmaya faydalı bir şey sağladığını düşünüyorum. Nasıl olduğunu açıklamak için biraz genişlettim. Amanda, eğer düzenlemem yanlış görünüyorsa, lütfen geri almaktan çekinmeyin!
RDFozz

Teşekkürler RDFozz. İyi görünüyor. Evet,% 30'un üzerinde parçalanmış yeniden inşa zamanı.
amandamaddox3

5

Dizinleri ne zaman yeniden oluşturmalıyım?

İndeks parçalanma yüzdesi% 30'dan fazla olduğunda.

Dizinleri düzenli olarak yeniden oluşturmak için bir durum var mı?

Böyle bir durum yok, ancak genel olarak, haftada bir kez Dizin Bakımı yapmak, haftasonu boyunca çevreyi istikrarlı tutmak için en iyi uygulamadır.

Ola Hallengren'in bakım senaryolarını kullanmanızı tavsiye ederim (en iyi bakım senaryoları), scriptleri ortamınıza göre özelleştirin ve haftasonu boyunca çalışacak şekilde programlayın.

https://ola.hallengren.com/

Not: Dizinleri yeniden oluşturduktan sonra istatistikleri güncellemeyi unutmayın, çünkü dizinleri yeniden oluşturmak tüm istatistikleri güncellemez.


Notunuzun yanlış olduğundan eminim. Bir dizin yeniden oluşturma, istatistikleri günceller. Bir dizin yeniden düzenlemek değil. Sadece dizine ilişkin nesnelerin istatistiklerini güncellemesine rağmen, tüm istatistikleri değil. Olduğu söyleniyor, parametre koklama nedeniyle yavaşlama olasılığını ve modası geçmiş istatistikler nedeniyle zayıf sorgu planları nedeniyle yavaşlama olasılığını azaltmak için istatistikleri sık sık güncellemenizi tavsiye ediyorum.
bmg002

1

BT'deki çoğu şeyde olduğu gibi, buna bağlı. Endeksleri yeniden oluşturarak hangi sorunu gidermeye çalışıyorsunuz? Sorunu gerçekten düzelttiğini gösterebilir misin? Eğer öyleyse, sorunu çözmek için yapmanız gereken en az bakım miktarını bulana kadar numaraları düzeltin.

Sorunu çözmezse veya bunu yapmanızın nedeni sadece izlemekte olduğunuz bazı ölçümleri yatıştırmaktır, çünkü işleri daha iyi yapabilir, o zaman yaptığınız tek şey CPU ve IO'yu yazmak ve muhtemelen sorununuzu daha da kötüleştirmektir.

Parçalanmanın düzeltilmesinin sunucunuz için herhangi bir fark yaratmayacağına dair bir argüman var, bu yüzden düzenli olarak yapmaya değer mi?

https://www.brentozar.com/archive/2017/12/index-maintenance-madness/

http://brentozar.com/go/defrag

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.