1

クラスター化されているかどうかに関係なく、1 つのデータベースからすべてのインデックスを削除する方法は?

GUIではなく、スクリプトでそれを行う必要があります。

編集済み

データベースには 7 つのテーブルがあり、そのうちのいくつかはルックアップであり、いくつかは外部キーに関連しています。すべてのテーブルには、主キーが作成されたときに作成される最小限のインデックスが 1 つあるため、自動的に制約が作成されます。GUI でそのようなインデックスを削除すると、他のキーに依存しているため、インデックスを削除できないというエラーが発生しました。

そのため、最初に外部キーであるインデックス キーを削除し、次に主キーに対して作成されたインデックスを削除する必要があります。

4

2 に答える 2

13

動的SQLのバリエーションは少し異なりますが、最初に外部キー、次に主キー、次にインデックス(ヒープに変換されないように、最初に非クラスター化インデックス(すべての非クラスター化インデックスに影響を与える可能性があります))を削除します。

USE specific_database;
GO

まず、すべての外部キーを削除します。

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + N'ALTER TABLE ' 
  + QUOTENAME(OBJECT_SCHEMA_NAME([parent_object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([parent_object_id])) 
  + ' DROP CONSTRAINT ' + QUOTENAME(name) + ';
'
FROM sys.foreign_keys
WHERE OBJECTPROPERTY([parent_object_id], 'IsMsShipped') = 0;

EXEC sp_executesql @sql;

次に、主キーを削除します。

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + N'ALTER TABLE '
  + QUOTENAME(OBJECT_SCHEMA_NAME([parent_object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([parent_object_id])) 
  + ' DROP CONSTRAINT ' + QUOTENAME(name) + ';
'
FROM sys.key_constraints 
WHERE [type] = 'PK'
AND OBJECTPROPERTY([parent_object_id], 'IsMsShipped') = 0;

EXEC sp_executesql @sql;

そして最後に、最初に非クラスター化されたインデックス:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + N'DROP INDEX ' 
  + QUOTENAME(name) + ' ON '
  + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([object_id])) + ';
'
FROM sys.indexes 
WHERE index_id > 0
AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0
ORDER BY [object_id], index_id DESC;

EXEC sp_executesql @sql;

データベースエンジンチューニングアドバイザは、これらのインデックスの束を推奨することに注意してください(また、提示するワークロードによっては、一部を見逃したり、冗長でほぼ重複したインデックスを提案したりする場合があります)。ただし、削除したばかりのデータ整合性(PK、FK、固有の制約)は推奨されません。

于 2013-02-07T00:10:13.897 に答える
5

を作成するDynamic SQL

DECLARE @qry nvarchar(max);
SELECT @qry =  (SELECT  'DROP INDEX ' + ix.name + ' ON ' + OBJECT_NAME(ID) + '; '
                FROM  sysindexes ix
                WHERE   ix.Name IS NOT NULL AND 
                        ix.Name LIKE '%prefix_%'
                FOR XML PATH(''));
EXEC sp_executesql @qry
于 2013-02-06T23:46:17.743 に答える