2014-01-14 154 views
5

我注意到假設索引存在於某個數據庫中。我已經搜索過,看起來這種類型的索引是由Tuning Advisor創建的,並不總是被刪除。我應該刪除假設索引嗎?

有幾個主題,包括official文件如何清除/刪除這些索引,但我無法找到這些索引是否對服務器本身有任何影響。

我有什麼檢查使用下面的腳本是,有關於他們的任何大小的信息:

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 

,並讓他們,我決定檢查後,才能離開有一些關於他們的使用信息這些人經常被使用,但是沒有什麼是回報。 (我使用this article的「現有索引使用統計」)。

任何人都可以說出爲什麼要保留這些索引是錯誤的,如果我可以定義哪些應該保留?

+1

他們不佔用任何空間,除了元數據,應該由QO如果'DBCC AUTOPILOT'運行,除了被忽略。所以理論上他們不應該造成太大的傷害。你爲什麼不清理它們?即使它們不會影響SQL Server,但它們的存在仍然可能導致第三方腳本出現問題。 –

+0

@MartinSmith非常感謝。只是爲了好奇,你能提供一個這樣的問題情況的例子嗎? – gotqn

回答

2

只要刪除它們,它們實際上並未佔用任何空間或導致任何性能優勢/收益,但如果您正在查看哪些索引是在表格中定義的,並且忘記排除假設索引,則可能會會造成一些混淆,即使您嘗試創建與這些索引中的一個索引具有相同名稱的索引,也會發生失敗,因爲它已經存在。

+0

我已經刪除它們,但請注意,當索引被刪除時,表被鎖定,這導致了很多問題。 – gotqn

3

只是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 
相關問題