複数のテーブルを結合して正しいレコードを見つけることによって、あるテーブルのレコードを更新するという複雑な要件があります。私は働いている次のクエリを書いたが、それは私のDB接続タイムアウトを引き起こしている実行するために2.5分かかる。それを書き換えることによってこのクエリの効率を向上させる方法はありますか?私はまた、MERGEアプローチも試みましたが、これもまた時間がかかりすぎています。私はEVENT_DYNAMIC_ATTRIBUTEテーブルに200万レコード以上、EVENTテーブルに100万レコード、CATEGORYテーブルに100000レコードを持っています。Oracleの複数のテーブルを結合して効率的な更新クエリを書く
UPDATE EVENT_DYNAMIC_ATTRIBUTE eda
SET eda.ATTRIBUTE_VALUE = 'claim',
eda.LAST_UPDATED_DATE = SYSDATE,
eda.LAST_UPDATED_BY = 'superUsers'
WHERE eda.DYNAMIC_ATTRIBUTE_NAME_ID=4002
AND eda.EVENT_ID IN
(SELECT e.EVENT_ID
FROM EVENT e
WHERE e.PRIMARY_CATEGORY_ID IN
(SELECT CATEGORY_ID
FROM CATEGORY START WITH CATEGORY_ID = 495984 CONNECT BY PARENT_ID =
PRIOR CATEGORY_ID));
これは、マージクエリです:
MERGE INTO EVENT_DYNAMIC_ATTRIBUTE eda
USING (SELECT DISTINCT e.EVENT_ID FROM (
SELECT CATEGORY_ID
FROM CATEGORY
START WITH CATEGORY_ID=495984
CONNECT BY PARENT_ID =
PRIOR CATEGORY_ID) CATEGORIES
INNER JOIN EVENT E ON e.PRIMARY_CATEGORY_ID = CATEGORY_ID
INNER JOIN EVENT_DYNAMIC_ATTRIBUTE ed on ed.EVENT_ID = E.EVENT_ID) temp
ON (eda.EVENT_ID = temp.EVENT_ID)
WHEN MATCHED THEN
UPDATE SET eda.ATTRIBUTE_VALUE = 'claim',
eda.LAST_UPDATED_DATE = SYSDATE,
eda.LAST_UPDATED_BY = 'superUser'
WHERE eda.DYNAMIC_ATTRIBUTE_NAME_ID=4002
MERGE WITH使用率を試すことができますが、おそらく私はいつもこのような状況で試してみてください、あなたの中ed.rowid' BY 'ORDERにあることを確認、この – GurV
何かを達成するための最良の方法です'USING'節。結合を使った 'UPDATE'では、多くの助けとなります。結合で' MERGE'を助けるかもしれないと思います。このスレッドを参照してください:https://asktom.oracle.com/pls/asktom/asktom.search?tag=how-to-update-millions-or-records-in-a-table-200211#5402195700346034590私は40-60%の改善を見ました。 –