web-dev-qa-db-ja.com

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

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

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

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

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


補遺

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

8
PseudoToad

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

例えば

 DECLARE @strSQL nvarchar(1024)
 DECLARE @objid int 
 DECLARE @indid tinyint 
 DECLARE ITW_Stats CURSOR FOR SELECT id、indid FROM sysindexes WHERE name LIKE 'hind_ % 'ORDER BY名
 OPEN ITW_Stats 
 FETCH NEXT FROM ITW_Stats INTO @objid、@indid 
 WHILE(@@ FETCH_STATUS -1)
 BEGIN 
 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 join sysobjects o on i.id = o.id 
 WHERE i.id = @objid and 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)
 ITCH_Stats INTO @objid、@indid 
 END [から次をフェッチ.____。]閉じるITW_Stats 
 DEALLOCATE ITW_Stats 

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

5
Sagar Makhesana

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

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

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

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

1
Matt