6

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

新しいテーブルは正常に作成されますが、FK制約を追加すると、非常に長い間「考え」、CPU負荷が増加します。メモリ使用量が増加すると、サーバーは狂ったようにページングを開始し、応答しなくなります(接続がタイムアウトします)。クエリをキャンセルしても効果はありません。動作する唯一のことはサーバーを再起動することであり、これは非常にコストがかかります。

これが私が実行しようとしているスクリプトです。SQLサーバーの達人が助けてくれることを願っています。どうも!

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

編集:ReferenceTableは、次のような小さなテーブルです。

[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です。この問題は、ALTERTABLE呼び出しの1つで発生します。残念ながら、両方が一緒に実行されたので、どちらが原因であるかはわかりません。

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

4

4 に答える 4

4

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

ALTER TABLEは(ほとんどのDDLと同様に)排他的アクセスを必要とし、スキーマロックによってブロックされている可能性があります。これにより、ReferenceTableがブロックされ、他のクエリがブロックされます...

于 2010-12-06T19:08:07.873 に答える
0

調査すべきいくつかの事柄-解決策ではありませんが、何かにつながる可能性があります。

トリガーは定義されていますか?

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

(展開時またはその他の方法で)参照テーブルのColumn1IDを更新するか、そのテーブルの行を削除しますか?

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

于 2011-01-28T14:46:17.993 に答える
0

各クエリ バッチを個別に実行することをお勧めします。

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

WITH NOCHECK次に、代わりに を使用して、独自に外部キー制約を追加してみてくださいWITH CHECK。 制約が作成されている間、参照されたテーブルの列の値に対するWITH NOCHECKコンテンツの検証を抑制します。MyNewTable.Column1ID空または行数が少ない場合MyNewTable、これはあまり効果がないと思いますが、説明したような症状に遭遇しました-新しい制約を取得するテーブルに数百万行が含まれていることを除いて.

最後に、最後のバッチを実行WITH CHECKして、新しい制約を設定してみてください。これがうまくいかない場合は、新しい FK set をそのままにしておく必要があるかもしれませWITH NOCHECKんが、定義された制約WITH NOCHECKは に戻されるまでクエリ オプティマイザーによって無視されるため、お勧めしませんWITH CHECK

于 2011-01-24T03:14:26.300 に答える
0

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

于 2011-01-28T14:34:53.793 に答える