4

主キーとして自動インクリメント 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
4

2 に答える 2

5

FOREIGN KEY 列が正しくインデックス付けされている場合 (これは宣言で自動的に行われるはずです)、最悪の場合でもパフォーマンスがわずかに低下するはずです。何か問題があるように聞こえるので、各テーブルの CREATE TABLE SQL をリストしてください。

SQL Server は FK 列にインデックスを自動的に作成しないため、必ず自分で作成してください。

FOREIGN KEY リレーションシップを使用する目的は、何かを「公式に宣言」することではありません (または、いずれにしても、それを行うだけではありません)。代わりに、データの整合性を確保するのに十分な情報をデータベース エンジンに提供します。これは、関係に違反するような誤ったレコードの追加または削除をアプリケーションに行わせないことを意味します。さらに、データベースを使用する他のアプリケーション (Management Studio など) もこれを行うことはできません。制約の宣言が重要なのは、データベース エンジンによる規則の適用が保証されるためです。

于 2013-08-28T20:07:28.303 に答える
1

外部キーはあなたの問題ではありません。そして、あなたはそれらを削除したくありません。テーブル X から行を削除するとき、最初にテーブル A、B、C、および D から行を削除していると思いますか? FKが確立されている場合は、そうする必要があります。これらのテーブルからどのように行を削除していますか? Java アプリケーション内から? その場合、カスケード削除を行うように FK を設定する方がはるかに高速です。そうすれば、1 回の呼び出しでテーブル X の行を削除でき、すべての子行が SQL Server によって自動的に削除されます。テーブル X から削除するたびに、DB への 4 回のトリップを節約できます。

ところで、FK には、データの整合性を維持するだけでなく (これは非常に大きい)、より多くの価値があります。ORM (Entity Framework など) の使用を開始する予定がある場合は、FK を用意すると作業がはるかに簡単になります。

于 2013-08-28T20:23:22.003 に答える