1

顧客間の支払いを追跡するデータベースを想像してみてください。

Customer テーブルがあるとします。

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

およびトランザクション テーブル

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

BuyerID と SellerID はどちらも、Customer テーブルの CustomerID 列への外部キー参照です。

私の現在の (類似の) 状況では、Customer テーブルは小さい (2000 行) にもかかわらず、Transaction テーブルは大きい (5 億行) です。ただし、Customer テーブルから行を削除するには、非常に長い時間がかかります。これは、データベースが Transaction テーブルをスキャンして、Customer に参照トランザクションがあるかどうかを確認する必要があるためです (実際には、2 回実行する必要があります。1 回は BuyerID を確認するためです)。もう 1 つは SellerID 用です)。Transaction テーブルは、BuyerID または SellerID のいずれにもインデックスが作成されていません (実際のテーブルは、Buyer、Seller、およびその他のいくつかの列の組み合わせに基づいてインデックスが作成されています)

すべての外部キー制約を削除し、行を削除してから、制約を再度追加できることを知っています。DELETE FROM外部キーを有効にして実行するよりも速くなりますか? 私が見逃している削除操作を高速化する他の方法はありますか。

4

4 に答える 4

4

テーブルにインデックスBuyerIDを付けSellerIDTransaction...

外部キーのインデックスを作成する必要がある理由の詳細については、この件に関する Kimberly Tripp の優れた記事を参照してください

于 2012-04-03T20:31:01.653 に答える
1

先に進んで、余分な 2 つのインデックスを追加してください。制約はそのままにしておきます。

于 2012-04-03T20:29:59.293 に答える
1

一般に、顧客の販売トランザクションがある場合、それらまたは顧客を削除したくありません。これがまさに外部キー制約がある理由であり、顧客を削除しません。それはあなたの財務報告をいじっているだけです (なぜ 2011 年の売り上げが突然 20% 減少したのか、データベースからいくつかのレコードを削除したため、良い会話ではありません)。この場合、通常は顧客を削除しないように、顧客を非アクティブにする必要があります。

Ryan が、これは開発中のデータベースであり、他のユーザーが同時にデータを入力する可能性が高い本番環境ではないと言っていることを考えると、FK を削除し、削除する顧客 ID を作業テーブルに入れてから実行します。親テーブルとすべての子テーブルへの削除。このようにして、必要に応じて 5 億行のテーブルからバッチで削除できます。完了したら、FK を元に戻します。

于 2012-04-03T20:40:29.123 に答える
0

5億行を処理している場合、最初に行うことは、外部キー参照を削除し、ストアドプロシージャのように場所を一元化して、削除機能を制御することです。

于 2012-04-03T20:27:32.717 に答える