2012-08-16 3 views
0

SQL (Oracle 11g 사용)을 많이 사용하는 레거시 코드 (C++/Qt)를 파고 있습니다. 나는이 코드 조각으로 왔어요 (단지 더 나은 가독성을 위해 여러 줄을 변수 이름을 변경 및 쓰기) :똑같은 두 가지 INSERT INTO 문

insert into FOO_TABLE (BEGIN, FIRST_VALUE, SECOND_VALUE, VALUE, BAR) select 
999, 
D.FIRST, 
(select O.SECOND from TABLE_TWO O where O.ID=555), 
333, 
444 
from TABLE_ONE D where D.ID=666 

이를 INSERT INTO ... SELECT ...

의 형태로 지금은 여기에 보인다 "선택"은 삽입물과 함께 사용되어 단일 행 행을 검색하고 작성합니다. 그러나 구문이 어색해 보입니다. 나는 그것을 다음과 같이 바꿨다 :

insert into FOO_TABLE (BEGIN, FIRST_VALUE, SECOND_VALUE, VALUE, BAR) values (
999, 
(select D.FIRST from TABLE_ONE D where D.ID=666), 
(select O.SECOND from TABLE_TWO O where O.ID=555), 
333, 
444) 

그리고 이것은 아무 문제없이 작동한다. 이것은 INSERT INTO ... VALUES ...

의 형식입니다. 성능 또는 다른 점에서 차이가 있습니까? 두 번째 줄은 내게 자연스러운 것처럼 보입니다.

+0

첫 번째 예제에서는 한 번에 두 개 이상의 행을 삽입 할 수 있지만 문제가되지는 않지만 WHERE 조건에 따라 두 개 이상의 행을 삽입 할 수 있습니다. 두 번째 예에서는 단 하나의 행만 삽입합니다. –

답변

2

차이점은 결과 집합의 카디널리티입니다.

TABLE_ONE의 행 수에 관계없이 첫 번째 문은 D.ID=666과 일치합니다. 반면에 둘 이상의 행이 반환되면 두 번째 명령문은 실패합니다.

insert into FOO_TABLE (BEGIN, FIRST_VALUE, SECOND_VALUE, VALUE, BAR) select 
999, 
D.FIRST, 
O.SECOND, 
333, 
444 
from TABLE_ONE D 
    cross join TABLE_TWO O 
where O.ID=555 
and D.ID=666 

오라클 최적화 TABLE_TWO이 고유 키에 일치하고 그에 따라 실행 계획을 작성할지 여부를 알 수있을만큼 영리하다 : 완성도를 들어

는 제 3 변형이있다.


상대적인 성능에 관해서는 모든 변이가 동일해야합니다. 물론 이것은 두 쿼리가 각각 하나의 행을 리턴 할 때 기대하는 바입니다. TABLE_ONE이 여러 행을 반환하면 차이가있을 수 있습니다. 항상 그렇듯이 쿼리를 조정할 때는 실행 시간이 데이터 볼륨과 비뚤어 짐에 민감하기 때문에 각 방법을 벤치마킹해야합니다.

+0

어느 것이 가장 성능이 좋은가? 어떤 방법이 최선인지, 당신의 솔루션은 또한 읽을 수 있지만 거기에 3 옵션을 알고 :) –