올바른 레코드를 찾기 위해 여러 테이블을 조인하여 한 테이블의 일부 레코드를 업데이트해야한다는 복잡한 요구 사항이 있습니다. 나는 작동하고있는 다음 질의를 작성했지만 2.5 분 정도 걸리므로 DB 연결 시간 초과가 발생합니다. 이 쿼리를 다시 작성하여 효율성을 향상시킬 수있는 방법이 있습니까? 나는 또한 너무 오래 걸리는 MERGE 접근법을 시도했다. EVENT_DYNAMIC_ATTRIBUTE 테이블에 2 백만 개 이상의 레코드가 있고 EVENT 테이블에 1 백만 개의 레코드가 있고 CATEGORY 테이블에 10 만 개의 레코드가 있습니다. 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 아마 난 항상 이런 상황에서 시도 할 수 있는지 확인이 – GurV
뭔가를 달성하기 위해 가장 좋은 방법은 절을 사용하여 계수를 시도 할 수는있는 ed.rowid' BY'ORDER하는 것입니다 '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 % 향상을주는 것을 보았다. –