架空のインデックスの削除


8

以前は、クラスター化インデックスのDROP INDEXステートメントと非クラスター化インデックスのDROP STATISTICSステートメントのいずれかを使用して、架空のインデックスを削除すると思っていました。

クリーンアップしたいDTAの残りがいっぱいのデータベースがあります。ただし、オブジェクトを削除しようとすると、「オブジェクトが存在しないか、権限がないため」オブジェクトを削除できないというエラーメッセージが常に表示されます。私はサーバーの完全なシステム管理者ですので、何かをする権利があると思っています。

私はこれをDROP STATSとDROP INDEXステートメントの両方で試しましたが、どちらも同じエラーを出します。

誰かが以前にこれらを削除したことがあり、私が見逃しているトリックはありますか?


補遺

これを見てみると、オブジェクトをRクリックすると、[名前を付けてスクリプト]オプションと[削除]オプションの両方がグレー表示されることに気づきました。


仮説がどのように見えるかのスクリーンショットはどうですか?
Jason Cumberland

こんにちはジェイソン。SELECT * FROM sys.indexes WHERE is_hypothetical = 1
PseudoToadを2013年

DROP INDEXには、テーブルに対するALTER権限が必要です。良性のALTER TABLEステートメントを発行して、権限をテストできますか?(わかっています。わかっています。あなたはシステム管理者です。とにかくそれを行ってください。)
Mike Sherrill 'Cat Recall'

1
SSMSでこれらのインデックスが正しいと思いますか?その場合は、接続を更新して、インデックスがまだあるかどうかを確認してください。すでに削除されている可能性があります。また、これDROP INDEXはクラスター化インデックスと非クラスター化インデックスの両方の正しい構文です。 DROP STATISTICS特に異なる統計用です。
ケネスフィッシャー

うん... SSMSで私は私は上記のすべてを何度も試しました。CheckDBはクリーンです。別の接続スタックを使用すると解放されることを期待して、o-SQLとSQLCMDで試してみました。タオルを投げて一緒に暮らしています。ある時点で、テーブルをドロップして再作成します。それは間違いなくそれを修正します!
PseudoToad 2013年

回答:


5

インデックスチューニングウィザードによって作成された架空のインデックスは、"hind_%"という名前で始まり、チューニングの完了後は存在しないはずです。それらはすべて削除する必要があります。SQL Serverクエリアナライザーから次のスクリプトを実行して、存在する可能性のあるインデックスを削除できます。sysadminまたはdb_owner権限を持つアカウント、またはこれらの統計が作成されたオブジェクトの所有者であるアカウントを使用してログインする必要があります。

例えば

DECLARE @strSQL nvarchar(1024) 
DECLARE @objid int 
DECLARE @indid tinyint 
SELECT id、indid FROM sysindexes WHERE name LIKE 'hind_%' ORDER BY nameのITW_Stats CURSORを宣言します 
ITW_Statsを開く 
ITW_Stats INTO @ objid、@ indidから次をフェッチ 
WHILE(@@ FETCH_STATUS -1) 
ベギン 
SELECT @strSQL =(SELECT Case when INDEXPROPERTY(i.id、i.name、 'IsStatistics')= 1 then 'drop statistics [' else 'drop index [' end + OBJECT_NAME(i.id)+ ']。[' + i.name + ']' 
FROM sysindexes私はi.id = o.idのsysobjects oに参加します 
WHERE i.id = @objidおよびi.indid = @indid AND 
(INDEXPROPERTY(i.id、i.name、 'IsHypothetical')= 1 OR
(INDEXPROPERTY(i.id、i.name、 'IsStatistics')= 1 AND 
INDEXPROPERTY(i.id、i.name、 'IsAutoStatistics')= 0))) 
EXEC(@strSQL) 
ITW_Stats INTO @ objid、@ indidから次をフェッチ
終わり
ITW_Statsを閉じる 
ITW_Statsの割り当て解除

上記のスクリプトは、詳細についてマイクロソフトから提供されており、次のリンクにアクセスできます。 http://support.microsoft.com/kb/q293177


こんにちは、サムさん。残念ながら、これは私を最初に戻します。このスクリプトでは、架空のインデックスが表示され、ずっと使用してきた正しいドロップステートメントが表示されます。問題は、dropステートメントが機能しないことです。これはエンジンのバグであり、ほとんどあきらめていると思います。ある時点で、テーブルを本番環境から外し、すべてを最初からドロップ/再作成します。私はそれがそれを修正することを知っています!
PseudoToad 2013年

2

オンラインの書籍には、インデックスを削除できないいくつかの理由が含まれています。

  • インデックスは主キー制約に関連付けられています。
  • ファイルグループはオフラインまたは読み取り専用です。
  • 「インデックスがビューで無効になっている場合、またはリーフレベルのデータ行にテキスト、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、またはxml列が含まれている場合、クラスター化インデックスをオンラインで削除することはできません。 」
  • 適切な権限がありません:「DROP INDEXを実行するには、少なくともテーブルまたはビューに対するALTER権限が必要です。この権限は、デフォルトでsysadmin固定サーバーロールとdb_ddladminおよびdb_owner固定データベースロールに付与されます。 」

他の理由もあるかもしれません。


マイクありがとう。これらはすべて架空のものであるため、これらのカテゴリに分類されることはありません。これとは別に、これらはすべてクラスター化されていない仮想インデックスであり、ドロップの統計として扱われます。最終的には「実際のインデックス」ではありません。
PseudoToad 2013年

ランニングdbcc checktableが必要だと思いますか?
マイクシェリル「キャットリコール」、

完全なチェッカーがクリーン
PseudoToad 2013年

1

これは少し単純化していますが、DTAの提案が完了したら、DTAインターフェイスを介してそのサーバーからチューニングセッションを削除してみてください。


ちょうどこれを試しました-DTAを開き、サーバーに接続し、以前のすべてのセッションを削除します。データベースにはまだdtaインデックスと統計があります。
Razvan Zoitanu 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.