2014-01-14 9 views
5

Ich habe festgestellt, dass hypothetische Indizes in einer bestimmten Datenbank existieren. Ich habe gesucht und es schien, dass diese Art von Indizes von Tuning Advisor erstellt werden und nicht immer gelöscht werden.Sollte ich hypothetische Indizes löschen?

Es gibt mehrere Themen einschließlich official Dokumentation, wie diese Indexed löschen/löschen, aber ich konnte nicht finden, ob diese Indizes Auswirkungen auf den Server selbst haben.

Was ich überprüfen, haben mit dem Skript unten ist, dass es über sie keine Größeninformationen:

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 

und mit ihnen, ich habe beschlossen, zu prüfen, ob eine Nutzungsinformationen über sie sind, um zu verlassen diese werden oft benutzt, aber wieder war nichts zurück. (Ich verwende die "Existing Statistics Usage Statistics" von this article).

Kann jemand sagen, warum das Halten dieser Indizes falsch ist und ob ich definieren kann, welche davon beibehalten werden soll?

+1

Sie verbrauchen keinen Platz, mit Ausnahme von Metadaten und sollte, außer durch den QO ignoriert werden, wenn 'DBCC AUTOPILOT' ausgeführt wird. In der Theorie sollten sie also nicht viel Schaden anrichten. Warum solltest du sie nicht aufräumen? Auch wenn sie SQL Server nicht stark beeinträchtigen, kann ihre Existenz dennoch Probleme mit Skripten von Drittanbietern verursachen. –

+0

@MartinSmith Vielen Dank. Nur aus Neugier, können Sie ein Beispiel für eine solche Problemsituation geben? – gotqn

Antwort

2

Löschen Sie sie einfach, sie nehmen keinen Platz ein oder verursachen überhaupt einen Leistungsvorteil, aber wenn Sie sich ansehen, welche Indizes in einer Tabelle definiert sind und vergessen, hypothetische Indizes auszuschließen, könnte dies passieren Wenn Sie versuchen, einen Index mit dem gleichen Namen wie einem dieser Indizes zu erstellen, wird dies fehlschlagen, da er bereits vorhanden ist.

+0

Ich habe sie löschen, aber bitte beachten Sie, dass wenn Index gelöscht wird eine Tabelle gesperrt ist, die mir eine Menge Probleme verursacht. – gotqn

3

Nur USE die Datenbank, die Sie wollen, dass diese reinigen und laufen:

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 
Verwandte Themen