Cadere indici ipotetici


8

In passato pensavo di aver eliminato gli indici ipotetici usando un'istruzione DROP INDEX per gli indici cluster e l'istruzione DROP STATISTICS per gli indici non cluster.

Ho un database che è pieno di resti DTA che vorrei pulire; tuttavia, quando provo a rilasciare l'oggetto, ricevo sempre un errore che mi dice che non posso rilasciare l'oggetto "perché non esiste o non si dispone dell'autorizzazione". Sono un amministratore di sistema completo sul server, quindi mi aspetto di avere i diritti per fare qualsiasi cosa.

Ho provato questo con entrambe le istruzioni DROP STATS e DROP INDEX ma entrambi mi danno lo stesso errore.

Qualcuno li ha cancellati prima e c'è un trucco che mi manca?


appendice

Frugando in questo, ho appena notato che se faccio R-Click sull'oggetto, entrambe le opzioni 'Script As' e 'DELETE' sono disattivate.


Che ne dici di uno screenshot di come appare un ipotetico?
Jason Cumberland

Ciao Jason. Esegui SELECT * FROM sys.indexes WHERE is_hypothetical = 1
PseudoToad

DROP INDEX richiede l'autorizzazione ALTER sulla tabella. Puoi emettere un'istruzione ALTER TABLE benigna per testare le tue autorizzazioni? (Lo so. Lo so. Sei un amministratore di sistema. Fallo comunque.)
Mike Sherrill 'Cat Recall'

1
Presumo che tu stia vedendo questi indici in SSMS corretti? In tal caso prova ad aggiornare la tua connessione e vedi se gli indici sono ancora lì. Potrebbero essere già stati eliminati. Inoltre DROP INDEXè la sintassi corretta per gli indici cluster e non cluster. DROP STATISTICSè specificamente per le statistiche che sono diverse.
Kenneth Fisher,

Sì ... sono in SSMS e ho provato più volte sopra. CheckDB è pulito. Ho anche provato a farlo attraverso o-SQL e SQLCMD sperando che l'uso di uno stack di connessione diverso lo avrebbe liberato. Sto gettando l'asciugamano e vivo con esso. A un certo punto lascerò cadere e ricreare le tabelle. Ciò risolverà sicuramente!
PseudoToad,

Risposte:


5

Gli indici ipotetici creati dalla procedura guidata di ottimizzazione dell'indice iniziano con un nome di "hind_%" e non dovrebbero esistere al termine della messa a punto; dovrebbero essere tutti rimossi. È possibile eseguire il seguente script da SQL Server Query Analyzer per rimuovere eventuali indici di questo tipo. È necessario accedere utilizzando un account che disponga delle autorizzazioni sysadmin o db_owner o sia il proprietario dell'oggetto su cui sono state create queste statistiche.

Per esempio

DECLARE @strSQL nvarchar (1024) 
DECLARE @objid int 
DECLARE @indid tinyint 
DECLARE ITW_Stats CURSORE PER SELECT id, indid FROM sysindexes DOVE nome COME 'hind_%' ORDINA PER nome 
APERTO ITW_Stats 
FACCIA SUCCESSIVO DA ITW_Stats INTO @objid, @indid 
WHILE (@@ FETCH_STATUS -1) 
INIZIO 
SELECT @strSQL = (Seleziona il caso in cui INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 quindi 'drop stats [' else 'drop index [' end + OBJECT_NAME (i.id) + ']. [' + i.name + ']' 
DA sysindexes mi unisco a sysobjects o su i.id = o.id 
DOVE i.id = @objid e 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) 
FACCIA SUCCESSIVO DA ITW_Stats INTO @objid, @indid
FINE
CHIUDI ITW_Stats 
DEALLOCATE ITW_Stats

Lo script sopra è fornito da Microsoft per maggiori dettagli è possibile visitare il seguente link. http://support.microsoft.com/kb/q293177


Ciao Sam. Purtroppo questo mi riporta all'inizio. Lo script mi ​​mostra gli indici ipotetici e mi dà la dichiarazione di rilascio corretta che ho usato da sempre. Il problema è che l'istruzione drop semplicemente non funziona. Sono convinto che si tratti di un bug nel motore e ci ho praticamente rinunciato. Ad un certo punto, porterò fuori produzione i tavoli e poi lascerò / ricreare tutto da zero. So che lo risolverà!
PseudoToad

2

La documentazione online include diversi motivi per cui potresti non essere in grado di eliminare un indice.

  • L'indice è associato a un vincolo di chiave primaria.
  • Il filegroup è offline o di sola lettura.
  • "Non è possibile eliminare un indice cluster online se l'indice è disabilitato in una vista o contiene colonne di testo, ntext, image, varchar (max), nvarchar (max), varbinary (max) o xml nelle righe di dati a livello di foglia ".
  • Non hai le autorizzazioni giuste: "Per eseguire DROP INDEX, è richiesta almeno l'autorizzazione ALTER sulla tabella o sulla vista. Questa autorizzazione è concessa per impostazione predefinita al ruolo predefinito del server sysadmin e ai ruoli fissi del database db_ddladmin e db_owner. "

Potrebbero esserci anche altri motivi.


Grazie Mike. Tutti questi sono ipotetici, quindi non rientrano in nessuna di queste categorie. A parte ciò, si tratta di tutti gli indici ipotetici non raggruppati che vengono trattati come statistiche per l'eliminazione. Alla fine non sono "indici reali".
PseudoToad,

Pensi che sia necessario correre dbcc checktable?
Mike Sherrill "Cat Recall",

Il controllo completo è pulito
PseudoToad

1

Questo è un po 'semplicistico, ma se hai finito con i suggerimenti DTA, prova a rimuovere le sessioni di ottimizzazione da quel server attraverso l'interfaccia DTA.


Ho appena provato: apri DTA, connettiti al server, elimina tutte le sessioni precedenti. hanno ancora indice dta e statistiche nel database.
Razvan Zoitanu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.