Hypothetische Indizes löschen

8

In der Vergangenheit dachte ich, ich hätte hypothetische Indizes entweder mit einer DROP INDEX-Anweisung für Clustered-Indizes oder mit einer DROP STATISTICS-Anweisung für Nicht-Clustered-Indizes gelöscht.

Ich habe eine Datenbank mit DTA-Überresten, die ich bereinigen möchte. Wenn ich jedoch versuche, das Objekt zu löschen, wird immer eine Fehlermeldung angezeigt, dass ich das Objekt nicht löschen kann, "weil es nicht vorhanden ist oder Sie keine Berechtigung haben". Ich bin ein vollständiger Systemadministrator auf dem Server und würde daher erwarten, Rechte zu haben, um irgendetwas zu tun.

Ich habe dies sowohl mit DROP STATS- als auch mit DROP INDEX-Anweisungen versucht, aber beide geben mir den gleichen Fehler.

Hat jemand diese schon einmal gelöscht und gibt es einen Trick, den ich vermisse?


Nachtrag

Beim Stöbern habe ich gerade bemerkt, dass beim erneuten Klicken auf das Objekt die Optionen "Skript als" und "LÖSCHEN" ausgegraut sind.

PseudoToad
quelle
Wie wäre es mit einem Screenshot davon, wie eine Hypothese aussieht?
Jason Cumberland
Hallo Jason. Führen Sie SELECT * FROM sys.indexes WHERE is_hypothetical = 1
PseudoToad
DROP INDEX erfordert die ALTER-Berechtigung für die Tabelle. Können Sie eine harmlose ALTER TABLE-Anweisung ausgeben, um Ihre Berechtigungen zu testen? (Ich weiß. Ich weiß. Sie sind ein Systemadministrator. Tun Sie es trotzdem.)
Mike Sherrill 'Cat Recall'
1
Ich gehe davon aus, dass Sie diese Indizes in SSMS korrekt sehen? Wenn ja, aktualisieren Sie Ihre Verbindung und prüfen Sie, ob die Indizes noch vorhanden sind. Sie wurden möglicherweise bereits gelöscht. Dies DROP INDEXist auch die richtige Syntax für Clustered- und Nicht-Clustered-Indizes. DROP STATISTICSist speziell für Statistiken, die unterschiedlich sind.
Kenneth Fisher
Ja ... Ich bin in SSMS und habe all das mehrmals versucht. CheckDB ist sauber. Ich habe sogar versucht, dies über o-SQL und SQLCMD zu tun, in der Hoffnung, dass die Verwendung eines anderen Verbindungsstapels es lösen würde. Ich werfe das Handtuch und lebe damit. Irgendwann werde ich die Tabellen löschen und neu erstellen. Das wird es definitiv beheben!
PseudoToad

Antworten:

5

Die vom Assistenten für die Indexoptimierung erstellten hypothetischen Indizes beginnen mit dem Namen "hind_%" und sollten nach Abschluss der Optimierung nicht mehr vorhanden sein. Sie sollten alle entfernt werden. Sie können das folgende Skript im SQL Server Query Analyzer ausführen, um eventuell vorhandene Indizes zu entfernen. Sie müssen sich mit einem Konto anmelden, das entweder über die Berechtigungen sysadmin oder db_owner verfügt oder Eigentümer des Objekts ist, für das diese Statistiken erstellt wurden.

Zum Beispiel

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 name 
OPEN ITW_Stats 
FETCH NEXT FROM ITW_Stats IN @objid, @indid 
WÄHREND (@@ FETCH_STATUS -1) 
START 
SELECT @strSQL = (SELECT-Fall, wenn INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1, dann 'drop statistics [' else 'drop index [' end + OBJECT_NAME (i.id) + ']. [' + i.name + ']' 
FROM sysindexes i join sysobjects o on i.id = o.id. 
WO i.id = @objid und 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) 
FETCH NEXT FROM ITW_Stats IN @objid, @indid
ENDE
SCHLIESSEN SIE ITW_Stats 
DEALLOCATE ITW_Stats

Das obige Skript wird von Microsoft bereitgestellt. Weitere Informationen finden Sie unter folgendem Link. http://support.microsoft.com/kb/q293177

Sagar Makhesana
quelle
Hallo Sam. Leider bringt mich das zurück zum Start. Das Skript zeigt mir die hypothetischen Indizes und gibt mir die richtige drop-Anweisung, die ich die ganze Zeit verwendet habe. Das Problem ist, dass die drop-Anweisung einfach nicht funktioniert. Ich bin der Überzeugung, dass dies ein Fehler im Motor ist und habe ihn so ziemlich aufgegeben. Irgendwann werde ich die Tabellen aus der Produktion nehmen und dann alles von Grund auf neu erstellen. Ich weiß, das wird es beheben!
PseudoToad
2

Online-Bücher enthalten mehrere Gründe, warum Sie möglicherweise keinen Index löschen können.

  • Der Index ist einer Primärschlüsseleinschränkung zugeordnet.
  • Die Dateigruppe ist offline oder schreibgeschützt.
  • "Sie können einen Clustered-Index nicht online löschen, wenn der Index in einer Ansicht deaktiviert ist oder Text-, ntext-, Bild-, varchar- (max), nvarchar- (max), varbinary- (max) oder xml-Spalten in den Datenzeilen auf Blattebene enthält . "
  • Sie haben nicht die richtigen Berechtigungen: "Um DROP INDEX auszuführen, ist mindestens die ALTER-Berechtigung für die Tabelle oder Ansicht erforderlich. Diese Berechtigung wird standardmäßig für die feste Serverrolle sysadmin und die festen Datenbankrollen db_ddladmin und db_owner erteilt. ""

Es könnte auch andere Gründe geben.

Mike Sherrill 'Cat Recall'
quelle
Danke Mike. All dies ist hypothetisch und fällt daher nicht in eine dieser Kategorien. Abgesehen davon sind dies alles nicht gruppierte hypothetische Indizes, die als Statistiken zum Löschen behandelt werden. Letztendlich sind sie keine "echten Indizes".
PseudoToad
Denkst du, Laufen dbcc checktableist angesagt?
Mike Sherrill 'Cat Recall'
Vollständiger Prüfer ist sauber
PseudoToad
1

Dies ist ein wenig vereinfacht, aber wenn Sie mit den DTA-Vorschlägen fertig sind, versuchen Sie, die Optimierungssitzungen über die DTA-Schnittstelle von diesem Server zu entfernen.

Matt
quelle
Versuchen Sie es einfach - öffnen Sie DTA, stellen Sie eine Verbindung zum Server her und löschen Sie alle vorherigen Sitzungen. habe noch dta index und stats in der datenbank.
Razvan Zoitanu