2014-06-09 5 views
2

테이블의 단일 열에 인덱스가 정의되어 있습니다. 인덱스가 한 열에 존재하는지 여부를 확인하려면 다음 쿼리를 사용하고 있습니다. 이것은 작동하는 것 같지만 이것을 수행하는 더 좋은 방법이 있습니까? stackoverflow에 다른 솔루션을 보았지만 잘 작동하지 않는 것 같습니다.인덱스가 테이블 열에 있는지 확인하십시오.

SELECT MIN(ColumnsCount) FROM 
    (
    SELECT COUNT(*) AS ColumnsCount, 
      SysIndex.name 
    FROM sys.indexes As SysIndex 
     Inner Join sys.index_columns As SysIndexCol On SysIndex.object_id = SysIndexCol.object_id And SysIndex.index_id = SysIndexCol.index_id 
     Inner Join sys.columns As SysCols On SysIndexCol.column_id = SysCols.column_id And SysIndexCol.object_id = SysCols.object_id 
    WHERE SysIndex.name 
    in 
    (
    Select 
     SysIndex.name 
    From 
     sys.indexes As SysIndex 
     Inner Join sys.index_columns As SysIndexCol On SysIndex.object_id = SysIndexCol.object_id And SysIndex.index_id = SysIndexCol.index_id 
     Inner Join sys.columns As SysCols On SysIndexCol.column_id = SysCols.column_id And SysIndexCol.object_id = SysCols.object_id 
    Where 
     type <> 0 
     And SysIndex.object_id in (Select systbl.object_id from sys.tables as systbl Where SysTbl.name = 'TableName') 
     And SysCols.name = 'ColName' 
    ) 
    GROUP BY SysIndex.name) A 

답변

3

검색하는 것은 주어진 테이블의 인덱스에 사용되는 가장 낮은 수의 열입니다. 인덱스에는 주어진 열이 포함됩니다.

SELECT TOP 1 ColumnsCount = COUNT(*) 
    FROM sys.index_columns AS ic 
      INNER JOIN sys.indexes AS i 
       ON ic.[object_id] = i.[object_id] 
       AND ic.index_id = i.index_id 
      INNER JOIN sys.columns AS c 
       ON ic.[object_id] = c.[object_id] 
       AND ic.column_id = c.column_id 
    WHERE ic.[object_id] = OBJECT_ID(N'dbo.YourTableName') 
    AND  i.[type] != 0 
    AND  ic.is_included_column = 0 
    GROUP BY i.index_id 
    HAVING COUNT(CASE WHEN c.Name = 'YourColumnName' THEN 1 END) > 0 
    ORDER BY ColumnsCount; 

난 당신이 계정에 비 키 열을 포함하지 않는 가정, ic.is_included_column = 0에 조건을 추가 한 없으며 인덱스에 관심이 주어진 경우 : 귀하의 질의에 단순화 될 수있다 열이 키 열이 아닙니다. 이 가정이 부정확하면이 술어를 제거하십시오.

그러나 현재 쿼리가 작동하는 경우 시스템 카탈로그에서 쿼리를 최적화하면 많은 이점이 있다는 것을 알 수 없습니다. 그들은 성능 저하 요인이 될 가능성이 없습니다.

+0

감사를 직접 아래와 같은 sys.indexes 테이블을 조회 할 수 있습니다 (색인 이름 idx123을 가정하고 테이블 이름은 table1입니다). 내 쿼리는 작동하지만 단순한 일을하기에는 너무 많은 작업이라고 생각했습니다. 더 좋은 방법이있을 거라 생각 했어. 하지만 퍼포먼스 킬러가 아니라면 아마 그걸 활용할 수있을 것입니다. – kapd

0

큰 질문이 있지만 내가 올바르게 이해 한 경우 특정 인덱스가 테이블 X에 있는지 여부를 찾으려고합니다. 그런 경우 다음 응답

SELECT * 
FROM sys.indexes 
WHERE name='idx123' 
AND object_id = OBJECT_ID('table1') 
관련 문제