私が解決しようとしている問題は次のとおりです。最近、複数のシャード間でデータベースの負荷を分散できるようにするデータ層の再設計を完了しました。シャードのバランスを保つために、あるシャードから別のシャードにデータを移行できる必要があります。これには、シャード A からシャード B にコピーし、シャード A からレコードを削除することが含まれます。しかし、非常に大きなテーブルがいくつかあり、多くの外部キーがそれらを指しているため、テーブルから 1 つのレコードを削除するのに 1 秒以上かかる場合があります。
場合によっては、テーブルから何百万ものレコードを削除する必要がありますが、実際には時間がかかりすぎます。
外部キーを無効にすることはオプションではありません。行の大量のバッチを削除することもオプションではありません。これは本番アプリケーションであり、大量の削除を行うとリソースがロックされすぎて障害が発生するためです。私は Sql Server を使用しており、パーティション分割されたテーブルについては知っていますが、パーティション分割の制限 (およびエンタープライズ エディションのライセンス料金) は非常に非現実的であり、実行できません。
この問題に取り組み始めたとき、途中で外部キー制約に違反しないように、リーフ レベルからデータ モデルの最上部までの行を削除する方法を理解するアルゴリズムを作成するのが難しいと思いました。しかし、一晩で消える必要があるレコードを削除するには数週間かかるため、その問題を解決しても役に立ちませんでした。
データを仮想的に削除されたものとしてマークする方法を既に構築しているため、アプリケーションに関する限り、データは失われていますが、大きなデータ ファイル、大きなバックアップ、低速のクエリをまだ処理しています。テーブル。
何か案は?ここで関連する古い投稿を既に読んでいますが、役立つものは何も見つかりませんでした。