SQLUSA

Microsoft SQL Server 2000 Best Practices

How to "fingerpint" a database quickly?

 

The DatabaseFingerprint stored procedure will return the following information for each table: rows, data size in MB, index size in MB:

 

USE DatabaseZ
CREATE PROC DatabaseFingerprint @DBName sysname
AS
BEGIN

DECLARE @DynamicSQL varchar(1024), @bytes int

SET NOCOUNT ON


SELECT @bytes = [low]/1024 FROM master..spt_values
WHERE number = 1
AND type = 'E'

CREATE TABLE #Fingerprint (
id int NULL,
TableName sysname NULL,
NoOfRows money NULL,
DataInMB money NULL,
IndexInMB money NULL)

SET @DynamicSQL =
'INSERT INTO #Fingerprint (id, TableName)
SELECT id, name FROM ' + @DBName + '..sysobjects
WHERE xtype = ''U'''

EXEC (@DynamicSQL)


SET @DynamicSQL =
'UPDATE #Fingerprint
SET NoOfRows = A.rows
FROM ' + @DBName + '..sysindexes A
WHERE #Fingerprint.id = A.id
AND A.indid IN (0, 1)'

EXEC (@DynamicSQL)

SET @DynamicSQL =
'UPDATE #Fingerprint
SET DataInMB = C.DataInMB
FROM (SELECT A.id, A.SumDpages + ISNULL(B.SumUsed, 0) AS DataInMB
FROM (SELECT id, SUM(dpages) AS SumDpages
FROM ' + @DBName + '..sysindexes
WHERE indid IN (0, 1)
GROUP BY id) AS A
LEFT JOIN
(SELECT id, ISNULL(SUM(used), 0) AS SumUsed
FROM ' + @DBName + '..sysindexes
WHERE indid = 255
GROUP BY id) AS B
ON A.id = B.id) AS C
JOIN #Fingerprint ON C.id = #Fingerprint.id'

EXEC (@DynamicSQL)


SET @DynamicSQL =
'UPDATE #Fingerprint
SET IndexInMB = A.SumUsed - #Fingerprint.DataInMB
FROM (SELECT id, SUM(used) AS SumUsed
FROM ' + @DBName + '..sysindexes
WHERE indid IN (0, 1, 255)
GROUP BY id) AS A
JOIN #Fingerprint ON A.id = #Fingerprint.id'

EXEC (@DynamicSQL)


UPDATE #Fingerprint
SET DataInMB = DataInMB * @bytes,
IndexInMB = IndexInMB * @bytes


SELECT TableName,
Rows=left(convert(varchar, NoOfRows,1),len(convert(varchar, NoOfRows,1))-3),
DataInMB=convert(varchar,DataInMB/1024,1),
IndexInMB=convert(varchar,IndexInMB/1024,1)
FROM #Fingerprint ORDER BY NoOfRows desc
END

-- exec DatabaseFingerprint DatabaseX

 


American Standard in SQL Server Training
 
SQLUSA.com Home Page