外部のキー制約を追加すると、メモリが吸い込まれ、ページングが発生します

StackOverflow https://stackoverflow.com/questions/4369628

  •  09-10-2019
  •  | 
  •  

質問

新しく作成された空のテーブルに簡単な外部キーの制約を追加する多くの問題があります。参照テーブルは、40未満のレコードが入っている小さなものですが、かなり参照されます。

何が起こるか:新しいテーブルが正常に作成されますが、FK制約を追加すると、非常に長い間「考え」、CPU負荷が増加します。メモリの使用量が増加し、サーバーはクレイジーのようにページングを開始し、反応しない(接続タイムアウト)。クエリをキャンセルしても役に立ちません。動作するのは、サーバーの再起動だけで、非常に費用がかかります。

これが私が実行しようとしているスクリプトです。 SQL Server Gurusがお手伝いできることを願っています。どうも!

USE [my_db]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[MyNewTable](
    [Column1ID] [int] NOT NULL,
    [Column2ID] [int] NOT NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[MyNewTable]  WITH CHECK ADD  CONSTRAINT [FK_MyNewTable_Column1ID] FOREIGN KEY([Column1ID])
REFERENCES [dbo].[ReferenceTable] ([Column1ID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[MyNewTable] CHECK CONSTRAINT [FK_MyNewTable_Column1ID]
GO

編集:参照可能なのは、次のような小さなテーブルです。

[Column1ID] [int] IDENTITY(1,1) NOT NULL,
[TxtCol1] [varchar](50) NOT NULL,
[TxtCol2] [varchar](50) NOT NULL,
[TxtCol3] [varchar](200) NOT NULL,
[TxtCol4] [nvarchar](2000) NOT NULL,
[TxtCol5] [varchar](200) NOT NULL,
[BitCol1] [bit] NOT NULL,
[TxtCol6] [varchar](200) NOT NULL,
[NumCol1] [smallint] NOT NULL,
[ExternalColumnId] [int] NOT NULL,
[NumCol2] [int] NOT NULL

column1IDは、他のテーブル(FK)によってよく参照されます。 externalColumnidは、別のテーブルのFKです。問題は、Alter Table Callの1つで発生します。残念ながら、両方とも一緒に走っていたので、どちらがそれを引き起こしたのかを言うことができません。

編集:DBが「思考」モードになったら、シングルモードに切り替えてマルチユーザーモードに戻ることで戻すことができます。サーバーを再起動するよりもはるかに優れていますが、それでも受け入れられません。

役に立ちましたか?

解決

ランダムな考え:トランザクションを開いていますか?

Alter Tableには排他的なアクセスが必要になり(ほとんどのDDLと同様)、スキーマロックによってブロックされている可能性があります。

他のヒント

各クエリバッチを単独で実行することをお勧めします。

まず、テーブルを作成し、それが成功するかどうかを確認します。

次に、外部キーの制約を独自に使用して追加してみてください WITH NOCHECK それ以外の WITH CHECK. WITH NOCHECK コンテンツの検証は抑制されます MyNewTable.Column1ID 制約が作成されている間、参照されたテーブルの列の値に対して。もしも MyNewTable 空であるか、列が少ないので、これは大きな効果があるとは思わないでしょうが、あなたが説明するような症状に遭遇しました。

最後に、最後のバッチを実行して設定を試みます WITH CHECK あなたの新しい制約について。これが停止した場合、新しいFKセットを残す必要があるかもしれません WITH NOCHECK, ただし、制約が定義されているため、それは推奨されません WITH NOCHECK クエリオプティマイザーが後退するまで無視されます WITH CHECK.

この問題が再現可能な場合は、Microsoftサポートケースを開くことをお勧めします。それはバグかもしれませんし、あなたはそれを打っているかもしれません。それが既知の問題であることがわかった場合、彼らはあなたにケースを開くための請求を返金します。

一握りのものを調べるべきもの - 解決策ではありませんが、それらは何かにつながる可能性があります。

定義されたトリガーはありますか?

新しいテーブルを作成している時点でデータベースが使用またはアクセスされていますか、それともアイドル状態ですか?

(展開などの時点で)参照テーブルでcolumn1IDを更新するか、そのテーブルの行を削除するものはありますか?

参照テーブルのcolumn1IDに主要なキーまたは一意の制約はありますか? (リストはありませんが、SQLが存在しないとすぐに失敗すると思います。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top