-
Notifications
You must be signed in to change notification settings - Fork 101
Expand file tree
/
Copy pathОбслуживание индексов (простой).sql
More file actions
73 lines (60 loc) · 2.12 KB
/
Обслуживание индексов (простой).sql
File metadata and controls
73 lines (60 loc) · 2.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
SET NOCOUNT ON;
DECLARE -- Служебные переменные
@ObjectID INT
,@IndexID INT
,@PartitionCount BIGINT
,@SchemaName SYSNAME
,@ObjectName SYSNAME
,@IndexName SYSNAME
,@PartitionNum BIGINT
,@frag FLOAT
,@Command NVARCHAR(4000)
,@DBID SMALLINT = DB_ID();
IF OBJECT_ID('tempdb..#MaintenanceCommands') IS NOT NULL
DROP TABLE #MaintenanceCommands;
SELECT
[object_id] AS [objectid],
[index_id] AS [indexid],
[partition_number] AS [partitionnum],
MAX([avg_fragmentation_in_percent]) AS [frag],
MAX([page_count]) AS [page_count],
SUM([si].[rowmodctr]) AS [rowmodctr]
INTO #MaintenanceCommands
FROM sys.dm_db_index_physical_stats (@DBID, NULL, NULL , NULL, N'LIMITED') dt
LEFT JOIN sys.sysindexes si
ON dt.object_id = si.id
WHERE [avg_fragmentation_in_percent] > 10.0
AND [index_id] > 0
AND [page_count] > 25
GROUP BY [object_id]
,[index_id]
,[partition_number];
DECLARE partitions CURSOR FOR SELECT objectid, indexid, partitionnum, frag
FROM #MaintenanceCommands;
OPEN partitions;
WHILE (1=1)
BEGIN
FETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag;
IF @@FETCH_STATUS < 0 BREAK;
SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
FROM sys.objects AS o
JOIN sys.schemas AS s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;
SELECT @indexname = QUOTENAME(name)
FROM sys.indexes
WHERE object_id = @objectid AND index_id = @indexid;
SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid;
IF @frag < 30.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
IF @frag >= 30.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
IF @partitioncount > 1
SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));
EXEC (@command);
END;
CLOSE partitions;
DEALLOCATE partitions;
IF OBJECT_ID('tempdb..#MaintenanceCommands') IS NOT NULL
DROP TABLE #MaintenanceCommands;