我打算删除除主键以外的所有索引。我自己创建了主键,但所有其他索引都是SQL Server的建议。如何删除主键除单键查询外的所有索引
删除所有不是主键的索引后,计划为数据库调整顾问程序使用SQL Server分析器调整模板并创建索引。
用这种方法计划没有未使用的索引或性能下降索引。
这是多合乎逻辑? 谢谢。
我打算删除除主键以外的所有索引。我自己创建了主键,但所有其他索引都是SQL Server的建议。如何删除主键除单键查询外的所有索引
删除所有不是主键的索引后,计划为数据库调整顾问程序使用SQL Server分析器调整模板并创建索引。
用这种方法计划没有未使用的索引或性能下降索引。
这是多合乎逻辑? 谢谢。
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;
最简单的方法可能是这样的:运行这个查询将输出一个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语句,检查他们,也许调整它们,然后运行它们实际下降指数。
只是关于相信所有系统对象都在sys架构中的评论......如果您意外地在MSDB或master中运行此代码,您将返回不在sys架构中的系统对象的行。只要记住一点 - 您可以通过使用'OBJECTPROPERTY(object_id,'IsMsShipped')= 0'来轻松解决这个问题。 –
@AaronBertrand:谢谢 - 您的解决方案的效果肯定比我的解决方案更好 - 我将不得不对此做一个精神记录!谢谢 –
我的问题是,如果数据库有很多索引,你可能无法预览整个字符串。但是你将能够执行它 - 除非它是绝对巨大的。 –
感谢您的代码真棒:) – MonsterMMORPG
和1件事。为新行添加char 13:D +'。' + QUOTENAME(i.name)+';'+ char(13) – MonsterMMORPG