主キーとして自動インクリメント ID 列を持つテーブル X があります。テーブルXの情報を補完する他のテーブルA、B、C、およびDがあります。これらのそれぞれには、テーブルXのIDを参照する列が含まれている必要があります。私はそれを行い、私のコード(Java)で、各エントリの ID をテーブル X に返し、他のテーブルに挿入するときにそれを使用する方法。すべてがうまくいっています。
ここで、テーブル A、B、C、および D の ID 列を FOREIGN KEYS として割り当てるようにアドバイスされました。「これは正しいことだからです」。私はそれをしました。現在、テーブル X から行を削除するには、完了するまでに信じられないほどの時間がかかります。他のテーブルへの挿入にも時間がかかります。
誤解しないでください。DB 上のテーブルの関係を指定するために外部キーが関連する理由はわかっています。しかし、特に私のトランザクションが遅くなってきているので、実際に関係があるというよりも、儀式的なものに過ぎないように見え始めています.
質問:
1. 公式に規定された関係を維持するために、それほど必要ではないとしても、ある程度のパフォーマンスを失うことは価値がありますか?
2. トランザクションをスピードアップし、FOREIGN KEY 仕様を維持する方法はありますか?
ありがとう。
返信
テーブルの作成方法は次のとおりです。
CREATE テーブル SQL:
CREATE TABLE [dbo].[MainTableX](
[col1] [smalldatetime] ,
[col2] [varchar] (20) ,
[ID] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_MainTableX] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
GO
CREATE TABLE [dbo].[RelatedTableA](
[differentID] [varchar] (50),
[detail1] [varchar] (40),
[detail2] [varchar] (40),
CONSTRAINT [PK_RelatedTableA] PRIMARY KEY CLUSTERED
(
[differentID] ASC
)
GO
-- Tables B, C D are pretty much similar to table A
外部キー SQL を追加します。
ALTER TABLE RelatedTableA ADD ID INT
CONSTRAINT fk_refTableX_A FOREIGN KEY (ID)
REFERENCES MainTableX(ID)
GO
-- Same thing with the other related tables
解決
外部キー列をインデックスにしました。これで、クエリが再び高速になりました。
Create nonclustered index IX_RelatedTableA
on RelatedTableA (ID)
GO