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.
CXPACKET
bekler: 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.