안녕하세요. 너무 기초적인것을 질문하는 것 같아 많이 부끄럽지만 그래도 알고 싶어서 문의 드립니다.
생산계획 테이블내에 생산지역이 컬럼이 존재하는데 아래의 표처럼 구성을 했습니다.
구분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 컬럼을 따로 가지고 있어야 되는지,
지금처럼 구성하는게 맞는지 아니면 다른 방법이 있는지.. 좀 알려주세요.
부탁드립니다.
|
||||||||||||||
|
||||||||||||||
|
|
@테이블 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바이트 이하