Подтвердить что ты не робот

Как получить имя индекса из IndexId в SQL Server 2005

Я запускаю следующий запрос для отображения размера и фрагментации индексов:

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

Есть ли функция SQL, которую я могу использовать для преобразования index_id в имя индекса?

4b9b3361

Ответ 1

Я нашел функцию на странице этой, которая должна помочь вам:

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; 

Ответ 2

Или еще лучше:

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

Ответ 3

Я пришел с этим решением, отлично работает:

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