2017-10-27 1 views
1

T-SQL 스크립트를 찾고 있는데 인덱스가 올바르게 명명되었는지 확인할 수 있습니다.SQL Server 인덱스 - 명명 규칙 확인

PK_ for primary keys 
UK_ for unique keys 
IX_ for non clustered non unique indexes 
UX_ for unique indexes 

나아가, 인덱스 (까다로운 부분)의 명명 : 스크립트의이 유형 거기

IX_Column1_Column2 - instead of IX_CrazyIndexWhichFixesPerformance 

누군가?

+1

이 * 아스 커 보이는 나에게 @HoneyBadger *이 컨벤션을 가지고 있으며, 스크립트를 원한다 * 뒤따라 있는지 확인하십시오. * ... – AakashM

+0

Correct @AakashM –

답변

0

은 이걸로 끝났다 - 꽤하지 않을 수 있지만, 위해 일을 얻는다 지금 :-)

WITH indexesCTE 
AS 
(
    SELECT 
     t.name AS TableName 
     , i.name AS IndexName 
     , i.index_id AS IndexId 
     , ic.index_column_id AS ColumnId 
     , t.object_id AS TableId 
     , REPLACE(c.name, '_', '') AS ColumnName 
     , i.object_id AS IndexObjectId 
    FROM sys.indexes i 
    INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id and i.index_id = ic.index_id 
    INNER JOIN sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id 
    INNER JOIN sys.tables t ON i.object_id = t.object_id 
    WHERE 
     i.is_primary_key = 0 
     AND i.is_unique = 0 
     AND i.is_unique_constraint = 0 
     AND t.is_ms_shipped = 0 
) 
, indexNameProposal 
AS 
(
SELECT i.TableName 
     , i.IndexName AS CurrentIndexName 
     , 'IX' + STUFF((SELECT '_' + i2.ColumnName FROM indexesCTE i2 WHERE i2.IndexId = i.IndexId AND i.TableId = i2.TableId FOR XML PATH('')),1,0,'') AS IndexNameProposal 
     FROM indexesCTE i 
     GROUP BY i.TableName, i.IndexName, i.TableId, i.IndexId 
) 
SELECT 
    * 
    FROM indexNameProposal i 
    WHERE i.CurrentIndexName <> i.IndexNameProposal 
1

개체 카탈로그 뷰 (sys. *)를 사용하면 쉽게 수행 할 수 있습니다.

어떻게 접근하고 싶은지에 달려 있습니다.이 모든 것을 확인하기위한 완전한 절차를 작성할 수 있습니다. 위와 정확히 일치하는 코드는 없지만 올바른 방향으로 설정해야합니다.

SELECT distinct 
i.name AS index_name, 
i.object_id 
from 
sys.indexes i 
where 
i.is_primary_key = 1 
and i.name not like 'PK_%' 

그것은 특정 키 제한 조건에 대한 필터링 sys.objects 테이블을 사용하는 문제가 될 것입니다 : 기본 키 확인을 위해

, 당신은 당신의 이름 지정 체계에 맞지 않는 기본 키를 찾을 수 있습니다. 당신은 하나 개의 필드에 열 이름을 연결하기를 원할 것입니다, 당신은 FOR XML PATH('')

에이 정보 플러스의주의 깊은 조작을 볼 필요가있을 것이다

SELECT distinct 
c.name AS column_name, 
i.name AS index_name, 
i.object_id 
from 
sys.indexes i 
inner join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
inner join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id 

: 열이 들어

sys.index_columnssys.columns을 통해 가입 이러한 명명 규칙을 사용하면 이러한 검사를 수행 할 수 있습니다.