SQL sunucusunda dizin yeniden oluşturma hızını artırın


9

Boş bir veritabanına büyük miktarda veri içeri aktarıyorum ve başlamadan önce tüm benzersiz olmayan kümelenmemiş dizinleri devre dışı bırakma performansını artırabilir görmek için devre dışı bıraktım.

Şimdi dizinleri yeniden etkinleştirmek istiyorum ve bunu optimize etmek için yapabileceğim bir şey olup olmadığını merak ediyorum.

100'den fazla tablo ve yeniden oluşturulacak yaklaşık 2.000 dizin var. Veritabanı 200 GB boyutunda.

Çalıştığım komut dosyasının anahtar bölümü şudur:

declare c_toggle_index cursor FORWARD_ONLY READ_ONLY for
    select  'alter index ' + QUOTENAME(i.name) + ' on ' + o.name + ' rebuild'
    from    sys.indexes as i
    Inner Join sys.objects o
    On o.object_id = i.object_id
    Where o.is_ms_shipped = 0
    And i.index_id >= 1
    and i.type > 1
    and i.is_disabled = 1

Alter index deyimi için ONLINE = OFF ayarını düşündüm, ancak dizinler devre dışı bırakıldıkça bu ayarın herhangi bir etkisi olacağını bilmiyordum. Ayrıca SORT_IN_TEMPDB = ON ayarını düşündüm, ancak tempdb dosyaları veritabanlarının .mdf dosyaları ile aynı sürücüde olduğu için bunu yapmanın da bir yararı olmadığını varsaydım.

Yeniden oluşturma komut dosyasını çalıştırırken çok fazla CXPACKET bekleme türü olduğunu fark ettim. Bunun neden olacağını veya ele almam gereken bir sorun olup olmadığını gerçekten anlamıyorum.

İlgili olabilecek son bir nokta: Sunucum şu anda veritabanına bu veri aktarımı dışında etkin değil. Dikkate alınacak veya endişelenecek başka kullanıcı etkinliği yoktur; benim tek endişe veri mümkün olan en kısa sürede veritabanına almak.


3
Tek endişenizin ithalat süresi olduğunu söylediğinizde, içe aktarmanın başlangıcından dizinleri yeniden etkinleştirmenin sonuna kadar geçen süreyi mi kastediyorsunuz? Öyleyse, içe aktarma sırasında dizinleri etkin bırakmanız yeterlidir. 200GB veri için 2.000 dizin bana çok fazla dizin gibi geliyor. Belki çıkartılabilecek bir şey olup olmadığını görmek için dizin kullanımı DMV'lerine bakmalısınız.
Max Vernon

1
Açıklığa kavuşturmak için, aynı 200 GB'lık içe aktarmayı yalnızca bir kez değil, tekrar tekrar yapmanız mı gerekiyor?
Jon Seigel

1
Ben sadece bir kez alma yapmak gerekir ama sınırlı bir zaman penceresi ile daha büyük bir sürecin bir parçası olarak, bu yüzden şu anda bu pencereye sığdırmak için bu süreci test ediyorum. @MaxVernon Dizinleri etkin bırakmanın en hızlı yolu olduğu doğru gibi görünüyor, ancak dizinleri devre dışı bırakmanın, verileri içe aktarmanın ve ardından dizinleri yeniden etkinleştirmenin normalde daha hızlı olduğunu okuduğum için şaşırdım. Bu bir üçüncü taraf veritabanıdır, bu nedenle dizinleri kaldırmak veya başka bir şekilde değiştirmek gerçekten mümkün değildir.
paulH

3
Tamam. Hakkında CXPACKETbekler: endeksi kendileri tarama indeksleri (hatta endeks yeniden oluşturur olmanın yeniden inşa ) ve bu taramalar paralellik kullanabilirsiniz. Bu beklemeler hakkında endişelenmemelisiniz - paralellik muhtemelen yardımcı olmaktadır.
Jon Seigel

Yanıtlar:


10

Bu senaryoda en uygun içe aktarma performansına ulaşmak üç şey gerektirir:

  1. Minimal olarak kaydedilmiş temel tablo ekleri
  2. En az günlüğe kaydedilen kümelenmemiş dizin yapıları
  3. Fiziksel okumalardan kaçınma

Minimum Günlük Kaydı

Kümelenmemiş dizinler olmadan boş bir kümelenmiş tabloya minimal olarak kaydedilmiş ekler elde etmek için şunlar gerekir:

  1. Ya kullanma SIMPLEveya BULK_LOGGEDveritabanı kurtarma modelleri
  2. Tablo kilidi ve sıralı giriş belirtme (örn. TABLOCKVe ORDERipuçları)

Kenar notu:

İzleme bayrağı 610 etkinleştirilmişse kümelenmemiş dizinleri olan kümelenmiş bir tabloya minimal olarak günlüğe eklenen ekler elde etmek de mümkündür. Kümelenmemiş dizin eklerinin en az günlüğe kaydedilip kaydedilmeyeceği, sorgu optimize edici tarafından seçilen sorgu planına bağlıdır.

Sorgu planı, kümelenmemiş dizin için ayrı bir yineleyici kullanıyorsa ve yineleyici DMLRequestSortözelliği olarak ayarlanmışsa true, kümelenmemiş dizin ekleri, daha önce belirtilen diğer koşulların karşılanması koşuluyla, minimum olarak günlüğe kaydedilir.

Kümelenmemiş dizinleri ayrı ayrı oluşturma

Bunu yapmanın avantajları:

  1. Kümelenmiş dizin eklentileri, TF 610 etkinleştirilmeden minimum düzeyde kaydedilebilir
  2. CREATE INDEX kurtarma modeli değilse en az günlüğe kaydedilir FULL

Fiziksel okumalardan kaçınma

İdeal olarak, içe aktarılacak veriler ayrı bir makinede veya en azından veritabanını barındırmak için kullanılandan ayrı bir fiziksel depolama alanında depolanır.

Veritabanı sunucusunun önbellekteki en büyük temel tabloyu tutmak için yeterli belleğe sahip olması ve kümelenmemiş dizinler oluştururken gereken sıralama işlemleri için yeterli miktarda belleğe sahip olması gerekir.

İyi bir örüntü, temel tabloyu hızlı bir şekilde yüklemek (minimum düzeyde günlüğe kümelenmiş dizin yükü) ve daha sonra veri sayfaları hala önbelleğe alınırken bu tablo için kümelenmemiş tüm dizinleri oluşturmaktır.

Soru, önce temel tabloların yüklendiği ve ardından kümelenmemiş dizinlerin oluşturulduğu bir işlemi özetlemektedir. İmleç tanımı , aynı tablodaki kümelenmemiş dizin yapılarını en azından gruplandırmak için bir ORDER BYyan tümce kullanmaz .

Muhtemel sonuç, farklı tablolara ait veri sayfalarının tekrar tekrar önbelleğe okunması ve daha sonra kümelenmemiş dizinlerin deterministik olmayan bir sırada oluşturulduğu gibi atılmasıdır .

Tekrarlanan fiziksel okumaların maliyeti, kümelenmemiş indekslerin ayrı ayrı oluşturulmasıyla elde edilen minimum kayıt tutmanın faydalarına tamamen hakimdir. Bu, varolan dizinlere sahip tabloların yüklenmesinin neden daha hızlı olduğunu bulduğunuzu açıklar (çünkü belirli bir tablo için kümelenmemiş tüm dizinler sonraki tabloya geçmeden önce korunur).

özet

İçe aktarma işlemi, her seferinde bir tabloyu toplu olarak yüklemek için yeniden çalışılmalıdır. Bu, tabloyu yüklemek ve bir sonrakine geçmeden önce tüm kümelenmemiş dizinleri oluşturmak anlamına gelir. SQL Server örneği , aynı anda en büyük tabloyu tutmak ve kümelenmemiş en büyük dizin sıralamasını gerçekleştirmek için yeterli belleğe sahip olmalıdır .

Sen olabilir ayrıca zaten yerinde kümelenmemiş dizinleri ile tablolarına veri yüklemeden önce TF 610 etkinleştirmeyi deneyin. Bu genellikle önceki yöntem kadar hızlı değildir, ancak yeterince hızlı olabilir.

Daha fazla bilgi için aşağıdakilere bakın:

Veri Yükleme Performansı Kılavuzu

Minimal Günlüğe Kaydedilebilecek İşlemler

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.