データベースをクリーンアップする必要がありました(条件の列が常に同じである、特定の条件を持ついくつかのテーブル)。
delete from table1 where date < given_date1 and id = given_id
delete from table2 where date < given_date2 and id = given_id
given_id と givendate の関係は、テーブルごと、ID ごとに異なります。
実際の削除条件は、常に where date < givendate であるとは限りません。たとえば、1 つの ID に 300 日分のデータがあり、もう 1 つの ID に 500 日分のデータがあるとします。 10 はユーザー入力に基づく変数であるため、1 回の反復ですべてのノードが処理され、最も古い 10 日間のデータが削除されるため、ID ごとにクエリが変更されますが、実際には、同じテーブルのセットになります。
以前は、そのスクリプトは SQL スクリプトとして記述され、その操作を実行していましたが、時間がかかっていました。今、新しいコードが次のように見えるマルチスレッド Java アプリケーションを実装しました。
for(i=0; i < idcount ; i++)
{
//launch new thread and against that thread call
delete(date,currentid);
}
function delete(date,id)
{
delete from table1 where date < given_date and id = given_id
delete from table2 where date < given_date and id = given_id
}
これを実装した後、テーブルのインデックスを作成することで解決されたSQLテーブルでデッドロックが見つかりましたが、それでも想定どおりに高速ではありません.500個のスレッドがある場合、それらはすべて次々に起動され、明らかに同じセットで実行されますテーブル。SQLは実際には各テーブルで並行して実行されていませんか?
java.exe と sqlserver.exe を監視すると、まったくビジーではありませんか? 私はそれが想定されていることを願っています。
スレッドを増やして並行して削除を行い、利用可能なリソースを消費できるように、テーブルの同じセットにマルチスレッド削除を実装するための最良の方法を教えてください。