2011-09-23 116 views
4

我打算删除除主键以外的所有索引。我自己创建了主键,但所有其他索引都是SQL Server的建议。如何删除主键除单键查询外的所有索引

删除所有不是主键的索引后,计划为数据库调整顾问程序使用SQL Server分析器调整模板并创建索引。

用这种方法计划没有未使用的索引或性能下降索引。

这是多合乎逻辑? 谢谢。

回答

11
DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += N'DROP INDEX ' 
    + QUOTENAME(SCHEMA_NAME(o.[schema_id])) 
    + '.' + QUOTENAME(o.name) 
    + '.' + QUOTENAME(i.name) + ';' 
    FROM sys.indexes AS i 
    INNER JOIN sys.tables AS o 
    ON i.[object_id] = o.[object_id] 
WHERE i.is_primary_key = 0 
AND i.index_id <> 0 
AND o.is_ms_shipped = 0; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 
+0

感谢您的代码真棒:) – MonsterMMORPG

+0

和1件事。为新行添加char 13:D +'。' + QUOTENAME(i.name)+';'+ char(13) – MonsterMMORPG

4

最简单的方法可能是这样的:运行这个查询将输出一个DROP INDEX .....语句的列表。

SELECT 
    'DROP INDEX ' + name + ' ON ' + 
    OBJECT_SCHEMA_NAME(object_id) + '.' + OBJECT_NAME(object_Id) 
FROM sys.indexes 
WHERE is_primary_key = 0 
AND name IS NOT NULL 
AND OBJECT_SCHEMA_NAME(object_id) <> 'sys' 

复制从结果网格到一个新的查询窗口的DROP语句,检查他们,也许调整它们,然后运行它们实际下降指数。

+0

只是关于相信所有系统对象都在sys架构中的评论......如果您意外地在MSDB或master中运行此代码,您将返回不在sys架构中的系统对象的行。只要记住一点 - 您可以通过使用'OBJECTPROPERTY(object_id,'IsMsShipped')= 0'来轻松解决这个问题。 –

+0

@AaronBertrand:谢谢 - 您的解决方案的效果肯定比我的解决方案更好 - 我将不得不对此做一个精神记录!谢谢 –

+1

我的问题是,如果数据库有很多索引,你可能无法预览整个字符串。但是你将能够执行它 - 除非它是绝对巨大的。 –