오라클 11g부터 bypass_ujvc 힌트를 쓸 수 없다.

멀쩡하게 잘 돌던 쿼리가 어느날 갑자기 안 도는데

당장 시스템은 돌려야 되고..

여러모로 멘붕 상태에서 미친 듯이 해결 방법을 찾아다니다가

merge 쿼리를 발견하였다.

 

merge가 뭐하는 쿼린지 생전 처음 보는 건데

암튼 그걸 써야 해결이 된다니 일단 시도!

이게 진짜 잘 도는건지 어쩐건지 모르겠지만

일단 에러는 안나니 다행이다. ㅠㅠ

 

* How to change it?

-- 변경전

update /*+  bypass_ujvc */

(select a.*, b.col2

from table1 a, table2 b

where a.xxx = b.yyy)

set a.col1 = b.col2

;

-- 변경후

merge /*+ use_hash */
into table1 a
using table2 b
on (a.xxx = b.yyy)
when matched then
update set

a.col1 = b.col2

;

 

Posted by 흑마뇨
,

column -> row 변환 방법 올리면서
이것도 같이 올린 줄 알았는데 안 올렸었네..
생각난 김에 gogo~

* 하고 싶은 일

b     -->    a, b, c
c

* SQL
SELECT SUBSTR (MAX (SYS_CONNECT_BY_PATH(ch, ',')), 2) path#
FROM (SELECT ch, ROWNUM rnum
     FROM abc)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1

* 참고
SYS_CONNECT_BY_PATH : 최초 ROOT의 내용을 가지고 LEAF까지 보여주는 함수 (9i)
매우 자세하고 친절한 설명 <- 나도 이거 보고 알아뜸


엄밀히 말하면 이 쿼리는 row를 column으로 바꾸는 건 아니고
row 데이타를 , 로 연결한 한 개의 문자열로 return 해주는 것이로군..
그렇다면 이걸 각각의 column으로 바꾸려면?
row 의 갯수가 고정된 경우라면 decode를 적절히 사용해서
단일행의 분리된 column으로 조회가 가능하지만
위와 같이 row 수가 가변적인 경우는 아마도 불가능할 걸~
그런 거 알면 갈켜주셈.. 나도 좀 알자.. ㅋㅋ

Posted by 흑마뇨
,

delete하는데 자꾸 에러난다.

ORA-01502: index '인덱스명' or partition of such index is in unusable state

인덱스가 깨졌을 때 나는 에러란다.

alter index 인덱스명 rebuild 로 해결~

파티션에 따라
alter index 인덱스명 rebuild partition명 을 쓰는 경우도 있다고 한다.

Posted by 흑마뇨
,

이런건 적어둬야 안 까먹는다;;

- 물리적 위치 조회

SELECT
          TABLESPACE_NAME,FILE_NAME
FROM
          DBA_DATA_FILES;


- 테이블 스페이스 별 공간 조회
SELECT
     a.tablespace_name, ROUND(SUM(a.total)/1024/1024, 2) "Total(M)",
     ROUND((SUM(a.total) - SUM(NVL(b.free, 0)))/1024/1024, 2) "Used(M)",
     ROUND(SUM(NVL(b.free, 0))/1024/1024,2) "Free(M)",
     ROUND((SUM(a.total) - SUM(NVL(b.free, 0))) / SUM(a.total) * 100 , 2) "Used(%)"
FROM
     (
       SELECT d.tablespace_name, d.file_id, sum(d.bytes) total
       FROM dba_data_files d
       GROUP BY d.tablespace_name, d.file_id
      ) a,
     (
       SELECT f.file_id, sum(f.bytes) free
       FROM dba_free_space f
       GROUP BY f.file_id
     ) b
WHERE
     a.file_id = b.file_id(+)
GROUP BY a.tablespace_name;


Posted by 흑마뇨
,
프로그램 개발로 밥 벌어 먹은지 꽤 됐건만
SQL은 간단한 조회 쿼리 외에는 써 본 적이 없는데
어쩐 일인지 요즘 쿼리 짤 일이 너무 많다. ㅠㅠ
기왕 하는 일이니 쓸만한 거 나오면 정리나 해둬야지..
뭐 언제 다시 쓸 일 있을지는 몰겠다만 ㅎㅎ

* 뭐 하자는 거?
   'a','b','c' 요렇게 나오는 data를
   'a'
   'b'
   'c' 요렇게 바꾸겠단 말씀

* SQL 예제
select (DECODE(rownum, 1,a, 2,b, c)
   from (select 'a' a, 'b' b, 'c' c from dual)
CONNECT BY LEVEL <= 3

* SQL 응용 : '200808','200809','200810','200811','200812' 을 각각의 row로 조회
select (CASE WHEN rownum < 6 then year||lpad(rownum+7,2,'0') END) yearmonth
   from (select '2008' year from dual)
CONNECT BY LEVEL <= 5

* KEY POINT
CONNECT BY LEVELDECODE!!
decode는 case로 대체 가능하고
컬럼 개수를 미리 알고 있어야 한다.
connect by level로 컬럼 개수만큼 돌리면서
case나 decode로 data를 하나씩 뽑아내는 것이지.


별 것도 아닌 TIP을 이렇게 산만하게 쓸 수 있다니!!
나만 알아볼 수 있으면 된다지만 과연 나중에 알아볼 수 있을런지;;;

Posted by 흑마뇨
,

무식하면 손발이 고생한다고..
사람은 역시 배워야 한다.
분석 함수 만세!!

오늘의 분석함수 : row_number()
partition by 로 설정한 부분별 sequence를 구할 수 있다. (partition by 생략 가능)

* SQL 예
  select deptcd, deptlvl, pdeptcd,
            row_number() over(partition by deptlvl,pdeptcd order by deptlvl,pdeptcd) seq
   from orgdept

* 닮은꼴 함수 : rank(), dense_rank()

* 순위 처리 분석 함수별 차이점
- row_number() : data와 상관 없이 row 순서대로 numbering (ex) 1,2,3,4...
- rank() : 같은 data는 같은 순위. 이후 순위는 동일 순위 갯수만큼 skip (ex) 1,2,2,4...
- dense_rank() : 같은 data는 같은 순위. 이후 순위는 연속값 사용 (ex) 1,2,2,3...

Posted by 흑마뇨
,
     
     
     
     
     
     
     
     
     

출처 : http://blog.empas.com/crystal0021/20260215

평생 가도 정리는 안할 것 같고..
너무 길어서 걍 접어만 놨다.
Posted by 흑마뇨
,