Descarte de índices hipotéticos

8

En el pasado, pensé que había eliminado índices hipotéticos usando una instrucción DROP INDEX para índices agrupados y la instrucción DROP STATISTICS para índices no agrupados.

Tengo una base de datos que está llena de restos de DTA que me gustaría limpiar; sin embargo, cuando trato de soltar el objeto siempre recibo un error que me dice que no puedo soltar el objeto "porque no existe o no tienes permiso". Soy un administrador de sistemas completo en el servidor, por lo que esperaría tener derechos para hacer cualquier cosa.

He intentado esto con las declaraciones DROP STATS y DROP INDEX pero ambas me dan el mismo error.

¿Alguien ha eliminado estos antes y hay un truco que me falta?


Apéndice

Escudriñando esto, me di cuenta de que si hago clic con el botón derecho en el objeto, las opciones 'Script As' y 'DELETE' están atenuadas.

PseudoToad
fuente
¿Qué tal una captura de pantalla de cómo se ve un hipotético?
Jason Cumberland
Hola Jason. Ejecute SELECT * FROM sys.indexes WHERE is_hypothetical = 1
PseudoToad
DROP INDEX requiere el permiso ALTER en la tabla. ¿Puede emitir una declaración ALTER TABLE benigna para probar sus permisos? (Lo sé. Lo sé. Eres un administrador de sistemas. Hazlo de todos modos.)
Mike Sherrill 'Cat Recall'
1
Supongo que está viendo estos índices en SSMS ¿correcto? Si es así, intente actualizar su conexión y vea si los índices siguen ahí. Puede que ya hayan sido eliminados. Además, DROP INDEXes la sintaxis correcta para los índices agrupados y no agrupados. DROP STATISTICSes específicamente para estadísticas que son diferentes.
Kenneth Fisher
Sí ... estoy en SSMS y he intentado todo lo anterior varias veces. CheckDB está limpio. Incluso intenté hacerlo a través de o-SQL y SQLCMD con la esperanza de que usar una pila de conexión diferente lo liberara. Estoy tirando la toalla y viviendo con ella. En algún momento dejaré caer y recrearé las tablas. ¡Eso definitivamente lo arreglará!
PseudoToad

Respuestas:

5

Los índices hipotéticos creados por el Asistente de ajuste de índice comienzan con un nombre de "hind_%" y no deberían existir una vez que haya finalizado el ajuste; todos deberían ser eliminados. Puede ejecutar el siguiente script desde el Analizador de consultas de SQL Server para eliminar los índices que puedan existir. Debe iniciar sesión utilizando una cuenta que tenga permisos sysadmin o db_owner, o que sea el propietario del objeto en el que se crearon estas estadísticas.

Por ejemplo

DECLARE @strSQL nvarchar (1024) 
DECLARE @objid int 
DECLARAR @indid tinyint 
DECLARE ITW_Stats CURSOR FOR SELECT id, indid FROM sysindexes WHERE name LIKE 'hind_%' ORDER BY name 
ABRIR ITW_Stats 
OBTENER SIGUIENTE DE ITW_Stats INTO @objid, @indid 
MIENTRAS (@@ FETCH_STATUS -1) 
EMPEZAR 
SELECT @strSQL = (Seleccione el caso cuando INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 y luego 'drop stats [' else 'drop index [' end + OBJECT_NAME (i.id) + ']. [' + i.name + ']' 
DE sysindexes me uno a sysobjects o en i.id = o.id 
DONDE i.id = @objid e i.indid = @indid AND 
(INDEXPROPERTY (i.id, i.name, 'IsHypothetical') = 1 O
(INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 Y 
INDEXPROPERTY (i.id, i.name, 'IsAutoStatistics') = 0))) 
EXEC (@strSQL) 
OBTENER SIGUIENTE DE ITW_Stats INTO @objid, @indid
FINAL
CERRAR ITW_Stats 
DEALLOCATE ITW_Stats

Microsoft proporciona el script anterior para obtener más detalles que puede visitar en el siguiente enlace. http://support.microsoft.com/kb/q293177

Sagar Makhesana
fuente
Hola Sam. Lamentablemente, esto me lleva de vuelta al comienzo. El script me muestra los índices hipotéticos y me da la declaración de caída correcta que he estado usando todo el tiempo. El problema es que la declaración de caída simplemente no funciona. Soy de la creencia de que este es un error en el motor y me he dado por vencido. En algún momento, sacaré las tablas de producción y luego soltaré / recrearé todo desde cero. ¡Sé que eso lo arreglará!
PseudoToad
2

Los libros en línea incluyen varias razones por las que es posible que no pueda eliminar un índice.

  • El índice está asociado con una restricción de clave primaria.
  • El grupo de archivos está fuera de línea o es de solo lectura.
  • "No puede colocar un índice agrupado en línea si el índice está deshabilitado en una vista, o si contiene texto, ntext, imagen, varchar (max), nvarchar (max), varbinary (max) o columnas xml en las filas de datos a nivel de hoja ".
  • No tiene los permisos correctos: "Para ejecutar DROP INDEX, como mínimo, se requiere el permiso ALTER en la tabla o vista. Este permiso se otorga de manera predeterminada a la función fija de servidor sysadmin y las funciones fijas de base de datos db_ddladmin y db_owner. "

Puede haber otras razones, también.

Mike Sherrill 'Retiro del gato'
fuente
Gracias Mike Todos estos son hipotéticos, por lo que no van a caer en ninguna de estas categorías. Aparte de esto, todos estos son índices hipotéticos no agrupados que se tratan como estadísticas para descartar. En definitiva, no son "índices reales".
PseudoToad
¿Crees que dbcc checktablees necesario correr ?
Mike Sherrill 'Cat Recall'
Verificador
1

Esto es un poco simplista, pero si ha terminado con las sugerencias de DTA, intente eliminar las sesiones de ajuste de ese servidor a través de la interfaz de DTA.

Mate
fuente
Acabo de intentar esto: abra el DTA, conéctese al servidor, elimine todas las sesiones anteriores. Todavía tengo índice dta y estadísticas en la base de datos.
Razvan Zoitanu