我编写了一个脚本,根据它们的碎片重组/重建SQL Server中的索引。
某些索引为NULL
或whitespace
,我无法重新组织或重建它们。它们是什么,它们来自哪里以及我应该如何处理它们?
这是我获得它们的代码:
$getFragQuery = "SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID()"
$FragRate = Invoke-Sqlcmd -ConnectionString $ConnectionString -Query $getFragQuery
空索引和命名索引的示例:
Schema : dbo
Table : LizenzHandling
Index : PK_LizenzHandling
avg_fragmentation_in_percent : 0
page_count : 0
Schema : dbo
Table : ServiceFelder
Index :
avg_fragmentation_in_percent : 83.3333333333333
page_count : 7
编辑:只是为了澄清:我可以在我的代码中跳过那些空索引,但我想知道它们是什么以及它们来自哪里
答案 0 :(得分:3)
您可以获得null
名称的一种方法是,如果您正在查看一个堆(没有聚集索引)的表。堆本身将显示null
名称。
您可以通过index_id
中的sys.indexes
列来确认是否属于这种情况。堆显示index_id
为0。