got*_*tqn 6 t-sql sql-server-2012 database-tuning-advisor
我注意到某个数据库中存在假设索引.我一直在搜索,似乎这种类型的索引是由Tuning Advisor创建的,并不总是被删除.
有几个主题,包括如何清除/删除这些索引的官方文档,但我无法找到这些索引是否对服务器本身有任何影响.
我使用下面的脚本检查的是没有关于它们的大小信息:
SELECT OBJECT_NAME(I.[object_id]) AS TableName
,I.[name] AS IndexName
,I.[index_id] AS IndexID
,8 * SUM(A.[used_pages]) AS 'Indexsize(KB)'
FROM [sys].[indexes] AS I
INNER JOIN [sys].[partitions] AS P
ON P.[object_id] = I.[object_id]
AND P.[index_id] = I.[index_id]
INNER JOIN [sys].[allocation_units] AS A
ON A.[container_id] = P.[partition_id]
WHERE I.[is_hypothetical] = 1
GROUP BY I.[object_id]
,I.[index_id]
,I.[name]
ORDER BY 8 * SUM(A.[used_pages]) DESC
Run Code Online (Sandbox Code Playgroud)
并且拥有它们,我已经决定检查是否有一些关于它们的使用信息,以便留下经常使用的这些,但是没有任何回报.(我有使用从"现有索引的使用情况统计" 这篇文章).
任何人都可以告诉为什么保持这些索引是错误的,如果我可以定义哪些应该保留?
小智 5
只是USE你想要清理和运行的数据库:
DECLARE @sql VARCHAR(MAX) = ''
SELECT
@sql = @sql + 'DROP INDEX [' + i.name + '] ON [dbo].[' + t.name + ']' + CHAR(13) + CHAR(10)
FROM
sys.indexes i
INNER JOIN sys.tables t
ON i.object_id = t.object_id
WHERE
i.is_hypothetical = 1
EXECUTE sp_sqlexec @sql
Run Code Online (Sandbox Code Playgroud)
只需删除它们,它们实际上不会占用任何空间或根本不会造成任何性能影响/好处,但是如果您正在查看表上定义了哪些索引并且忘记排除假设的索引,则可能会导致一些混乱,此外,万一您尝试创建与这些索引之一同名的索引,它也会失败,因为它已经存在。