발생일: 2009.05.26 문제: 검색하고자 하는 컬럼에 인덱스를 추가하였는데도 뚜렷한 성능 향상이 보이지 않는다. 검색 시 인덱스를 타지 못하고 있는 건 아닐까? 해결책: 데브피아의 전문가 컬럼 'INDEX 과연 달면 빠른가?'에 명확하게 설명되어 있다. (IE에서만 보인다.) 요약하자면 아래와 같이 인덱스가 달린 컬럼에 변형이 있을 경우, 인덱스가 정상적으로 적용되지 않는다. 인덱스 컬럼에 변형이 일어난 경우 WHERE TO_CHAR(HIREDATE,'YYYYMMDD') = '19980518'; WHERE SALARY + 1000 > 100000; 내부적인 변형이 일어난 경우 (EMP_ID를 Number로 인식한다) WHERE EMP_ID = 200383; NULL을 비교하였을 경우 WHERE JO..
발생일: 2009.05.09 문제: 게시판 전체 목록의 태그들을 각각 가져와 한 줄로 뿌려주려고 한다. 각 게시물에 해당하는 태그 목록을 각각 조회해 가져오자니 너무 비효율적이라서, 게시물에 해당하는 태그(여러 개의 row)의 값을 공백으로 구분으로 넣으려고 한다. 데이터베이스는 mysql을 사용한다. 해결책: mysql의 GROUP_CONCAT 함수를 사용하면 된다. GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') 와 같이 사용한다. mysql reference에 잘 설명되어 있다. 참고하자.
발생일: 2009.04.26 문제: mysql 을 이용하는 시스템에서 게시물의 생성 시간을 추가하기 위해 컬럼을 하나 추가했다. 컬럼명: createddate 데이터 타입: date 게시물 작성 후, createddate 로 정렬하려 했는데 정상적으로 정렬되지 않는다. 해결책: mysql 의 date 는 오라클과 달리 일자까지만 저장한다. (yyyy-mm-dd) 초단위 시간까지 포함하려 한다면 datetime 타입으로 컬럼을 생성해야 한다. mysql 의 데이터 타입에 대해 잘 정리해놓은 블로그가 있다. 날짜와 시간 함수에 대해 정리해놓은 블로그도 참고하자.
발생일: 2009.03.31 문제: 날짜 A로부터 날짜 B까지 쭉~ 뿌리고 싶다. 해결책: LEVEL 과 CONNECT BY 구문을 사용해보자. 아래와 같이 사용하면 된다. SELECT TO_CHAR(TO_DATE('2009.03.31', 'yyyy.mm.dd') + LEVEL - 1, 'yyyy.mm.dd') FROM DUAL CONNECT BY TO_DATE('2009.03.31', 'yyyy.mm.dd') + LEVEL - 1 < TO_DATE('2009.04.03', 'yyyy.mm.dd')
발생일: 2009.03.31 문제: SQL이 convention 에 맞지 않게 코딩되어 있어 수정하려면 매우 골치 아픈 경우,.. 게다가 SQL Formatter를 지원하는 DB Tool도 라이센스 때문에 쓸 수 없을 경우,.. 시스템 로그에서 쿼리가 줄바꿈 없이 쭉쭉 나오는 경우,.. ...스트레스를 매우 받는다... 해결책: 더 스트레스 받기 전에 Online SQL Formatter 를 사용해보자. 강추! 마음에 들지 않는다면 sql formatter 로 구글링 해도 좋다.
발생일: 2009.03.19 문제: 오라클에서 이전 / 이후의 게시물 아이디를 얻어오고자 할 때 해결책: 오라클에서 제공하는 lag / lead 함수를 이용하여 목록에서 이전 / 이후의 아이디를 가져온다. 전체 게시물을 대상으로 id, lag(id), lead(id)를 조회한 후, 해당 게시물에서 id 값을 찾아내도록 한다. ex) SELECT previous, next FROM ( SELECT deptno lag(deptno) over (order by deptno) as previous lead(deptno) over (order by deptno) as next FROM scott.dept) ) WHERE deptno = #deptno#
발생일: 2009.02.19 문제: 오라클에서 상위 계층과 하위 계층의 관계를 설정하고 정렬하고자 한다. 해결책: START WITH, CONNECT BY 구문을 사용해보자. 해당 구문에 대한 블로그를 참고하자. 예) SELECT LEVEL, itemid, itemname FROM item START WITH itemid = 0 // itemid가 0인 것부터 시작 CONNECT BY PRIOR itemid = parentid // itemid 와 parentid를 계층화 (부모에서 자식으로 계층화) * 팁: 동일 레벨의 지정 컬럼으로 정렬하고자 할 때에는 ORDER SIBLINGS BY 컬럼명 을 사용하면 된다.