2

データベースをクリーンアップする必要がありました(条件の列が常に同じである、特定の条件を持ついくつかのテーブル)。

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 を監視すると、まったくビジーではありませんか? 私はそれが想定されていることを願っています。

スレッドを増やして並行して削除を行い、利用可能なリソースを消費できるように、テーブルの同じセットにマルチスレッド削除を実装するための最良の方法を教えてください。

4

4 に答える 4

2

すべてのアクションが特定の ID で削除されている場合、すべての ID を一度に実行して、各テーブルで削除を行うだけです。

例えば

delete from table1 where date < given_date and id in (given_id1, given_id2 ..... )

多数の given_ids がある場合は、最初にそれらを一時テーブルに挿入してから、テーブルを結合して一時テーブルで削除することにより、各削除を実行します

また、複数のスレッドを使用しようとする場合、スレッド内のテーブルを操作する場合にのみ改善が期待されるため、データベースで競合が発生することはありません。

于 2012-07-17T21:30:16.757 に答える
1

あなたが作成した問題を無視しています...

なぜINステートメントを使用しないのですか?

delete from table1 where date < given_date and id IN (id1, id2, id3, ...)

明確化に基づく更新:deleteコメントの説明に基づくと、適切なインデックスがなく、すべてのステートメントでテーブル スキャンが発生している と推測されます。各テーブル スキャンはテーブルをロックするため、データベースは一度に 1 つのステートメントしか処理できません。文の節で使用される他の列とともに列dateと列に索引を付けます。idwheredelete

于 2012-07-17T21:28:16.677 に答える
0

私の個人的な経験では、クエリとデータベースとの通信を管理するクラスを作成しています。私はスレッド プールを使用してスレッドを管理し、スレッドに静的データベース マネージャーを呼び出させるだけです。lock()マネージャーには、データベース接続を取得する同期メソッドが含まれている必要があります。その後、スレッドはデータベースにアクセスできるようになり、それらのアクションは互いに競合しなくなります。

于 2012-07-17T21:25:46.940 に答える
0

すべてのコマンドを 1 つのトランザクション単位にすることを気にしない場合は、削除を独自のトランザクション (小さいトランザクション) に入れます。

于 2012-07-17T21:31:19.920 に答える