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.