私は次のようなクエリで更新を実行しています:
UPDATE (SELECT h.m_id,
m.id
FROM h
INNER JOIN m
ON h.foo = m.foo)
SET m_id = id
WHERE m_id IS NULL
いくつかの情報:
- テーブル
h
は約500万行です - テーブルのすべての行には、次の値
h
がありますNULL
m_id
- テーブル
m
は約50万行です m_id
on tableh
は、ontableを指すインデックス付き外部キーです。id
m
id
テーブル上m
の主キーです- とにインデックスがあり
m.foo
ますh.foo
このEXPLAIN PLAN
クエリのは、ハッシュ結合と全表スキャンを示していましたが、私はDBAではないため、実際にはうまく解釈できません。
クエリ自体は数時間実行され、完了しませんでした。私はそれがほんの数分で完了すると思っていたでしょう。また、次のクエリの書き換えを試みました。
UPDATE h
SET m_id = (SELECT id
FROM m
WHERE m.foo = h.foo)
WHERE m_id IS NULL
これEXPLAIN PLAN
については、ROWIDルックアップとインデックスの使用について説明しましたが、完了せずに数時間続きました。また、このようなクエリでは、外部クエリの述語からのすべての結果に対してサブクエリが実行されるという印象を常に受けていたため、とにかくこの書き換えではパフォーマンスが非常に低下すると予想されます。
私のアプローチに何か問題がありますか、または私の問題はインデックス、テーブルスペース、またはその他のクエリに関連しない要因に関連していますか?
編集:
私はまた、次のような単純なカウントクエリからのひどいパフォーマンスを持っています:
SELECT COUNT(*)
FROM h
WHERE m_id IS NULL
これらのクエリには、約30秒から場合によっては約30分(!)かかります。
ロックがないことに気づいていますが、これらのテーブルのテーブルスペースは現在99.5%の使用率(最大6MBの空き容量)になっています。インデックスが使用されている限り、これは問題ではないと言われましたが、わかりません...