sql >> Database >  >> RDS >> Sqlserver

Automatisch huidige indexen verwijderen en opnieuw maken

Ik heb een script dat ik gebruik om de systeemtabellen te doorzoeken om alle niet-geclusterde indexen vast te leggen en uit te schakelen en vervolgens opnieuw op te bouwen na voltooiing. Het onderstaande is voor gebruik in de standaardeditie, als u zakelijk werkt, zou ik de ONLINE . toevoegen optie.

Uitschakelen

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)

Herbouwen

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);

Ik vind deze methode leuk omdat deze zeer aanpasbaar is, omdat je bepaalde tabellen kunt uitsluiten/opnemen op basis van de voorwaarden en een cursor kunt vermijden. U kunt ook de EXEC . wijzigen naar een PRINT en bekijk de code die wordt uitgevoerd en voer deze handmatig uit.

Voorwaarde om een ​​tafel uit te sluiten

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


  1. 4 manieren om dubbele rijen te vinden in MySQL

  2. Alternatieven voor array_agg()?

  3. Verzamelfuncties gebruiken in SQL-query

  4. RDSdataService execute_statement retourneert (BadRequestException)