为什么有空索引,我该怎么办呢?

时间:2018-03-20 07:43:06

标签: sql sql-server

我编写了一个脚本,根据它们的碎片重组/重建SQL Server中的索引。

某些索引为NULLwhitespace,我无法重新组织或重建它们。它们是什么,它们来自哪里以及我应该如何处理它们?

这是我获得它们的代码:

$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

编辑:只是为了澄清:我可以在我的代码中跳过那些空索引,但我想知道它们是什么以及它们来自哪里

1 个答案:

答案 0 :(得分:3)

您可以获得null名称的一种方法是,如果您正在查看一个堆(没有聚集索引)的表。堆本身将显示null名称。

您可以通过index_id中的sys.indexes列来确认是否属于这种情况。堆显示index_id为0。