2009-07-24 2 views
19

SQL Server의 IndexId에서 인덱스 이름을 얻는 방법 : 나는 인덱스의 크기와 조각을 나열하려면 다음 쿼리를 실행하고있어 2005

SELECT object_name(object_id, database_id) as objectname), index_id, * 
FROM sys.dm_db_index_usage_stats 

내가 index_id을 변환하는 데 사용할 수있는 SQL 기능이 있는가 색인 이름에? 더 나은 아직

CREATE FUNCTION dbo.index_name (@object_id int, @index_id int) 
RETURNS sysname 
AS 
BEGIN 
    RETURN(SELECT name FROM sys.indexes WHERE object_id = @object_id and index_id = @index_id) 
END; 

답변

22

은 내가 당신을 도움이 될 것입니다 this 페이지 기능 발견
+8

또는이 논리를 가져 와서 원래 쿼리에 조인으로 추가하십시오. –

+6

sys.indexes i 특정 데이터베이스. 위의 질문에서 사용자는 sys.dm_db_index_usage_stats에 쿼리를 표시하고 OBJECT_NAME 함수에 database_id를 지정합니다. 이 함수는 현재 열려있는 데이터베이스에 대한 결과 만 반환합니다. –

10

또는 : :이 솔루션을 온

SELECT OBJECT_NAME(d.object_id, d.database_id) AS objectname , 
     d.index_id , 
     i.name , 
     * 
FROM sys.dm_db_index_usage_stats AS d 
     LEFT OUTER JOIN sys.indexes AS i ON i.object_id = d.object_id 
              AND i.index_id = d.index_id 
+1

은 컴파일 할 때 추가 괄호를 오류로 제거하려고했지만 편집을 6 자 수가 아닌 것으로 저장할 수 없습니다. –

-1

, 좋은 작품 :

create table dbo.IndexNames 
(database_id int not null, object_id int not null, index_id int not null, index_name sysname not null) 
go 

create procedure dbo.GatherIndexNames 
as 
begin  
declare @cur cursor 
,@name varchar(128) 
,@sql varchar(max) 

truncate table dbo.IndexNames 

set @cur = cursor for select name from sys.databases 
    where database_id >= 5 

open @cur 
fetch next from @cur into @name 
while @@fetch_status = 0 
begin 
    set @sql = ' 
    insert into dbo.IndexNames 
    (database_id, object_id, index_id, index_name) 
     select db_id(''' + @name + '''),t.object_id, i.index_id, i.name 
     from [' + @name + '].[sys].[tables] t 
     inner join [' + @name + '].[sys].[indexes] i 
     on t.OBJECT_ID = i.object_id 
     where i.index_id <> 0' 
    exec (@sql) 

    fetch next from @cur into @name 
end 
관련 문제