長い目で見れば、行を削除または「非アクティブ化」した方が良いですか、それともどのような状況でしょうか?
テーブルからかなりの数の行を削除した後に発生するオーバーヘッドに気付きました。なぜこれが発生し、1) 防止し、2) 修正するにはどうすればよいですか?
長い目で見れば、行を削除または「非アクティブ化」した方が良いですか、それともどのような状況でしょうか?
テーブルからかなりの数の行を削除した後に発生するオーバーヘッドに気付きました。なぜこれが発生し、1) 防止し、2) 修正するにはどうすればよいですか?
SQL Server の場合...
非常に大きなテーブル (大量のレコードを意味する) のすべてのレコードを削除する場合は、最初に切り詰めてからインデックスを削除することを知っておくことが重要だと思います。それははるかに効率的です。
レコードのサブセットを削除する必要があり、インデックスが適用されている場合は、DELETE FROM {table} WHERE {condition} 構文を使用します。その場合、依存関係階層の順序で最初に依存テーブルから削除する必要があります。基本的に、最初に非依存テーブルから開始して、レコードを挿入する方法とは正反対です。
テーブル依存階層を持つレコードを削除します。
依存/子テーブル (依存テーブルに依存):
DELETE FROM [table_dependent]; -- "dependent" is a relative term since this may be part of a hierarchy; a FK in this table points to the PK of the [table_independent] table; in a physical database model, this table is sometimes referred to as the child table
依存関係/親テーブル:
DELETE FROM [table_independent]; -- "independent" is a relative term since this may be part of a hierarchy; the PK of this table has a FK in a [table_dependent] table; in a physical database model, this is sometimes referred to as the parent table.
ノート:
階層がある場合は、「最も深い」従属テーブルのレコードを最初に削除する必要があります。つまり、このテーブルのインデックスも最初に削除する必要があります。次に、親テーブルに到達するまで階層を上っていく必要があります。
テーブルの依存階層を持つ INSERT レコード:
SET IDENTITY_INSERT [table_independent] ON
INSERT INTO [table_independent]
(
[column that is not identity column],
[column that is not identity column],
[column that is not identity column]
)
VALUES
(
'1',
'2',
'3'
);
SET IDENTITY_INSERT [table_independent] OFF
SET IDENTITY_INSERT [table_dependent] ON
INSERT INTO [table_dependent]
(
[column that is not identity column],
[column that is not identity column],
[table_independent fk column]
)
VALUES
(
'1',
'2',
'3'
);
SET IDENTITY_INSERT [table_dependent] OFF