【问题标题】:What happens when a nonclustered index is deleted?删除非聚集索引时会发生什么?
【发布时间】:2017-06-16 14:15:00
【问题描述】:

当我从我的一个表中删除索引时,SQL Server 引擎端会发生什么?

详细信息:我有一个数据库正在投入生产。

在这个数据库中,我有一个定期创建死锁的查询。我找到了创建死锁的查询,在我的计算机上运行它,显示了它的执行计划。 SQL Server Management Studio 建议在一个特定的表上添加索引。

索引对我来说很有意义,但我的问题是,在这张表上我已经有 3 个索引,老实说,我不确定它们是否被正确使用,或者它们是否是为特定角色创建的.

我可以简单地在表上再添加一个索引,但我担心每次在表上添加/更新/删除数据时要支付的费用。

我在我的机器上做了一些尝试,似乎我需要删除至少两个其他索引才能让引擎选择我今天创建的索引(对我来说看起来很奇怪)。一旦我强制引擎获取我的索引(因为我删除了其他所有内容),查询的运行速度就会快 10 倍。

我可以简单地使用DROP Index 命令吗?我不需要重建什么的?

【问题讨论】:

标签: sql-server tsql sql-server-2008-r2 non-clustered-index


【解决方案1】:

您可以运行此查询来了解是否使用了表的索引

SELECT TOP 50
  o.name AS ObjectName
, i.name AS IndexName
, i.index_id AS IndexID
, dm_ius.user_seeks AS UserSeek
, dm_ius.user_scans AS UserScans
, dm_ius.user_lookups AS UserLookups
, dm_ius.user_updates AS UserUpdates
, p.TableRows
, 'DROP INDEX ' + QUOTENAME(i.name)
+ ' ON ' + QUOTENAME(s.name) + '.'
+ QUOTENAME(OBJECT_NAME(dm_ius.OBJECT_ID)) AS 'drop statement'
FROM sys.dm_db_index_usage_stats dm_ius
INNER JOIN sys.indexes i ON i.index_id = dm_ius.index_id 
AND dm_ius.OBJECT_ID = i.OBJECT_ID
INNER JOIN sys.objects o ON dm_ius.OBJECT_ID = o.OBJECT_ID
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
INNER JOIN (SELECT SUM(p.rows) TableRows, p.index_id, p.OBJECT_ID
FROM sys.partitions p GROUP BY p.index_id, p.OBJECT_ID) p
ON p.index_id = dm_ius.index_id AND dm_ius.OBJECT_ID = p.OBJECT_ID
WHERE OBJECTPROPERTY(dm_ius.OBJECT_ID,'IsUserTable') = 1 and o.name='your_table_name'
AND dm_ius.database_id = DB_ID()
AND i.type_desc = 'nonclustered'
AND i.is_primary_key = 0
AND i.is_unique_constraint = 0
ORDER BY (dm_ius.user_seeks + dm_ius.user_scans + dm_ius.user_lookups) ASC
GO

如果没有使用其中任何一个,则使用 DROP index 语句。 在删除之前,请确保服务器已经启动了足够长的时间,以便索引有机会被使用。

另外,在一个表上拥有三个索引并不多。只需检查它们对您的查询是否有用。

【讨论】:

  • 感谢您提供非常有用的查询!
【解决方案2】:

非聚集索引是辅助数据结构 - 它没有“集成”到聚集索引或堆的主要数据结构中。

因此,删除一个应该是一种相对快速且轻松的体验,因为系统需要做的就是删除有关索引的元数据并将索引的页面标记为未分配。

应该不需要“重建”或做任何其他事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2010-09-10
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2011-05-15
    相关资源
    最近更新 更多