Suppression d'index hypothétiques

8

Dans le passé, je pensais avoir supprimé les index hypothétiques à l'aide d'une instruction DROP INDEX pour les index clusterisés et d'une instruction DROP STATISTICS pour les index non clusterisés.

J'ai une base de données pleine de restes DTA que je voudrais nettoyer; cependant, lorsque j'essaie de supprimer l'objet, je reçois toujours une erreur m'informant que je ne peux pas supprimer l'objet "car il n'existe pas ou vous n'avez pas l'autorisation". Je suis un administrateur système complet sur le serveur, je m'attends donc à avoir le droit de faire quoi que ce soit.

J'ai essayé cela avec les instructions DROP STATS et DROP INDEX, mais les deux me donnent la même erreur.

Quelqu'un a-t-il déjà supprimé ces informations et y a-t-il une astuce qui me manque?


Addenda

En fouillant dans cela, je viens de remarquer que si je R-Clique sur l'objet, les options 'Script As' et 'DELETE' sont grisées.

PseudoToad
la source
Que diriez-vous d'une capture d'écran de ce à quoi ressemble une hypothétique?
Jason Cumberland
Salut Jason. Exécutez SELECT * FROM sys.indexes WHERE is_hypothetical = 1
PseudoToad
DROP INDEX nécessite l'autorisation ALTER sur la table. Pouvez-vous émettre une instruction ALTER TABLE bénigne pour tester vos autorisations? (Je sais. Je sais. Vous êtes un administrateur système. Faites-le quand même.)
Mike Sherrill 'Cat Recall'
1
Je suppose que vous voyez ces index dans SSMS correct? Si c'est le cas, essayez de rafraîchir votre connexion et voyez si les index sont toujours là. Ils ont peut-être déjà été supprimés. La DROP INDEXsyntaxe est également correcte pour les index cluster et non cluster. DROP STATISTICSest spécifiquement pour les statistiques qui sont différentes.
Kenneth Fisher
Oui ... Im dans SSMS et j'ai essayé toutes les fois ci-dessus. CheckDB est propre. J'ai même essayé de le faire via o-SQL et SQLCMD en espérant que l'utilisation d'une pile de connexion différente le libérerait. Je jette l'éponge et je vis avec. À un moment donné, je supprimerai et recréerai les tableaux. Cela va certainement le réparer!
PseudoToad

Réponses:

5

Les index hypothétiques créés par l'assistant de réglage d'index commencent par un nom "hind_%" et ne devraient plus exister une fois le réglage terminé; ils devraient tous être supprimés. Vous pouvez exécuter le script suivant à partir de l'Analyseur de requêtes SQL Server pour supprimer tous ces index qui peuvent exister. Vous devez vous connecter en utilisant un compte disposant des autorisations sysadmin ou db_owner, ou est le propriétaire de l'objet sur lequel ces statistiques ont été créées.

Par exemple

DECLARE @strSQL nvarchar (1024) 
DECLARE @objid int 
DECLARE @indid tinyint 
DECLARE ITW_Stats CURSEUR POUR SELECT id, indid FROM sysindexes O WH nom COMME 'hind_%' ORDER BY nom 
OUVRIR ITW_Stats 
FETCH NEXT FROM ITW_Stats INTO @objid, @indid 
TANT QUE (@@ FETCH_STATUS -1) 
COMMENCER 
SELECT @strSQL = (cas SELECT lorsque INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 puis 'drop statistics [' else 'drop index [' end + OBJECT_NAME (i.id) + ']. [' + i.name + ']' 
À partir de sysindex, je rejoins sysobjects o sur i.id = o.id 
OERE i.id = @objid et i.indid = @indid ET 
(INDEXPROPERTY (i.id, i.name, 'IsHypothetics') = 1 OU
(INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 ET 
INDEXPROPERTY (i.id, i.name, 'IsAutoStatistics') = 0))) 
EXEC (@strSQL) 
FETCH NEXT FROM ITW_Stats INTO @objid, @indid
FIN
FERMER ITW_Stats 
DEALLOCATE ITW_Stats

Le script ci-dessus est fourni par Microsoft pour plus de détails, vous pouvez visiter le lien suivant. http://support.microsoft.com/kb/q293177

Sagar Makhesana
la source
Salut Sam. Malheureusement, cela me ramène au début. Le script me montre les index hypothétiques et me donne la bonne instruction drop que j'utilise depuis le début. Le problème est que l'instruction drop ne fonctionne tout simplement pas. Je suis convaincu que c'est un bug dans le moteur et j'ai à peu près abandonné. À un moment donné, je retirerai les tableaux de la production, puis je supprimerai / recréerai tout à partir de zéro. Je sais que ça va le réparer!
PseudoToad du
2

Les livres en ligne incluent plusieurs raisons pour lesquelles vous ne pourrez peut-être pas supprimer un index.

  • L'index est associé à une contrainte de clé primaire.
  • Le groupe de fichiers est hors ligne ou en lecture seule.
  • "Vous ne pouvez pas supprimer un index clusterisé en ligne si l'index est désactivé dans une vue ou contient des colonnes text, ntext, image, varchar (max), nvarchar (max), varbinary (max) ou xml dans les lignes de données de niveau feuille . "
  • Vous n'avez pas les autorisations appropriées: "Pour exécuter DROP INDEX, au minimum, l'autorisation ALTER sur la table ou la vue est requise. Cette autorisation est accordée par défaut au rôle de serveur fixe sysadmin et aux rôles de base de données fixes db_ddladmin et db_owner. "

Il pourrait également y avoir d'autres raisons.

Mike Sherrill 'Cat Recall'
la source
Merci Mike. Tous ces éléments sont hypothétiques et ne tomberont donc dans aucune de ces catégories. En dehors de cela, ce sont tous des indices hypothétiques non groupés qui sont traités comme des statistiques de baisse. En fin de compte, ce ne sont pas de "vrais indices".
PseudoToad
Pensez-vous que la course dbcc checktableest nécessaire?
Mike Sherrill 'Cat Recall'
Le vérificateur complet est propre
PseudoToad
1

C'est un peu simpliste, mais si vous avez terminé avec les suggestions DTA, essayez de supprimer les sessions de réglage de ce serveur via l'interface DTA.

Mat
la source
Je viens d'essayer ceci - ouvrez DTA, connectez-vous au serveur, supprimez toutes les sessions précédentes. ont toujours l' index et les statistiques dta dans la base de données.
Razvan Zoitanu