기존 테이블에 데이터를 분리했을때 동시 조회시 질문 있습니다. 0 9 796

by 쫀득이 [2017.01.18 14:44:42]


잠시 상황을 설명 드리면

기존 AA 계정에 있던 emp, dept, group 테이블에 있는 데이터를 권한이 있고 없음에 따라 데이터를 분리 했습니다.

권한이 필요한 데이터 같은 경우 같은 테이블 스페이스에 BB 계정을 생성하여 emp, dept, group 테이블과 인덱스를 동일하게 생성하여 BB계정에 테이블로 데이터를 이관 하였습니다.

기존에 SQL이

SELECT *

 FROM emp x, dept y, group z

WHERE y.dept_id = x.dept_id

   AND z.group_id = x.group_id

이랬을때 권한이 있는 사용자가 데이터 조회시 AA계정에 있는 데이터와  BB계정에 있는 데이터가 동시에 조회가 되야 해

서 UNION ALL로 묶어서 조회를 했습니다.

case1) -------------------------------------

SELECT *

 FROM AA.emp x, AA.dept y, AA.group z

WHERE y.dept_id = x.dept_id

   AND z.group_id = x.group_id

UNION ALL

SELECT *

 FROM BB.emp x, BB.dept y, BB.group z

WHERE y.dept_id = x.dept_id

   AND z.group_id = x.group_id

---------------------------------------------

case2) -------------------------------------

SELECT *

 FROM (

           SELECT * FROM AA.emp

           UNION ALL

           SELECT * FROM BB.emp

          ) x,

          (

            SELECT * FROM AA.dept

            UNION ALL

            SELECT * FROM BB.dept

          ) y,

         (

           SELECT * FROM AA.group

           UNION ALL

           SELECT * FROM BB.group

         ) z

WHERE y.dept_id = x.dept_id

   AND z.group_id = x.group_id

---------------------------------------------

이렇게 두가지 케이스로 플렌 떠서 비교했을때

case1 같은 경우 한쪽만 조회했을때 보단 약 2배정도 시간과 cost 가 나오더라구요 플렌도 동일하게 풀리고

근데 case2 같은 경우 플렌자체도 다르게 풀리고 시간과 cost도 2배보다 더 나옵니다. 인덱스를 못타는 쿼리도 발생하더라구요

이제부터 질문입니다. 제가 DB를 많이 몰라서 질문이 다소 어의가 없더라도 양해 부탁 드립니다.

질문1) 한쪽을 조회할때보다 양쪽을 조회하면 시간이 약 2배정도 걸리는데 혹시 빨라질수 있는 방법이 있나요??;;;;

(제가 생각했을때는 테이블이 다르기 때문에 물리적인 저장 위치도 달라서 항상 2배씩 걸릴거라 예상하지만 제가모르는 뭔가 있을까 싶어 질문 드립니다.)

질문2) 동시조회를 해야 하는데 case1), case2) 말고 다른 방법이 있을까요???

 

조언 부탁 드립니다.

 

 

 

 

by 랑에1 [2017.01.18 15:14:35]

개인적인 견해만 말씀드리자면

case2에서는 AA에 있는 값과 BB에 있는 값과의 의미없는 조인 시도가 생기기 때문에 case1이 더 좋은 방법이 맞다고 생각합니다.

질문1) 제 생각엔 지금 구조에서는 case1이 최선인 것 같습니다.

질문2) 물리적으로 테이블을 나누어야하는 이유가 있나요?(보안상의 이유라든가..)

         그게 아니라면 테이블 하나에 구분값으로 구분하면 성능상으로는 나을 듯 합니다.

 

개인적인 견해였고 정답은 마농님 이하 다른 분이 해주실겁니다 ㅋㅋ


by 마농 [2017.01.18 15:16:08]

테이블을 통으로 관리하고
권한관리는 뷰를 이용하시면 어떨런지요?
WITH CHECK OPTION 으로 VIEW 를 만들어 권한을 부여하시면 될 듯.


모든 권한을 가진 사용자는 테이블을 조회하고
일부 권한을 가진 사용자는 뷰만 조회하도록


by 쫀득이 [2017.01.18 15:26:41]

아 분리 하는 이유는 보안규정상 그렇다고 합니다. 한개의 테이블에서 뷰를 통해 권한 유무로 조회하는건 안된다고 합니다. 물리적으로 나눠야 한다고 합니다.

답변주신 랑에1님 마농님 감사 합니다. ㅎㅎㅎ


by jkson [2017.01.18 15:29:36]

파티션 테이블로 테이블스페이스 다르게 할 수 있지 않나요? 보안상이라고 하시면 테이블 스페이스만 다르게 하고 권한에 따라 뷰로 제공하면 될 것 같은데요.


by 우리집아찌 [2017.01.18 16:52:30]

권한 구분으로 서브파티션 만들고 테이블스페이스 따로 걸면 될것같아..


by 마농 [2017.01.18 15:37:08]

물리적으로....의 의미를 잘 해석해야 할 것 같네요.
단순 유저 분리로는 같은 서버 내에서 파일 저장 위치만 분리되겠네요.
이는 보안 요구사항을 충족하지 못할 수도 있을 듯 하네요.
서버 자체를 분리해야 한다면? DB 링크를 이용해야 해서 더욱 느려지겠네요.
동일서버에서 파일만 달라도 된다면? 파티션 테이블로 분리하는것도 한 방법입니다.


by 쫀득이 [2017.01.18 15:41:11]

jkson 님 답변 감사 합니다. 파티션을 나누는건 생각 못했는데 그 방법이 보안규정을 통과 할수 있는지는 보안팀에 문의 해봐야 겠지만 다음에 유용하게 써먹을 게요 ㅎㅎ

현재는 상황상 데이터를 다른계정에 이관을 해서 동시에 조회를 해야 하네요 ㅎㅎ;;


by jkson [2017.01.18 15:51:29]

만약 파일만 나눠도 된다면 이번까지는 이렇게 적용하고 다음부터 해당 방법으로 적용할 게 아니라 데이터가 더 많아지기 전에 다시 테이블을 합치는 게 추후 개발상, 관리상으로도 나을 것 같습니다. 이미 해당 구조로 상당히 많이 개발이 진행되어버렸다면 어쩔 수 없겠지만요.


by 쫀득이 [2017.01.18 16:05:00]

jkson님............ 이미 많이 왔어요........ ㅜ.ㅠ 이관팀이 프로그램 개발해서 이관 하고 잇는데 지금 테스트 중입니다. 저는 동시 조회 해야 하는 업무들 쿼리 수정 하고 있고요... ㅎㅎㅎ;;;;

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