Sql server 如何在SQLServer2005中从IndexId获取索引名
我正在运行以下查询以列出索引的大小和碎片:Sql server 如何在SQLServer2005中从IndexId获取索引名,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我正在运行以下查询以列出索引的大小和碎片: SELECT object_name(object_id, database_id) as objectname), index_id, * FROM sys.dm_db_index_usage_stats 是否有一个SQL函数可用于将索引id转换为索引名称?我在第页找到一个函数,该函数可以帮助您: CREATE FUNCTION dbo.index_name (@object_id int, @index_id int) RETURNS sysna
SELECT object_name(object_id, database_id) as objectname), index_id, *
FROM sys.dm_db_index_usage_stats
是否有一个SQL函数可用于将索引id
转换为索引名称?我在第页找到一个函数,该函数可以帮助您:
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;
或者更好:
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
我提供了这个解决方案,效果非常好:
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
创建表dbo.IndexNames
(数据库\u id int不为空,对象\u id int不为空,索引\u id int不为空,索引\u name sysname不为空)
去
创建过程dbo.gathereIndexNames
作为
开始
声明@cur游标
,@name varchar(128)
,@sql varchar(最大值)
截断表dbo.IndexNames
为从sys.databases中选择名称设置@cur=cursor
其中数据库\u id>=5
开@cur
从@cur取下一个到@name
而@@fetch\u status=0
开始
set@sql='1!'
插入到dbo.IndexNames中
(数据库id、对象id、索引id、索引名称)
选择db_id('''+@name++'')、t.object_id、i.index_id、i.name
来自['+@name+'.[sys].[tables]t
内部联接['+@name+'].[sys].[index]i
在t.OBJECT\u ID=i.OBJECT\u ID上
其中i.index_id 0'
exec(@sql)
从@cur取下一个到@name
结束
或者,只需将此逻辑作为连接添加到原始查询即可。请注意sys.indexes是特定于数据库的。在上面的问题中,用户显示了对sys.dm_db_index_usage_stats的查询,并在OBJECT_NAME函数中指定数据库_id。此函数将仅返回当前打开的数据库的结果。编译时,尝试删除附加括号作为其错误,但是无法将编辑保存为非6个字符。这与sys.indexes
的效果不太好,它是每个数据库视图的索引,而sys.dm\u db\u index\u usage\u stats
返回所有实例数据库的数据,因此大多数i.name
都是空的。