2012-07-02 17 views
5

Tabloları toplu olarak güncelleştirmeye izin vermek için bir yöntem sağlamaya çalışıyorum (güncelleme başına 1 milyondan fazla yeni veya güncellenmiş satır) ve geçerli dizinleri düşürmek ve güncelleştirmelerden sonra yeniden oluşturmak istemiştim.Geçerli dizinleri Otomatik Olarak Bırak ve Yeniden Oluştur

Herkesin bu işlemlerin gevşek bir şekilde eşleşmesini sağlayacak bir komut dosyası olup olmadığını merak ediyorum, böylece dizinler zaman içinde değişiyorsa, güncelleştirme işlemi değişmez.

Bu, toplumun zaten çözdüğü şeylerden biri gibi görünüyor.

+2

Lütfen uygun etiketi (Oracle, SQL Server, MySQL vb.) Ekleyerek hedeflediğiniz RDBMS'yi belirtin. Evrensel olarak desteklenmeyen dil veya ürün özelliklerinden yararlanan yanıtlar var. Ayrıca, belirli bir RDBMS ile etiketleyerek sorunuza, sorunuzu yanıtlamak için daha uygun olan kişilerden dikkat alabilirsiniz. – Ben

cevap

10

Tüm kümelenmemiş dizinleri yakalamak için sistem tablolarını sorgulamak için kullandığım komut dosyası var ve devre dışı bırakıldıktan sonra yeniden oluştur. Aşağıdaki standart sürümde kullanım içindir, eğer şirkette iseniz ONLINE seçeneğini ekleyebilirim. Çok özelleştirilebilir olarak

Devre Dışı

DECLARE @sql AS VARCHAR(MAX); 
SET @sql = ''; 
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] DISABLE; ' 
FROM sys.indexes AS i 
JOIN sys.objects AS o ON i.object_id = o.object_id 
WHERE i.type_desc = 'NONCLUSTERED' 
AND o.type_desc = 'USER_TABLE' 

EXEC (@sql) 

/a önlemesinin yanı sıra koşullara dayalı bazı tablolar dahil hariç tutabileceğiniz gibi bu yöntemi gibi

DECLARE @sql AS VARCHAR(MAX); 
SET @sql = ''; 
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] REBUILD WITH (FILLFACTOR = 80); ' 
FROM sys.indexes AS i 
JOIN sys.objects AS o ON i.object_id = o.object_id 
WHERE i.type_desc = 'NONCLUSTERED' 
AND o.type_desc = 'USER_TABLE' 

EXEC (@sql); 

Yeniden imleç. Ayrıca, EXEC'u PRINT'a değiştirebilir ve yürütecek ve manuel olarak çalıştıracağınız kodu görebilirsiniz.

Durumu

+1

Harika! sadece IN IN'i tersine çevirmek için gidiyor. Düşüşten çok daha kolay ve –

+1

yapmaya çalıştığım şeyleri yaratabilirsiniz. Ayrıca sys.tables 'yerine' sys.objects' kullanabilirsiniz ve her zaman 'WHERE o.type_desc =' USER_TABLE 'değerini belirtmek zorunda kalabilirsiniz. .... –

4
EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? DISABLE' 

AND o.name NOT IN ('tblTest','tblTest1'); 
ve

EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? REBUILD' 

tüm tablolar ve her dizin için bunu yapmak istiyorsanız tek ihtiyacınız olan bir tablo dışlamak için.

+0

Onunla bir sorunum var. Tablo devre dışı bırakıldığında, Kümelenmiş dizini devre dışı bırakılmış tabloları eklenen satırları alamaz. – Stoleg

+0

Lütfen bunu bağımsız bir soru olarak sorun. Çok az bilgi var ... – fancyPants

+0

'INSERT INTO', devre dışı küme dizini olan bir tabloda başarısız oluyor. Devre dışı kümelenmiş dizini olan bir tablodaki veri satırları yalnızca bırakma veya yeniden oluşturma işlemleri için kullanılabilir. – Stoleg

İlgili konular