私の問題を例で説明しようとしています。私は次のような長期にわたる声明を持っています
UPDATE <table_A>
INNER JOIN <table_B> ON [...]
LEFT JOIN <table_C> ON [...]
LEFT JOIN <table_D> ON [...]
LEFT JOIN <table_E> ON [...]
SET <table_A>.<col_A>=X
WHERE <table_A>.<col_A>=Y AND COALESCE(<table_C>.<id>,<table_D>.<id>,<table_E>.<id> IS NULL
このステートメントは大きなテーブルで実行されます (そのうちの 2 つにはテーブルごとに 700 万行以上が含まれます)。更新には 3 ~ 5 分かかります。別のセッションでは、高い並行性で行われます
UPDATE <table_C> SET <col_A>=Z WHERE <id> IN ([...])
また
DELETE FROM <table_C> WHERE <id> IN ([...])
ビッグランが発生するとUPDATE
、これらは同時に発生し、1 ~ 2 分後にロック待機タイムアウトまたはデッドロックで終了します。すべての列にインデックスが付けられます (標準インデックス)。私はすでにやろうとしましたUPDATE
DELETES
JOIN
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
[BIG UPDATE];
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
しかし、それは役に立ちません。データ<table_A>
の整合性はそれほど重要ではありません ( <table_C>
...に存在しない行が含まれていても問題ありませ<table_E>
ん)。最も重要なことは、小さなUPDATE
/ DELETE
s on <table_C>
...<table_E>
が処理されていることです。