기초코드 설계 문의 0 4 1,013

by 잼보야 [2016.01.28 10:45:36]


안녕하세요. 너무 기초적인것을 질문하는 것 같아 많이 부끄럽지만 그래도 알고 싶어서 문의 드립니다. 

 

생산계획 테이블내에 생산지역이 컬럼이 존재하는데 아래의 표처럼 구성을 했습니다. 

구분1 구분2 구분3 실코드값
(컬럼값)
국내 한국 서울 101
경기 102
개성 개성 201
개성기타 202
해외 중국 청도 301
불산 302
해외기타 303
일본 교토 401
후쿠오카 402

 

보통 조회화면에서 활용하는 조회조건은 아래와 같습니다.

조회조건 : 생산처구분1(국내/해외) / 생산처구분2(국가구분) / 생산처구분3(지역구분)

으로 되어 있고 생산처구분1을 선택해야만 구분2값을 설정할 수 있고, 구분2값을 선택해야만 구분3을 설정할 수 있으며 필수 검색조건이 아닙니다.

구분3 [서울]로 선택  where조건문 : 생산처코드 = '101'

구분2 [한국]로 선택  where조건문 : substr(생산처코드, 1, 1) = '1'

구분1 [국내]로 선택 where 조건문 : substr(생산처코드, 1, 1) in ('1', '2')

위와같이 생산지역 검색조건을 넣으면 데이타 조회되는데 속도가 너무 오래 걸립니다.

제가 코드 및 컬럼을 잘못 구성해서 조회속도가 오래 걸리는 것 같아 이번에 제대로 배워서 맞게 구성하고 싶습니다.

생산처 테이블에 구분1, 구분2, 구분3 컬럼을 따로 가지고 있어야 되는지,

지금처럼 구성하는게 맞는지 아니면 다른 방법이 있는지..  좀 알려주세요. 

부탁드립니다. 

by 우리집아찌 [2016.01.28 11:01:14]

계층구조로 만드세요.


by 겸댕2후니 [2016.01.28 11:01:42]

제대로 된 검색성능을 위해선, 정규화가 반드시 필요합니다.

현재 구분1+구분2+구분3의 값을 컬럼한개로 구성해놓으셨는데,

이렇게 되면, 인덱스를 생성하더라도, 구분1값에 대해서만 적용가능하며,

구분2, 구분3조건에대해서는 인덱스를 제대로 사용할 수 없습니다.

위의 조건이 매우 빈번히 조회되는 조건이라면,

구분1, 구분2, 구분3으로 컬럼을 나누시고, (구분1,구분2,구분3)순서로 인덱스 생성 하시기 바랍니다.

또한 참고로 말씀드리면, 조건절의 컬럼의 변형이 일어나면

해당 인덱스를 제대로 사용할 수 없습니다.


by DeSSa [2016.01.28 11:33:44]

TBL_A    
a_code a1 a2
name 국내 해외
   
TBL_B    
a_code a1 a2
b_code 1 3
name 한국 중국
   
TBL_C  
b_code 1
c_code 101
name 서울
 

 

 

 

@테이블 3개로 가져가시는게 나아 보입니다.

SELECT * FROM TBL_C WHERE 생산처코드 = 101;
SELECT * FROM TBL_B WHERE b_code = '1'(한국)
SELECT * FROM TBL_A WHERE a_code = 'a1'(국내)

@값을 가져올때는 아래와 같이 원하시는 컬럼에 대해 JOIN 절을 추가 해주시면 될 것 같습니다.
SELECT * FROM TBL_A AS a JOIN TBL_B AS b ON a.a_code = b_a_code WHERE a.a_code = 'a1'(국내)

그리고 해당 쿼리가 느린 이유는 겸댕2후니님이 말씀하신대로 INDEX가 걸려 있다 할 지언정 조건컬럼을 가공하거나 연산을 할 경우에는INDEX가 적용되지 않습니다.

 

도움이 될거 같아 INDEX가 적용하지 않는 경우의 예를 추가합니다.

1. 연산자 not, <>

2. like '%value', like '%value%'

3. 조건 컬럼을 가공 및 연산

4. 문자열 일경우 150바이트 이하


by 잼보야 [2016.01.28 14:06:52]

좋은정보 친절한 설명에 감사 드립니다~ 덕분에 모르는 것을 배우는 재미가 생깁니다. 

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