Descartando índices hipotéticos

8

No passado, pensei que havia excluído índices hipotéticos usando uma instrução DROP INDEX para índices em cluster e a instrução DROP STATISTICS para índices não em cluster.

Eu tenho um banco de dados cheio de restos de DTA que eu gostaria de limpar; no entanto, quando tento soltar o objeto, sempre recebo um erro dizendo que não posso soltar o objeto "porque ele não existe ou você não tem permissão". Como sou um administrador de sistema completo no servidor, esperaria ter direitos para fazer qualquer coisa.

Eu tentei isso com as instruções DROP STATS e DROP INDEX, mas ambas me deram o mesmo erro.

Alguém já excluiu estes antes e há um truque que estou perdendo?


Termo aditivo

Observando isso, percebi que, se eu clicar com o botão R do objeto, as opções 'Script Como' e 'DELETE' ficam acinzentadas.

PseudoToad
fonte
Que tal uma captura de tela da aparência de uma hipotética?
Jason Cumberland
Oi Jason. Execute SELECT * FROM sys.indexes WHERE is_hypothetical = 1
PseudoToad
DROP INDEX requer permissão ALTER na tabela. Você pode emitir uma instrução ALTER TABLE benigna para testar suas permissões? (Eu sei. Eu sei. Você é um administrador de sistemas. Faça assim mesmo.)
Mike Sherrill 'Cat Recall'
11
Estou assumindo que você está vendo esses índices no SSMS corretos? Nesse caso, tente atualizar sua conexão e veja se os índices ainda estão lá. Eles já podem ter sido excluídos. Além disso, DROP INDEXé a sintaxe correta para os índices agrupados e não agrupados. DROP STATISTICSé especificamente para estatísticas diferentes.
Kenneth Fisher
Sim ... Estou no SSMS e tentei todas as opções acima várias vezes. O CheckDB está limpo. Até tentei fazê-lo através do o-SQL e SQLCMD, esperando que o uso de uma pilha de conexão diferente o libertasse. Estou jogando a toalha e vivendo com ela. Em algum momento, vou largar e recriar as tabelas. Definitivamente, isso será corrigido!
usar o seguinte comando

Respostas:

5

Os índices hipotéticos criados pelo Index Tuning Wizard começam com um nome de "hind_%" e não devem existir após a conclusão do ajuste; todos eles devem ser removidos. Você pode executar o seguinte script no SQL Server Query Analyzer para remover quaisquer índices que possam existir. Você deve efetuar login usando uma conta que tenha permissões sysadmin ou db_owner ou seja o proprietário do objeto no qual essas estatísticas foram criadas.

Por exemplo

DECLARE @strSQL nvarchar (1024) 
DECLARE @objid int 
DECLARE @indid tinyint 
DECLARAR ITW_Stats CURSOR PARA SELECT id, indid FROM sysindexes WHERE nome COMO 'hind_%' ORDER BY name 
ABRIR ITW_Stats 
RECEBA PRÓXIMO DE ITW_Stats EM @objid, @indid 
ENQUANTO (@@ FETCH_STATUS -1) 
INÍCIO 
SELECT @strSQL = (SELECT caso quando INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 e depois 'drop statistics [' else 'drop index [' end + OBJECT_NAME (i.id) + ']. [' + i.name + ']' 
FROM sysindexes eu associo sysobjects o em i.id = o.id 
ONDE i.id = @objid e i.indid = @indid AND 
(INDEXPROPERTY (i.id, i.name, 'IsHypothetical') = 1 OU
(INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 AND 
INDEXPROPERTY (i.id, i.name, 'IsAutoStatistics') = 0))) 
EXEC (@strSQL) 
RECEBA PRÓXIMO DE ITW_Stats EM @objid, @indid
FIM
CLOSE ITW_Stats 
DEALLOCATE ITW_Stats

O script acima é fornecido pela Microsoft para obter mais detalhes, visite o seguinte link. http://support.microsoft.com/kb/q293177

Sagar Makhesana
fonte
Oi Sam. Infelizmente, isso me traz de volta ao começo. O script mostra os índices hipotéticos e fornece a instrução drop correta que eu tenho usado o tempo todo. O problema é que a instrução drop simplesmente não funciona. Eu acredito que isso é um bug no mecanismo e que praticamente desisti dele. Em algum momento, retirarei as tabelas de produção e largo / recrio tudo do zero. Eu sei que isso vai consertar!
PseudoToad
2

Os livros on-line incluem vários motivos pelos quais você pode não conseguir eliminar um índice.

  • O índice está associado a uma restrição de chave primária.
  • O grupo de arquivos está offline ou somente leitura.
  • "Você não pode eliminar online um índice clusterizado se o índice estiver desativado em uma exibição ou contiver colunas de texto, ntext, imagem, varchar (max), nvarchar (max), varvar (max), varbinary (max) ou xml nas linhas de dados no nível da folha . "
  • Você não tem as permissões corretas: "Para executar DROP INDEX, no mínimo, é necessária a permissão ALTER na tabela ou na exibição. Esta permissão é concedida por padrão à função de servidor fixa sysadmin e às funções de banco de dados fixas db_ddladmin e db_owner. "

Também pode haver outros motivos.

Mike Sherrill 'Recolha de Gatos'
fonte
Obrigado Mike. Como tudo é hipotético, não se enquadra em nenhuma dessas categorias. Além disso, todos esses índices hipotéticos não agrupados são tratados como estatísticas para descarte. Em última análise, eles não são "índices reais".
PseudoToad
Você acha que correr dbcc checktableé necessário?
Mike Sherrill 'Cat Recall'
Verificador completa é limpo
PseudoToad
1

Isso é um pouco simplista, mas se você tiver concluído as sugestões do DTA, tente remover as sessões de ajuste desse servidor pela interface do DTA.

Matt
fonte
Apenas tentei isso - abra o DTA, conecte-se ao servidor, exclua todas as sessões anteriores. ainda tem índice dta e estatísticas no banco de dados.
Razvan Zoitanu