删除假设指数


8

过去,我以为我会使用针对集群索引的DROP INDEX语句和针对非集群索引的DROP STATISTICS语句删除假设索引。

我有一个数据库,其中充满了我想清除的DTA残留物;但是,当我尝试删除该对象时,总是收到一条错误消息,告诉我无法删除该对象,因为它不存在或您没有权限。我是服务器上的完整系统管理员,因此希望拥有执行任何操作的权利。

我已经尝试了DROP STATS和DROP INDEX语句,但是都给了我同样的错误。

有人删除过这些吗?我想念一个窍门吗?


附录

翻看一下,我只是注意到,如果我右击该对象,则“ Script As”和“ DELETE”选项均为灰色。


假设的屏幕截图怎么样?
詹森·坎伯兰

嗨杰森。运行SELECT * FROM sys.indexes WHERE is_hypothetical = 1
PseudoToad

DROP INDEX需要表的ALTER权限。您可以发出良性的ALTER TABLE语句来测试您的权限吗?(我知道。我知道。你是系统管理员。无论如何都要这样做。)
Mike Sherrill'Cat Recall'13

1
我假设您在SSMS中看到这些索引正确吗?如果是这样,请尝试刷新连接并查看索引是否仍然存在。它们可能已被删除。同时,DROP INDEX对于聚簇索引和非聚簇索引而言,也是正确的语法。 DROP STATISTICS专用于不同的统计信息。
肯尼斯·费舍尔

是的...在SSMS中,我已经多次尝试了上述所有方法。CheckDB是干净的。我什至尝试通过o-SQL和SQLCMD进行操作,希望使用其他连接栈可以使它免费。我把毛巾扔进去并与之共处。在某些时候,我将删除并重新创建表。那肯定会解决它!
PseudoToad

Answers:


5

由索引优化向导创建的假设索引以名称“ hind_%”开头,并且在优化完成后不应该存在。他们都应该被删除。您可以从SQL Server查询分析器中运行以下脚本,以删除可能存在的任何此类索引。您必须使用具有sysadmin或db_owner权限,或者是创建这些统计信息的对象的所有者的帐户登录。

例如

宣告@strSQL nvarchar(1024) 
宣告@objid int 
声明@indid tinyint 
将SELECT ID的DECLARE ITW_Stats游标从sysindexes索引中查找,其中名称类似于'hind_%'ORDER BY名称 
OPEN ITW_Stats 
从ITW_Stats下一步获取INTO @ objid,@ indid 
WHILE(@@ FETCH_STATUS -1) 
开始 
SELECT @strSQL =(当INDEXPROPERTY(i.id,i.name,'IsStatistics')= 1时,然后是'drop statistics ['else'drop index ['end + OBJECT_NAME(i.id)+']。' + i.name +']' 
从sysindexes我在i.id = o.id上加入sysobjects 
i.id = @objid和i.indid = @indid并且 
(INDEXPROPERTY(i.id,i.name,'IsHypothetical')= 1 OR
(INDEXPROPERTY(i.id,i.name,'IsStatistics')= 1 AND 
INDEXPROPERTY(i.id,i.name,'IsAutoStatistics')= 0)))) 
执行(@strSQL) 
从ITW_Stats下一步获取INTO @ objid,@ indid
结束
CLOSE ITW_Stats 
取消分配ITW_Stats

上面的脚本由Microsoft提供,有关更多详细信息,您可以访问以下链接。 http://support.microsoft.com/kb/q293177


萨姆你好。不幸的是,这使我重新开始。该脚本向我显示了假设的索引,并向我提供了我一直使用的正确的drop语句。问题在于drop语句根本不起作用。我相信这是引擎中的错误,并且已经放弃了。在某个时候,我将把表从生产中移出,然后从头开始删除/重新创建所有内容。我知道会解决的!
PseudoToad

2

在线图书包括您可能无法删除索引的几种原因。

  • 该索引与主键约束关联。
  • 文件组处于脱机状态或只读状态。
  • “如果在视图上禁用了索引,或者在叶级数据行中包含文本,ntext,图像,varchar(max),nvarchar(max),varbinary(max)或xml列,则无法联机删除聚集索引。”
  • 您没有正确的权限:“要至少执行DROP INDEX,至少需要对表或视图具有ALTER权限。默认情况下,此权限被授予sysadmin固定服务器角色以及db_ddladmin和db_owner固定数据库角色。 ”

可能还有其他原因。


谢谢迈克。所有这些都是假设性的,因此不属于这些类别。除此之外,所有这些非聚集的假设索引都被视为丢弃的统计数据。最终,它们不是“真实索引”。
PseudoToad

您认为需要跑步dbcc checktable吗?
Mike Sherrill'Cat Recall'13

完全检查器很干净
PseudoToad

1

这有点简单,但是如果您已完成DTA建议,请尝试通过DTA界面从该服务器中删除调整会话。


刚刚尝试过-打开DTA,连接到服务器,删除所有以前的会话。数据库中仍然有dta索引和统计信息。
Razvan Zoitanu '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.