dbLink걸린 테이블을 조인해서 조회할 때 조회가 너무 지연됩니다. 0 14 3,177

by 냄냐 [SQL Query] [2020.01.09 17:37:07]


-- 1.657초
SELECT tt.vendor_name
  FROM cboap_invoice_header_temp a
      ,cboap_vendor_v@l_fprod tt
 WHERE a.invoice_id = 3003363
   AND xx1.dec_varchar2_sel(a.vat_reg_num, 10, 'SSN', 'test_data', 'val') = tt.vendor_reg_num

현재 위의 쿼리로 실행 했을 때 1.6초 ~ 1.8초정도 나옵니다.

 

cboap_invoice_header_temp 데이터 건수는 1,853,041건이고 

cboap_vendor_v@l_fprod 데이터 건수는 293,676건 입니다.

따로 쿼리를 실행해본 결과는 아래와 같습니다.

 

-- 0.031초
SELECT xx1.dec_varchar2_sel(a.vat_reg_num, 10, 'SSN', 'test_data', 'val') 
  FROM cboap_invoice_header_temp a
 WHERE a.invoice_id = 3003363

 

-- 0.047초
SELECT tt.vendor_name
  FROM cboap_vendor_v@l_fprod tt
 WHERE '215-86-65235' = tt.vendor_reg_num

 

인터넷에서 아무리 찾아봐도 튜닝에 대한 지식이 없어서 해결을 못하겠어요..

그나마 빠르게 돌아갔던 힌트는 /*+ parallel(tt) */로 0.8초정도로 나오구요

driving_site라는 힌트를 줘보라해서 driving_site /*+ driving_site(tt) */를 해봤는데 속도는 변함없었습니다.

어떤 힌트를 적용해야 속도가 잘나올까요?? 

 

읽어주셔서 감사합니다.

by 마농 [2020.01.10 08:33:49]

건수가 어떻게 되나요?
invoice_id 하나에 reg_num 은 몇개나 되나요?
실행계획은 확인이 되나요?
다양한 시도를 해보세요.
driving_site(a) 도 해보시구요.
(SELECT xx1.dec_varchar2_sel(a.vat_reg_num, 10, 'SSN', 'test_data', 'val') FROM dual) 도 해보시고
a 를 복호화해서 비교하는 대신 반대로 b 를 암호화 해서 비교해 보세요.


by 냄냐 [2020.01.10 08:47:55]

마농님 답변 감사합니다

1. cboap_invoice_header_temp 데이터 건수는 1,853,041건

cboap_vendor_v@l_fprod 데이터 건수는 293,676건

2. a에서 invoice_id는 유니크 값이기 때문에 1건나오구요, tt의 reg_num도 유니크라 조회조건에는 1건 나옵니다.

3. 실행계획은 3번째 쿼리tt만 확인이 안되고 나머지는 확인됩니다. 첫번째 쿼리에서는 tt부분은 REMOTEㄹ로 나와있어요.

3. driving_site(a)를 해도 속도는 같더라구요 ㅠㅠ

4. 암호화해서 비교하니 3초정도로 거의 두배로 느려져요 ㅠㅠㅠㅠㅠ

어떻게하면 좋을까여ㅠㅠㅠ 문제 원인조차 모르겠으니 답답해요

 


by 우리집아찌 [2020.01.10 09:06:51]

1. 실시간 조회가 필요한건가요? 그렇지 않으면

cboap_vender_v 테이블을 주기적으로 이관해서 조회하는 방법이 있습니다.

 

2. cboap_vender_v 테이블이 dblink쪽에 존재하면 두개 테이블 전부 dblink 통해서 조인으로 처리하세요

 

3. 위의 두개가 불가능하고 조건이 몇개 안되면 sql을 두번써서 조회조건으로 붙여보세요

 

4. 이관 작업이면 아예 로컬에 테이블만들어서 이관시마다 담아놓고 사용합니다


by 냄냐 [2020.01.10 09:45:58]

실시간 조회에여

실시간 조회고 한 건만 조회하는데 왜이렇게 느린걸까요 ㅠㅠㅠ 따로따로 쿼리하면 빠른데 합치면 느려지는것두 이해가안되구.


by 냄냐 [2020.01.10 10:01:09]

optimizer로 보니깐 Reomote의 cost가 2500이나 돼요.. 답은 driving_site힌트인거 같은데 왜 힌트를 줘도 안먹을까여


by 우리집아찌 [2020.01.10 10:51:41]

한건 조회면 sql 두번 돌려서 쓰세요  

첫번째 cbap_invoice_header_temp 에서 조회값 추출

두번째 cboap_veder_v where vender_reg_num = 찻번째 추출값


by 냄냐 [2020.01.10 11:15:31]

plsql로 작성하라는 말씀이신가요? 

아니면 인라인뷰 말씀하신건가요?

인라인뷰는 따로 쿼리해서 해보았는데 결과는 똑같았어요.

 


by 소주쵝오 [2020.01.10 11:00:57]

SELECT /*+ leading(a) use_nl(tt) driving_site(tt) */ tt.vendor_name

이렇게도 해보셨겠죠?ㅎ


by 냄냐 [2020.01.10 11:12:13]

아쉽게도 1.75초정도로 좀 더 오래걸려요 왜그런걸까여 ㅠㅠㅠ


by 마농 [2020.01.10 11:25:40]

IN 절에 넣어 보는건 어떤가요?

SELECT tt.vendor_name
  FROM cboap_vendor_v@l_fprod tt
 WHERE tt.vendor_reg_num = (SELECT xx1.dec_varchar2_sel(a.vat_reg_num, 10, 'SSN', 'test_data', 'val')
                              FROM cboap_invoice_header_temp a
                             WHERE a.invoice_id = 3003363
                            --   AND ROWNUM <= 1  -- 로넘도 추가해 보세요.
                            )
--   AND ROWNUM <= 1  -- 로넘도 추가해 보세요.
;

 


by 냄냐 [2020.01.10 12:02:04]

젤 바깥에서 ROWNUM = 1 넣으니 1.7초에서 0.7초가 됐어요 오오

In 절과는 상관없이 기존쿼리에도 rownum = 1을 넣으니 속도가 똑같이 0.7초가 나오네요.

감사합니다. 

0.1초 아래로는 불가능한건가요? 실제는 한건씩 조회하는게 아니라 조회하는데 분단위로 걸리네요..


by 우리집아찌 [2020.01.10 11:35:21]

제가 해온바로는 한쪽db애서 조인해서 처리해야 빠릅니다. 양쪽 걸린경우는 상수값을 던져서 처리했어요요그래서 프로시져를 이용하던가 sql을 따로 두번 써썼습니다

 

모바일이라 답글로 안달리네요


by 냄냐 [2020.01.10 12:04:11]

맞아용 ㅠㅠ이상하게 sql한문장에서 처리하려면 느려지더라구요..


by 마농 [2020.01.10 13:18:25]

처음부터 여러건 조회하는 걸로 질문하셔야죠.
한건 조회하는 것과 여러건 조회하는 것은 문제가 전혀 다르죠.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입