지금은
select * from
(
select * from A
EXCEPT
select * from B
)
union all
(
select * from B
EXCEPT
select * from A
)
로 해서 원하는 값이 나오기는하는데 시간이 3초정도 걸립니다. 이걸 1초 내외로 줄여야하는데 다른 방법이 있을까요
테이블 A와 B의 구조는 동일합니다.
ㅠㅠ 광명의 손길을 내려주세요..
아 그리고 현재로써는 A에 있고 B에 없는것도 다른것으로 판별하는데 A에있고 B에 없는건 그냥 검출이 안되게 했으면 더좋겠네요..
Comment 10
-
무념
2013.08.07 12:18
-
뽀구
2013.08.07 14:38
무념님 답변감사합니다.... 테이블구조는 쓰기는 좀그렇고
그냥 저걸실행한걸 그냥 c#프로그램으로 보여줄려고합니다....
-
진윤호
2013.08.07 14:21
다름 프로그램의 도움을 받는 것이지만 그냥 확인용이라면
텍스트로 결과 표시 a 테이블 출력 ,텍스트로 결과 표시 b 테이블 출력
beyond compare 같은 프로그램으로 비교 하시는 것이 가장 빠르더군요
어차피 예시로 넣은 소스를 보니 풀테이블 스캔이고 그걸 4번이나 하면 오래 걸리는 것은 당연하지 않을까도 싶습니다.
-
뽀구
2013.08.07 14:39
진윤호님 답변감사합니다. 확인해서 나온값을 써야되서 다른프로그램은 사용하기좀 그렇네요 ㅠㅠ.
-
맨즈밤
2013.08.07 14:21
다른건 모르겠고 , EXCEPT 를 쓸때 저렇게 * 를 주게되면 모든 컬럼을 비교하게 됩니다. 명확한 이유로 * 쓴게 아니라면 ,PK 컬럼만 SELECT 절에 주고 실행해 보시지요.
-
뽀구
2013.08.07 14:40
맨즈밤님 답변감사합니다.. 애석하게도 모든 컬럼을 검사해야되서요...
자료가 많아서 달단위로 끊었는데도. 여전히 오래걸리네요 ㅠㅠ
-
맨즈밤
2013.08.07 15:04
그냥 궁금해서 그러는데, 저렇게 하는 이유가 운영DB 에서 분석DB로 데이터를 스케쥴에 따라 이관작업 하시기때문에 그런건가요? 테이블구조도 같고, 전컬럼 비교해야한다고 해서요. 쿼리자체에서 튜닝이 안된다면..움..
운영DB의 해당테이블에 트리거나 추적걸고 변화된(입력,수정,삭제) 자료의 키값만 이력테이블에 넣은다음 이관시에 이력테이블의 키값을 기준으로 그 데이터만 비교하면 좀더 낫지않을까 생각됩니다. 그리고 분석DB의 테이블을 TRUNCATE TABLE 로 순삭후 INSERT SELECT 로 전체데이터 입력하는방법도 테스트해보세요. 최소로깅이 적용되면 생각보다 빨리 대량의 데이터가 입력됩니다.
-
뽀구
2013.08.07 15:44
네 맞습니다. 근데 트리거를 걸거나 db구조를 변환시키기는 조금 힘든여건이라.. 전체를 비교했는데 느리네요...
-
진윤호
2013.08.07 17:23
두 테이블을 UNION 해서 모든 컬럼을 문자열로 변환하여 1컬럼으로 표시되게 한다음 GROUP BY 해서 HAVING이 1이상 되는게 있는지 체크 한 후에 사용하는 건 어떠실까요? 더 느릴라나;;
-
minsouk
2013.08.09 00:46
http://cafe.naver.com/sqlmvp/3402
except 는 plan 상 절대로 join 보다 빨라질 수 없습니다. 그냥 일반적인 join 으로 써 보세요~
1. sp_help 로 나온 테이블 구조.
2. 예상 실행 계획
을 첨부하면 바로 답변 해주실분이 많을 것 같은데요.
지금 질문으로는 답을 해줄 수가 없습니다.(베테랑 dba라도 힘듬)