2012-04-03 13 views
1

顧客間の支払いを追跡するデータベースを想像してみてください。大きなテーブルで参照される小さなテーブルからの削除

Customer 
---------- 
CustomerID 
Name 

とトランザクションテーブルBuyerIDとSellerIDは、CustomerテーブルのCustomerID列への外部キー参照の両方である

Transaction 
------------ 
BuyerID 
SellerID 
Amount 

を:

は、私がお客様のテーブルを持っていると言います。

私の現在の(類似した)状況では、顧客テーブルが小さい(2000行)にもかかわらず、取引テーブルは大きく(500万行)です。ただし、Customerテーブルから行を削除すると、トランザクションテーブルをスキャンして参照トランザクションがあるかどうかを調べる必要があるため、非常に時間がかかります(実際には2回実行する必要があります.1つはBuyerID SellerIDの場合は1つ)。取引テーブルはBuyerIDまたはSellerIDのどちらにもインデックスされていません(実際のテーブルはバイヤー、売り手、その他のいくつかの列の組み合わせでインデックスされます)

私はすべての外部キー制約を削除し、次に制約を再追加します。外部キーを有効にしてDELETE FROMを実行するだけで、これ以上速くなりますか?私が紛失している削除操作を高速化する他の方法はありますか?

+0

あなたの取引テーブルが大きいことを明記し、それが小さいことを明記してください。私はどちらが真実かを判断することはできません。 –

+0

あなたの削除はカスケード接続されていますか? – NullUserException

+1

トランザクションテーブルはBuyerIDまたはSellerIDカラムでインデックスされていますか? – hkutluay

答えて

4

あなたは、インデックスBuyerIDとあなたのTransactionテーブル内SellerID ...

はあなたの外部キー、read Kimberly Tripp's excellent article on the subjectのインデックスを作成しなければならない理由として、さらなる説明のためにする必要があります。

0

私が500億行を使用している場合は、まず外部キー参照を削除し、削除機能を制御するストアドプロシージャのような場所を集中管理してください。

+0

OPの削除を高速化することをお勧めしますか? –

1

さらに2つのインデックスを追加してください。 制約をそのままにします。

1

一般に、顧客の販売取引がある場合、顧客または顧客を削除することは望ましくありません。これはまさにあなたが外来のキー制約を持っている理由なので、顧客を削除しません。それは単にあなたの財務報告を乱しているだけです(2011年の売上高が突然20%減ったのですが、データベースからレコードを削除してしまいました。あなたが望むのは、この場合通常顧客を削除しないように非アクティブにすることです。

これは開発中のデータベースであり、otehrsが同時にデータを入力する可能性のあるデータベースではないと言われているので、私はFKを削除し、削除しようとする顧客IDを作業親テーブルとすべての子テーブルに削除を実行します。これにより、必要に応じて5億行のバッチ表を削除できます。その後、あなたが完了したら、FKを元に戻してください。

+1

私はあなたが本番システムにはまったく間違っていると思いますが、このデータベースは現在開発段階にあり、問題の顧客は誤って追加されているので、このケースでは削除したいと考えています – Ryan

+0

私は、 FKがあなたの削除を防ぐためにそこにいることを人々は時々忘れる。 – HLGEM

関連する問題