2013. 11. 27. 09:53

[Oracle] SID, SPID 를 통해 수행하고 있는 쿼리 찾기

가끔 모니터링을 하다보면 OS의 cpu 혹은 memory를 많이 잡아먹는 Oracle session들이 발견된다.

그 넘들이 어떤 쿼리를 날리고 있는지 확인할 수 있다.

 

 

## oracle sid를 이용한 sql문 찾기


select a.username,a.program,a.machine,a.module,b.spid,a.sid,a.serial#,a.status,
       c.sql_text
  from v$session a,
       v$process b,
       v$sql     c
 where a.sid = '&sid'
   and b.addr = a.paddr
   and a.sql_hash_value = c.hash_value(+)
   and a.sql_address    = c.address(+);

 

 

## os pid를 이용한 sql문 찾기

 
 select /*+ use_hash(a,b,c) */
       a.username,a.program,a.machine,a.module,b.spid,a.sid,a.serial#,a.sql_hash_value,
       d.PHYSICAL_READS, d.BLOCK_GETS,
       c.sql_text
  from v$session a,
       v$process b,
       v$sql     c,
       v$sess_io d
 where b.spid = '&pid'
   and b.addr = a.paddr
   and a.sid  = d.sid
   and a.sql_hash_value = c.hash_value(+)
   and a.sql_address    = c.address(+);

 

 

2013. 10. 18. 15:36

[Oracle] SYS_CONNECT_BY_PATH 문자열 합치기??

## SAMPLE 1

 

 SELECT SUBSTRB(MAX(SYS_CONNECT_BY_PATH(CARTONID,', ')),2) CARTONID
   FROM (
         SELECT ROWNUM RW, NVL(B.CARTONID,C.CARTONID) CARTONID
           FROM TTASKINHI A, TCONTENT B, TCONTENTHI C
          WHERE A.OWNERID = '1474'
            AND A.ORDERID = '131001-901642'
            AND A.ITEMID  = '1118825'
            AND A.CONTENTID = B.CONTENTID(+)
            AND A.CONTENTID = C.CONTENTID(+)
        )
  START WITH RW=1
CONNECT BY PRIOR RW=RW-1;

 

 

1. 내부 쿼리 실행시

RW CARTONID

1    32021092K
2    32021092K
3    32021092K
4    32021092K

 

2. 전체 쿼리 실행시

CARTONID

32021092K, 32021092K, 32021092K, 32021092K

 

 

## SAMPLE 2

 

 SELECT A, MAX(SYS_CONNECT_BY_PATH(B,'/')) B
    FROM (

                SELECT ROW_NUMBER() OVER(PARTITION BY A ORDER BY A) AS RNUM
                           , A, B
                   FROM (
                                SELECT 1 A, '엄마' B FROM DUAL
                                UNION
                                SELECT 1 A, '아빠' B FROM DUAL
                                UNION
                                SELECT 1 A, '이모' B FROM DUAL
                                UNION
                                SELECT 2 A, '삼촌' B FROM DUAL
                                UNION
                                SELECT 2 A, '오빠' B FROM DUAL
                             )
              )
 START WITH RNUM = 1
 CONNECT BY PRIOR RNUM = RNUM - 1 AND PRIOR A=A
 GROUP BY A

 

 

1. 내부 쿼리 실행시

A B

1 아빠
1 엄마
1 이모
2 삼촌
2 오빠

 

2. 전체 쿼리 실행시

A B

1 /아빠/엄마/이모
2 /삼촌/오빠


 

3. RNUM = 1 -> RNUM = 2 변경시

A B

1 /엄마/이모
2 /오빠

 

 

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

 

 

### 타블로그 참조 ###

 

 

SELECT DEPTNO, ENAME FROM EMP; 했을 때 결과

------------------------------
DEPTNO | ENAME
------------------------------
1 | A1
1 | A2
2 | B1
2 | B2
2 | B3
3 | C1
3 | C2
3 | C3
3 | C4
4 | D1
4 | D2
------------------------------

 

##

 

 

ROW_NUMBER() OVER( PARTITION BY DEPTNO ORDER BY ENAME ) RNUM
: DEPTNO를 기준으로 순서대로 번호를 준다. 예시를 보는 것이 빠르겠다..

SELECT
DEPTNO
,ENAME
,ROW_NUMBER() OVER( PARTITION BY DEPTNO ORDER BY ENAME ) RNUM
FROM
EMP;

------------------------------
DEPTNO | ENAME | RNUM
------------------------------
1 | A1 | 1
1 | A2 | 2
2 | B1 | 1
2 | B2 | 2
2 | B3 | 3
3 | C1 | 1
3 | C2 | 2
3 | C3 | 3
3 | C4 | 4
4 | D1 | 1
4 | D2 | 2
------------------------------

DEPTNO 들끼리 묶은 후 순서대로 ROW 하나당 1씩 증가한다.

 
##

SYS_CONNECT_BY_PATH .................. CONNECT BY

그냥 직접 돌려 보는 게 가장 빠르다....

 
##

SELECT
DEPTNO
,SUBSTR(MAX( SYS_CONNECT_BY_PATH(ENAME, ',')), 2) PATH
FROM
(
SELECT
ENAME
,DEPTNO
,ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY ENAME) RNUM
FROM
EMP
)
START WITH RNUM = 1
CONNECT BY
PRIOR RNUM = RNUM - 1
AND PRIOR DEPTNO = DEPTNO
GROUP BY DEPTNO

결과

------------------------------
DEPTNO | PATH
------------------------------
1 | A1,A2
2 | B1,B2,B3
3 | C1,C2,C3,C4
4 | D1,D2
------------------------------
2013. 9. 26. 10:32

[Oracle] 대소문자 처리

1. 컬럼명과 데이블명은 원도우,리눅스,유닉스에서 대소문자를 가리지 않습니다.
 


2. SQL문은 대소문자를 구분하지 않습니다.
 
SELECT NAME FROM LEE;
select NAME from LEE;
-- 2개다 같은 출력을 합니다.
 
※ SQL 쿼리는 대문자로 써주는것이 좋습니다.
 


3.문자열 데이타형은 기본으로 대소문자를 구분합니다.
 

SELECT * FROM TAB WHERE NAME = 'lee';

SELECT * FROM TAB WHERE NAME = 'LEE';

-- lee컬럼의 값이 lee라면 첫번째것은 되지만 두번째것은 되지 않는다.
 


4.대소문자 구분없이 검색하는법
 

WHERE UPPER("+search+") LIKE UPPER('%"+keyword+"%')

WHERE LOWER("+search+") LIKE LOWER('%"+keyword+"%')

 

※검색할 단어와 비교할 컬럼을 모두 대문자나 소문자로 만든후 비교합니다.