CREATE VIEW dbo.INDEXVIEW
AS
/****************************************************************************************************
**
Creation Date: ?
** Modif Date : Nov. 27, 2002
** Created By :
avigneau
** Database : any
** Description : Reports on all indexes
and / or heaps on user tables within a database
** Parameters : none
**
Compatibility: SQL Server 6.X, 7.0, 2000
** Remark : System tables are
used to be compatible with version 6.x.
But I believe it would still
be difficult to obtain the same results
using
INFORMATION_SCHEMA views and new object and system property functions.
**
Example : SELECT 'Showing All Indexes' AS Comments, I.*
FROM
dbo.INDEXVIEW I
SELECT 'Showing Tables with Missing Clustered index'
AS Comments, I.*
FROM dbo.INDEXVIEW I
WHERE ClusterType =
'HEAP'
SELECT 'Showing Tables with Missing Primary Keys' AS Comments,
I.*
FROM dbo.INDEXVIEW I
LEFT OUTER JOIN dbo.INDEXVIEW
I2
ON I.TableID = I2.TableID AND I2.UniqueType = 'PRIMARY
KEY'
WHERE I2.TableID IS NULL
SELECT 'Showing Possible
Redundant Index keys' AS Comments, I.*
FROM dbo.INDEXVIEW
I
JOIN dbo.INDEXVIEW I2
ON I.TableID = I2.TableID AND
I.ColName1 = I2.ColName1
AND I.IndexName <>
I2.IndexName
SELECT 'Showing Possible Reverse Index keys' AS Comments,
I.*
FROM dbo.INDEXVIEW I
JOIN dbo.INDEXVIEW
I2
ON I.TableID = I2.TableID AND I.ColName1 = I2.ColName2
AND I.ColName2 = I2.ColName1 AND I.IndexName <>
I2.IndexName
************************************************************************************************/
SELECT o.id AS TableID ,u.name Owner,o.name TableName,
i.Indid AS
IndexID
, CASE i.name
WHEN o.name THEN '** NONE **'
ELSE i.name
END AS IndexName,
CASE i.indid
WHEN 1 THEN 'CLUSTERED'
WHEN 0 THEN 'HEAP'
ELSE 'NONCLUSTERED' END AS
ClusterType,
CASE
WHEN (i.status & 2048) > 0 THEN 'PRIMARY
KEY'
WHEN (i.status & (2|4096)) > 0 THEN 'UNIQUE'
ELSE ''
END AS UniqueType,
CASE
WHEN (i.status & (2048)) > 0
OR ((i.status & (4096)) > 0 )
THEN 'CONSTRAINT'
WHEN i.indid = 0 THEN ' '
ELSE 'INDEX' END AS IndexType,
-- This
following part is non essential
-- It is a pre char aggregate I use in other
scripts
-- to generate create and drop scripts
CASE
WHEN
INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 1) IS NULL THEN ''
ELSE
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid, 1) END +
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 2) IS NULL THEN ''
ELSE ', '+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,2) END
+
CASE
WHEN INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,
3) IS NULL THEN ''
ELSE ', '+INDEX_COL(u.name+'.'+QUOTENAME(o.name),
i.indid,3) END +
CASE
WHEN
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid, 4) IS NULL THEN ''
ELSE
', '+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,4) END +
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 5) IS NULL THEN ''
ELSE ', '+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,5) END
+
CASE
WHEN INDEX_COL(u.name+'.'+QUOTENAME(o.name),
i.indid, 6) IS NULL THEN ''
ELSE ',
'+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,6) END +
CASE
WHEN INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid, 7) IS NULL THEN ''
ELSE ', '+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid, 7) END
+
CASE
WHEN INDEX_COL(u.name+'.'+QUOTENAME(o.name),
i.indid, 8) IS NULL THEN ''
ELSE ',
'+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,8) END +
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 9) IS NULL THEN ''
ELSE ', '+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,9) END
+
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name),
i.indid, 10) IS NULL THEN ''
ELSE ',
'+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,10) END +
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 11) IS NULL THEN
''
ELSE ', '+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,11) END
+
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name),
i.indid, 12) IS NULL THEN ''
ELSE ',
'+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,12) END +
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 13) IS NULL THEN
''
ELSE ', '+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,13) END
+
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name),
i.indid, 14) IS NULL THEN ''
ELSE ',
'+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,14) END +
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 15) IS NULL THEN
''
ELSE ', '+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,15) END
+
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name),
i.indid, 16) IS NULL THEN ''
ELSE ',
'+INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,16) END AS AllColName,
--
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name),
i.indid, 1) IS NULL THEN ''
ELSE INDEX_COL(u.name+'.'+QUOTENAME(o.name),
i.indid,1) END AS ColName1,
CASE
WHEN
INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 2) IS NULL THEN ''
ELSE
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,2) END AS
ColName2,
CASE
WHEN INDEX_COL(u.name+'.'+QUOTENAME(o.name),
i.indid, 3) IS NULL THEN ''
ELSE INDEX_COL(u.name+'.'+QUOTENAME(o.name),
i.indid,3) END AS ColName3,
CASE
WHEN
INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 4) IS NULL THEN ''
ELSE
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,4) END AS ColName4,
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 5) IS
NULL THEN ''
ELSE INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,5) END
AS ColName5,
CASE
WHEN INDEX_COL(u.name+'.'+
QUOTENAME(o.name), i.indid, 6) IS NULL THEN ''
ELSE
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,6) END AS ColName6,
CASE
WHEN INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid, 7) IS
NULL THEN ''
ELSE INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,7) END
AS ColName7,
CASE
WHEN INDEX_COL(u.name+'.'+
QUOTENAME(o.name), i.indid, 8) IS NULL THEN ''
ELSE
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,8) END AS ColName8,
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 9) IS
NULL THEN ''
ELSE INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,9) END
AS ColName9,
CASE
WHEN INDEX_COL(u.name+'.'+
QUOTENAME(o.name), i.indid, 10) IS NULL THEN ''
ELSE
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,10) END AS ColName10,
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 11) IS
NULL THEN ''
ELSE INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,11) END
AS ColName11,
CASE
WHEN INDEX_COL(u.name+'.'+
QUOTENAME(o.name), i.indid, 12) IS NULL THEN ''
ELSE
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,12) END AS ColName12,
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 13) IS
NULL THEN ''
ELSE INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,13) END
AS ColName13,
CASE
WHEN INDEX_COL(u.name+'.'+
QUOTENAME(o.name), i.indid, 14) IS NULL THEN ''
ELSE
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,14) END AS ColName14,
CASE
WHEN INDEX_COL(u.name+'.'+ QUOTENAME(o.name), i.indid, 15) IS
NULL THEN ''
ELSE INDEX_COL(u.name+'.'+QUOTENAME (o.name), i.indid,15) END
AS ColName15,
CASE
WHEN INDEX_COL(u.name+'.'+
QUOTENAME(o.name), i.indid, 16) IS NULL THEN ''
ELSE
INDEX_COL(u.name+'.'+QUOTENAME(o.name), i.indid,16) END AS ColName16
FROM
sysobjects o (NOLOCK)
LEFT OUTER JOIN sysindexes i (NOLOCK)
ON o.id =
i.id
JOIN sysusers u (NOLOCK)
ON o.uid = u.uid
WHERE o.type =
'U' AND i.indid < 255
AND o.name NOT IN ('dtproperties')
AND i.name
NOT LIKE '_WA_Sys_%'
-- because of SQL Server 7.0
GO
SELECT 'Showing All Indexes' AS Comments, I.*
FROM dbo.INDEXVIEW
I
GO
SELECT 'Showing Tables with Missing Clustered index' AS Comments,
I.*
FROM dbo.INDEXVIEW I
WHERE ClusterType = 'HEAP'
GO
SELECT
'Showing Tables with Missing Primary Keys' AS Comments, I.*
FROM
dbo.INDEXVIEW I
LEFT OUTER JOIN dbo.INDEXVIEW I2
ON I.TableID =
I2.TableID
AND I2.UniqueType = 'PRIMARY KEY'
WHERE I2.TableID IS
NULL
GO
SELECT 'Showing Possible Redundant Index keys' AS Comments ,
I.*
FROM dbo.INDEXVIEW I
JOIN dbo.INDEXVIEW I2
ON I.TableID =
I2.TableID
AND I.ColName1 = I2.ColName1
AND I.IndexName <>
I2.IndexName
ORDER BY I.TableName,I.IndexName
GO
SELECT 'Showing
Possible Reverse Index keys' AS Comments , I.*
FROM dbo.INDEXVIEW
I
JOIN dbo.INDEXVIEW I2
ON I.TableID = I2.TableID
AND I.ColName1
= I2.ColName2
AND I.ColName2 = I2.ColName1
AND I.IndexName <>
I2.IndexName
GO
DROP VIEW INDEXVIEW
GO
http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=PDSCODE&intSeq=20
'연구개발 > DBA' 카테고리의 다른 글
SS2000 - 현재 캐시된 내용 조회하기 (0) | 2010.07.27 |
---|---|
디스크 사이즈 정보 읽어오는 스크립트 (0) | 2010.07.27 |
SQL Server 2008 한방 설치~ (0) | 2010.07.21 |
현재 sql server 에서 가장 많은 부하를 일으키는 spid 와 쿼리 내용은? (0) | 2010.07.20 |
대용량 데이터베이스 통계 옵션 설정 (0) | 2010.07.19 |