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:23] – Ladislav Vojtíšek | sql:reidexsusdb [12.08.2021 13:00] (aktuální) – Ladislav Vojtíšek | ||
|---|---|---|---|
| Řádek 2: | Řádek 2: | ||
| Spuštěním tohoto skriptu provedete základní úlohy údržby na databázi SUSDB: | Spuštěním tohoto skriptu provedete základní úlohy údržby na databázi SUSDB: | ||
| - | * 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.1628771020.txt.gz · Poslední úprava: 12.08.2021 12:23 autor: Ladislav Vojtíšek
