2014-01-14 31 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から "Existing Indexes Usage Statistics"を使用しています)。

なぜこれらのインデックスを保持するのが間違っているのか、私はそれらのうちのどれを保管すべきかを定義できますか?

+1

彼らは、メタデータを除き、任意のスペースを消費しないと 'DBCC AUTOPILOT'が実行されている場合を除き、QOによって無視されるべきです。だから、理論的にはそれほど大きな害はないはずです。なぜあなたはそれらをきれいにしないでしょうか?たとえSQL Serverに影響を与えていないとしても、その存在はサードパーティのスクリプトなどで問題を引き起こす可能性があります。 –

+0

@MartinSmithありがとうございました。好奇心のために、あなたはそのような問題の状況の例を提供できますか? – gotqn

答えて

2

実際にはスペースを取ったり、パフォーマンスヒット/ベネフィットを引き起こすことはありませんが、テーブルに定義されているインデックスを見て仮想インデックスを除外することを忘れると、まれに、これらのインデックスの1つと同じ名前のインデックスを作成しようとすると、既に存在するので失敗します。あなたはこれをきれいにし、実行したい

+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