2013-03-04 4 views
1

쿼리를 실행하는 데 약 20 초가 걸리고 단일 트랜잭션에서 여러 번 실행되기 때문에 성능에 좋지 않은 영향을줍니다.SqL 쿼리 성능 문제

[update table1 
      set column3 = 'new_str' 
      where column1||','||column2 in 
     (select table1.column1||','||column2 
      from table1 
     join table2 on table1.column1 = table2.column1 
     where table2.column4 = 'value4' 
     and table1.column2 = 'value2' 
     and column3 = 'old_str')] 

표 1
컬럼 1 - 문자 (12) - 기본 키
2 열 - 문자 (30) - 기본 키
3 열 - 문자 (25)

표 2
컬럼 1 - 문자 (12) - 기본 키 (표 1의 외래 키)
4 - char (12)

위 표에는 약 1009578 및 1082555 개의 레코드가 있습니다.

+2

SQL의 맛? – dnagirl

+0

이 많은 레코드를 사용하면 쿼리 최적화 이외의 다른 방법으로 시간을 절약 할 수 있습니다. 업데이트, 제거 또는 최적화 할 수있는 인덱스를 확인하고 수집 할 레코드의 일부를 제거하는 몇 가지 기본 기준으로 뷰를 활용합니다. 어쩌면 지난 달의 기록이거나 X 상태의 기록 일 수도 있습니다. 어떤 DB를 사용하고 있습니까? –

답변

0

테스트 할 수는 없지만 계산 된 필드를 기반으로하는 기준을 세분화하면 업데이트 속도가 상당히 빨라집니다. 뭔가 (누락 된 뭔가있을 수 있습니다)이 더 잘 작동합니다 :

[update table1 
     set column3 = 'new_str' 
      where column1 in 
     (select table1.column1 
      from table1 
     where table1.column2 = 'value2' 
     and column3 = 'old_str') 
     and 
     column2 in 
    (select table2.column2 
      from table2 
     where table2.column1 = column1 
     and table2.column4 = 'value4') 
     ] 
0

나는 Table1에 불필요한 쿼리를하고 있다고 생각합니다. 이 시도 :

update table1 t1 
set column3 = 'new_str' 
where EXISTS 
    (select *   
    from table2 t2 
    where 
    t1.column1 = t2.column1 -- this is your link from t1 to t2 
    and t2.column4 = 'value4' 
    and t1.column2 = 'value2' 
    and t2.column3 = 'old_str' 
    ) 
0

을 것 같아요 IN 원인은 여기에 모든 necesary 아니라고 :

update table1 
    set column3 = 'new_str' 
    from table1 join table2 on table1.column1 = table2.column1 
     where table2.column4 = 'value4' 
     and table1.column2 = 'value2' 
     and table1.column3 = 'old_str' 

가장 빠른 솔루션을 우리에게 쓰기]!

+0

제안을 주셔서 대단히 감사합니다.이 솔루션은 제 유스 케이스에서 가장 빠른 것 같습니다. – user338804

+0

이 질문에 답변으로 표시해보십시오. 감사! – www