# MySql 4.1 버전 이상에서는 서브쿼리가 지원이 되어서 오라클에서처럼 서브쿼리를 사용하여
   편하게 그룹의 값을 확인할수 있었는데요.
   MySql 4.0대와 이전 버전에서는 서브쿼리가 지원이 되지 않는 문제가 있었습니다.

저의 경우는 로컬에서 MySql 5.0대로 개발을 한후 호스팅 업체의 리얼 서버에 적용을 하니,
MySql 버전에서 서브쿼리가 지원이 되지 않는 문제가 발생했었습니다.

에러 메세지:
ERROR 1064: You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near


# 변경전 쿼리(Sub Query사용) :
SELECT a.MEMO_SEQ, a.MEMO_TYPE, a.CONTENTS, a.REG_YEAR, a.REG_MONTH_DAY, a.REG_TIME, a.USER_ID, a.IS_SHOW,
   (SELECT COUNT(REG_MONTH_DAY)AS CNT
     FROM TIME_MEMO
     WHERE REG_MONTH_DAY = a.REG_MONTH_DAY
   )AS CNT

    FROM TIME_MEMO a
    WHERE a.IS_SHOW = 1
    AND a.USER_ID = 'sunshiny'
    ORDER BY a.MEMO_SEQ DESC;


# 변경후 쿼리(Group By사용) :
SELECT a.MEMO_SEQ, a.MEMO_TYPE, a.CONTENTS, a.REG_YEAR, a.REG_MONTH_DAY, a.REG_TIME, a.USER_ID, a.IS_SHOW, COUNT(b.REG_MONTH_DAY)AS CNT
FROM TIME_MEMO a, TIME_MEMO b
WHERE a.IS_SHOW = 1
    AND a.USER_ID = 'sunshiny'
    AND a.REG_YEAR = b.REG_YEAR
    AND a.REG_MONTH_DAY = b.REG_MONTH_DAY
GROUP BY a.MEMO_SEQ, a.MEMO_TYPE, a.CONTENTS, a.REG_YEAR, a.REG_MONTH_DAY, a.REG_TIME, a.USER_ID, a.IS_SHOW
ORDER BY a.MEMO_SEQ DESC



# 중복 값 찾기 :
SELECT AAA, BBB, CCC
   FROM ABC
 GROUP BY AAA, BBB, CCC
 HAVING COUNT(*) > 1;


01 5, 2010 13:36 01 5, 2010 13:36

Trackback URL : http://develop.sunshiny.co.kr/trackback/364

Leave a comment

DB - GROUP BY 절에서의 JOIN 실행계획 테스트

Posted 02 12, 2009 23:48, Filed under: DataBase

### SQL을 사용할때 한번 읽은 DB블럭을 다시 읽지 않도록 한다. ###

# EMP DB 블럭을 두번 읽어서 처리
부서이름으로 GROUP BY 를 하기위해 대량의 조인을 함

SELECT b.DNAME, COUNT(*) CNT, SUM(SAL) SAL
    FROM EMP a, DEPT b
    WHERE a.DEPTNO = b.DEPTNO
    GROUP BY b.DNAME
    UNION ALL
    SELECT '총계', COUNT(*), SUM(SAL)
    FROM EMP;


## trace ##
Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        2    0.002        0.002          0         22          0          4
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        4    0.002        0.003          0         22          0          4
Misses in library cache during parse: 0
Optimizer goal: CHOOSE
Parsing user: SCOTT (ID=60)
Rows     Row Source Operation
-------  ---------------------------------------------------
      0  STATEMENT
      4   UNION-ALL  (cr=22 r=0 w=0 time=2047 us)
      3    SORT GROUP BY (cr=19 r=0 w=0 time=1573 us)
     14     NESTED LOOPS  (cr=19 r=0 w=0 time=1065 us)
     14      TABLE ACCESS FULL EMP (cr=3 r=0 w=0 time=273 us)
     14      TABLE ACCESS BY INDEX ROWID DEPT (cr=16 r=0 w=0 time=525 us)
     14       INDEX UNIQUE SCAN PK_DEPT (cr=2 r=0 w=0 time=187 us)(Object ID 31698)
      1    SORT AGGREGATE (cr=3 r=0 w=0 time=301 us)
     14     TABLE ACCESS FULL EMP (cr=3 r=0 w=0 time=210 us)

## 실행 계획 ##
Execution Plan
--------------------------------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   UNION-ALL
   2    1     SORT (GROUP BY)
   3    2       NESTED LOOPS
   4    3         TABLE ACCESS (FULL) OF 'EMP'
   5    3         TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
   6    5           INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
   7    1     SORT (AGGREGATE)
   8    7       TABLE ACCESS (FULL) OF 'EMP'


# EMP DB 블럭을 한번만 읽어서 처리한다.

SELECT case when no = '01' then dname
    else '총계'
    end name,
    sum(cnt) cnt, sum(sal) sal
FROM 
(SELECT b.DNAME, a.CNT, a.SAL
    FROM 
(SELECT DEPTNO, COUNT(*) CNT, SUM(SAL) SAL
            FROM EMP
            GROUP BY DEPTNO
         ) a,
DEPT b
    WHERE a.DEPTNO = b.DEPTNO
) c,
(SELECT '01' no FROM dual union all select '02' from dual) d
GROUP BY case when no = '01' then dname
    else '총계'
    end;


## trace ##
Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        2    0.002        0.002          0         26          0          4
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        4    0.002        0.002          0         26          0          4
Misses in library cache during parse: 0
Optimizer goal: CHOOSE
Parsing user: SCOTT (ID=60)
Rows     Row Source Operation
-------  ---------------------------------------------------
      0  STATEMENT
      4   SORT GROUP BY (cr=26 r=0 w=0 time=1836 us)
      6    NESTED LOOPS  (cr=26 r=0 w=0 time=1550 us)
      3     NESTED LOOPS  (cr=8 r=0 w=0 time=908 us)
      3      VIEW  (cr=3 r=0 w=0 time=644 us)
      3       SORT GROUP BY (cr=3 r=0 w=0 time=619 us)
     14        TABLE ACCESS FULL EMP (cr=3 r=0 w=0 time=305 us)
      3      TABLE ACCESS BY INDEX ROWID DEPT (cr=5 r=0 w=0 time=182 us)
      3       INDEX UNIQUE SCAN PK_DEPT (cr=2 r=0 w=0 time=81 us)(Object ID 31698)
      6     VIEW  (cr=18 r=0 w=0 time=572 us)
      6      UNION-ALL  (cr=18 r=0 w=0 time=520 us)
      3       TABLE ACCESS FULL DUAL (cr=9 r=0 w=0 time=171 us)
      3       TABLE ACCESS FULL DUAL (cr=9 r=0 w=0 time=201 us)

## 실행 계획 ##
Execution Plan
--------------------------------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (GROUP BY)
   2    1     NESTED LOOPS
   3    2       NESTED LOOPS
   4    3         VIEW
   5    4           SORT (GROUP BY)
   6    5             TABLE ACCESS (FULL) OF 'EMP'
   7    3         TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
   8    7           INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
   9    2       VIEW
  10    9         UNION-ALL
  11   10           TABLE ACCESS (FULL) OF 'SYS.DUAL'
# '01', '02' 두값만 fullscan
  12   10           TABLE ACCESS (FULL) OF 'SYS.DUAL'


위의 쿼리에서 동일한 결과
NAME          CNT   SAL
----------------------
ACCOUNTING 3     8750
RESEARCH    5    10875
SALES           6     9400
총계             14    29025

02 12, 2009 23:48 02 12, 2009 23:48

Trackback URL : http://develop.sunshiny.co.kr/trackback/135

Leave a comment


Recent Posts

  1. Linux - Telnet 서비스 비활성및 실행
  2. NT - 서버 원격데스크탑 연결
  3. NT - http와 https간에 세션 공유가...
  4. Unix - 대량 파일 이동, 삭제시 Argu...
  5. Oracle - SYS_CONTEXT 함수를 이용하...

Recent Comments

  1. 네. 고맙습니다^^ 행복한 한해 보... sunshiny 01 16,
  2. sunshiny님. 안녕하세요... 올려 주... yihans 01 16,
  3. 답글 주셔서 고맙습니다^^ 소스 복... sunshiny 01 11,
  4. 관리자만 볼 수 있는 댓글입니다. 비밀방문자 01 11,
  5. 넵 답변감사합니다^^ 좋은 하루 되... 노로링

Recent Trackbacks

  1. 윈도우 cmd 명령어 팁 월풍도원(月風道院) - Delight on th... %M
  2. 파일 압축 Like RadioHead %M
  3. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   02 2012   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. Oracle All Documentation
  4. 엑셈
  5. 오라클 클럽
  6. 네이버개발자센터
  7. API - Java
  8. API - Spring
  9. Java Community
  10. Reference - Spring
  11. 스프링사용자
  12. 자바지기
  13. Ready System
  14. Solaris Freeware
  15. Linux-Site
  16. RedHat Korea
  17. 윈디하나의 솔라나라

Site Stats

TOTAL 217714 HIT
TODAY 16 HIT
YESTERDAY 115 HIT