sql:reidexsusdb
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
sql:reidexsusdb [12.08.2021 12:24] – Ladislav Vojtíšek | sql:reidexsusdb [12.08.2021 13:00] (aktuální) – Ladislav Vojtíšek | ||
---|---|---|---|
Řádek 3: | Řádek 3: | ||
* Identifikace fragmentovaných indexů a jejich defragmentace.\\ | * Identifikace fragmentovaných indexů a jejich defragmentace.\\ | ||
- | * Aktualizace potenciálně zastaralých statistik tabulek. | + | * Aktualizace potenciálně zastaralých statistik tabulek.\\ |
+ | |||
+ | USE SUSDB; | ||
+ | GO | ||
+ | SET NOCOUNT ON; | ||
+ | |||
+ | -- Rebuild or reorganize indexes based on their fragmentation levels | ||
+ | DECLARE @work_to_do TABLE ( | ||
+ | objectid int | ||
+ | , indexid int | ||
+ | , pagedensity float | ||
+ | , fragmentation float | ||
+ | , numrows int | ||
+ | ) | ||
+ | |||
+ | DECLARE @objectid int; | ||
+ | DECLARE @indexid int; | ||
+ | DECLARE @schemaname nvarchar(130); | ||
+ | DECLARE @objectname nvarchar(130); | ||
+ | DECLARE @indexname nvarchar(130); | ||
+ | DECLARE @numrows int | ||
+ | DECLARE @density float; | ||
+ | DECLARE @fragmentation float; | ||
+ | DECLARE @command nvarchar(4000); | ||
+ | DECLARE @fillfactorset bit | ||
+ | DECLARE @numpages int | ||
+ | |||
+ | -- Select indexes that need to be defragmented based on the following | ||
+ | -- * Page density is low | ||
+ | -- * External fragmentation is high in relation to index size | ||
+ | PRINT ' | ||
+ | INSERT @work_to_do | ||
+ | SELECT | ||
+ | f.object_id | ||
+ | , index_id | ||
+ | , avg_page_space_used_in_percent | ||
+ | , avg_fragmentation_in_percent | ||
+ | , record_count | ||
+ | FROM | ||
+ | sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, ' | ||
+ | WHERE | ||
+ | (f.avg_page_space_used_in_percent < 85.0 and f.avg_page_space_used_in_percent/ | ||
+ | or (f.page_count > 50 and f.avg_fragmentation_in_percent > 15.0) | ||
+ | or (f.page_count > 10 and f.avg_fragmentation_in_percent > 80.0) | ||
+ | |||
+ | PRINT ' | ||
+ | |||
+ | PRINT ' | ||
+ | |||
+ | SELECT @numpages = sum(ps.used_page_count) | ||
+ | FROM | ||
+ | @work_to_do AS fi | ||
+ | INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id | ||
+ | INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id | ||
+ | |||
+ | -- Declare the cursor for the list of indexes to be processed. | ||
+ | DECLARE curIndexes CURSOR FOR SELECT * FROM @work_to_do | ||
+ | |||
+ | -- Open the cursor. | ||
+ | OPEN curIndexes | ||
+ | |||
+ | -- Loop through the indexes | ||
+ | WHILE (1=1) | ||
+ | BEGIN | ||
+ | FETCH NEXT FROM curIndexes | ||
+ | INTO @objectid, @indexid, @density, @fragmentation, | ||
+ | IF @@FETCH_STATUS < 0 BREAK; | ||
+ | |||
+ | SELECT | ||
+ | @objectname = QUOTENAME(o.name) | ||
+ | , @schemaname = QUOTENAME(s.name) | ||
+ | FROM | ||
+ | sys.objects AS o | ||
+ | INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id | ||
+ | WHERE | ||
+ | o.object_id = @objectid; | ||
+ | |||
+ | SELECT | ||
+ | @indexname = QUOTENAME(name) | ||
+ | , @fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END | ||
+ | FROM | ||
+ | sys.indexes | ||
+ | WHERE | ||
+ | object_id = @objectid AND index_id = @indexid; | ||
+ | |||
+ | IF ((@density BETWEEN 75.0 AND 85.0) AND @fillfactorset = 1) OR (@fragmentation < 30.0) | ||
+ | SET @command = N' | ||
+ | ELSE IF @numrows >= 5000 AND @fillfactorset = 0 | ||
+ | SET @command = N' | ||
+ | ELSE | ||
+ | SET @command = N' | ||
+ | PRINT convert(nvarchar, | ||
+ | EXEC (@command); | ||
+ | PRINT convert(nvarchar, | ||
+ | END | ||
+ | |||
+ | -- Close and deallocate the cursor. | ||
+ | CLOSE curIndexes; | ||
+ | DEALLOCATE curIndexes; | ||
+ | |||
+ | |||
+ | IF EXISTS (SELECT * FROM @work_to_do) | ||
+ | BEGIN | ||
+ | PRINT ' | ||
+ | SELECT @numpages = @numpages - sum(ps.used_page_count) | ||
+ | FROM | ||
+ | @work_to_do AS fi | ||
+ | INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id | ||
+ | INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id | ||
+ | |||
+ | PRINT ' | ||
+ | END | ||
+ | GO | ||
+ | |||
+ | |||
+ | --Update all statistics | ||
+ | PRINT ' | ||
+ | EXEC sp_updatestats | ||
+ | PRINT 'Done updating statistics.' | ||
+ | GO |
sql/reidexsusdb.1628771048.txt.gz · Poslední úprava: 12.08.2021 12:24 autor: Ladislav Vojtíšek