-
Notifications
You must be signed in to change notification settings - Fork 50
/
Detect too many VLFs.sql
83 lines (66 loc) · 1.61 KB
/
Detect too many VLFs.sql
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
74
75
76
77
78
79
80
81
82
83
-- Detect too many VLFs
-- Part of the SQL Server DBA Toolbox at https://github.com/DavidSchanzer/Sql-Server-DBA-Toolbox
-- This script lists all databases that have more than 1000 VLFs in their transaction log.
-- From: http://adventuresinsql.com/2009/12/a-busyaccidental-dbas-guide-to-managing-vlfs/
DECLARE @query VARCHAR(1000),
@dbname VARCHAR(1000),
@count INT;
SET NOCOUNT ON;
DECLARE csr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT name
FROM sys.databases
WHERE state_desc = 'ONLINE';
CREATE TABLE ##loginfo
(
dbname VARCHAR(100) NOT NULL,
num_of_rows INT NOT NULL
);
OPEN csr;
FETCH NEXT FROM csr
INTO @dbname;
WHILE (@@fetch_status <> -1)
BEGIN
CREATE TABLE #log_info
(
RecoveryUnitId TINYINT NOT NULL,
fileid TINYINT NOT NULL,
file_size BIGINT NOT NULL,
start_offset BIGINT NOT NULL,
FSeqNo INT NOT NULL,
[status] TINYINT NOT NULL,
parity TINYINT NOT NULL,
create_lsn NUMERIC(25, 0) NOT NULL
);
SET @query = 'DBCC loginfo (' + '''' + @dbname + ''') ';
INSERT INTO #log_info
(
RecoveryUnitId,
fileid,
file_size,
start_offset,
FSeqNo,
status,
parity,
create_lsn
)
EXEC (@query);
SET @count = @@rowcount;
DROP TABLE #log_info;
INSERT ##loginfo
(
dbname,
num_of_rows
)
VALUES
(@dbname, @count);
FETCH NEXT FROM csr
INTO @dbname;
END;
CLOSE csr;
DEALLOCATE csr;
SELECT dbname,
num_of_rows
FROM ##loginfo
WHERE num_of_rows >= 1000
ORDER BY num_of_rows DESC;
DROP TABLE ##loginfo;