달력

5

« 2024/5 »

  • 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
  • 30
  • 31
2011. 1. 6. 17:35

Redo Log Work/ORACLE2011. 1. 6. 17:35

[Redo log 란?]
Oracle 에서 일어나는 Transaction에 대한 변경내역들을 기록하는 file.
Redo log는 redo entry로 구성되어 져있으며, Oracle process [LGWR] 에 의해 log buffer에 쓰여진 내용이 Redo logfile에 쓰여진다. Transaction 발생 -> redo entry가 log buffer에 기록 -> redo entry는 다시 LGWR에 의해 Redo log file에 쓰여진다.

[Redo log 상태]
INACTIVE:현재 사용중이지도 않고 복구에 필요치 않응 Redo log
ACTIVE:INSTANCE Recovery 에 필요한 Redo log
CURRENT:LGWR이 현재 기록중이 Redo log

[REDO의 구성]
물리적으로 다른Disk에 LOG1 을 2중화 하여 관리함으로써 가용성을 높인다.
이렇게 관리 하기위해서는 2개의 REDO Member를 하나의 Group으로 묶어야 한다.

[관리]
Redo log Group 추가
ALTER DATABASE ADD LOGFILE GROUP 1 ('<Full path file name>', '<Full path file name>',) size 100M;
Redo log Group 삭제
ALTER DABASE DROP LOGFILE GROUP 1;
삭제시 주의 사항
현재 Redo logGroup의 상태가 CURRENT,ACITIVE 이면 Redo log를 절대 삭제할수 없다.
삭제 전에 먼저 LOGFILE SWITCH 를 발생시켜서 INACTIVE 상태로 만들어야 한다.
단, LOGFILE SWITCH 를 한다고 꼭 INACTIVE 상태가 되는것은 아니다. 
하지만 여러번 하다보면 결국 INACTIVE 상태로 변하게 된다.
Redo log Member 추가
ALTER DATABASE ADD LOGFILE MEMBER '<Full path file name>' TO GROUP 1;
Redo log Member 삭제
ALTER DATABASE DROP LOGFILE MEMBER '<Full path file name>';
Redo log 강제 SWITCH
ALTER SYSTEM SWITCH LOGFILE;
Redo log 상태 확인
SELECT * FROM V$LOG;
SELECT * FROM V$LOGFILE;
:
Posted by Elick
2010. 9. 8. 22:04

Oracle 병렬처리 Work/ORACLE2010. 9. 8. 22:04

/*
병렬 처리란 SQL문이 수행해야 할 작업 범위를 여러개의 작은 단위로 나누어 여러 프로세스(또는 스레드)가 동시에 처리하는 것을 말한다.
*/
explain plan set statement_id = 'SQL1' for SELECT /*+ PARALLEL(TLOG07TT 4)*/ COUNT(*) FROM TLOG07TT;
explain plan set statement_id = 'SQL1' for SELECT COUNT(*) FROM TLOG07TT;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'BASIC'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'TYPICAL'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'SERIAL'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'ALL'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'OUTLINE')); -- 10g
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'ADVANCED')); -- 10g

-- @?/rdbms/admin/utlxpls

-- Partition Table의 경우.
SELECT COUNT(*) FROM TLOG07TT;
SELECT /*+ PARALLEL(TLOG07TT 4)*/ COUNT(*) FROM TLOG07TT;
SELECT /*+ PARALLEL_INDEX(TLOG07TT TLOG07S1 5)*/ COUNT(*) FROM TLOG07TT WHERE EXITDT > (SYSDATE - 2);
SELECT /*+ PARALLEL_INDEX(TLOG07TT TLOG07S1 5) INDEX_FFS(TLOG07TT TLOG07S1)*/ COUNT(*) FROM TLOG07TT  WHERE EXITDT > (SYSDATE - 2);

-- Heap Table의 경우.
SELECT * FROM TAB1;
SELECT /*+ PARALLEL(TAB1 4)*/ * FROM TAB1;
SELECT /*+ PARALLEL_INDEX(TAB1 TAB1_S3) */ COUNT(*) FROM TAB1 WHERE JUMIN > '9001011'; -- partition table 아니기 때문에 안됨.
SELECT /*+ PARALLEL_INDEX(TAB1 TAB1_S3) INDEX_FFS(TAB1 TAB1_S3) */ COUNT(*) FROM TAB1; -- partition table 아니어도 되는 경우 : INDEX FAST FULL SCAN 을 해야 한다.

/*
Oracle 9i에서 사용가능한 병렬처리 관련 힌트를 찾아보았지만, DESC 관련 힌트는 찾지 못했음.
*/

:
Posted by Elick

얼마전 요청받았던 쿼리... 여기 저기 찾아보고 만들었는데... 잘된다.
단, Oracle 9i 이상에서만 되는듯... 8i 는 다른 방법을 써야 하나보다..

컬럼의 속성과 해당 컬럼을 사용하는 테이블 이름은 가로로 표현하고 싶다는 내용. 성능은 고려하지 않음.
pivot 사용은 어떨까 고민해 봤지만... 행의 수가 결정되어 있어야 하고 그렇게 작성이 가능하다 해도 쿼리문이 너무 길어질 듯 해서..
connect by 사용하기로 결정.


SELECT CNAME, COLTYPE, WIDTH, MAX(SYS_CONNECT_BY_PATH (TNAME, '|')) AS TABLE_NAME
FROM (
    SELECT CNAME, COLTYPE, WIDTH, TNAME
        ,(ROW_NUMBER () OVER (PARTITION BY CNAME, COLTYPE, WIDTH  ORDER BY TNAME  )) RNUM
    FROM COL
) START WITH RNUM = 1 CONNECT BY PRIOR RNUM = (RNUM - 1)
AND PRIOR CNAME = CNAME AND PRIOR COLTYPE = COLTYPE AND PRIOR WIDTH = WIDTH
GROUP BY CNAME, COLTYPE, WIDTH;


SYS_CONNECT_BY_PATH 에서 처리 가능한 문자열 길이가 정해져 있나 부다...
너무 길면 에러 발생. ㅠㅠ
:
Posted by Elick
2010. 7. 29. 14:41

Oracle dummy 데이터 만들기. Work/ORACLE2010. 7. 29. 14:41

-- 오늘부터 90일 전
SELECT TO_CHAR(DT, 'YYYY-MM-DD') DT
FROM(
 SELECT TRUNC(SYSDATE) - (LEVEL-1) DT
    FROM DUAL
    CONNECT BY LEVEL <= 90
);


-- 오늘부터 90일 후
SELECT TO_CHAR(DT, 'YYYY-MM-DD') DT
FROM (
    SELECT TRUNC(SYSDATE) + (LEVEL-1) DT
    FROM DUAL
    CONNECT BY LEVEL-1 < 90
);

-- 1부터 10까지 만들기
SELECT LEVEL as RNUM
FROM DUAL
CONNECT BY LEVEL <= 10;

:
Posted by Elick
2010. 7. 2. 19:27

Oracle 시간 연산 Work/ORACLE2010. 7. 2. 19:27

1. 그냥 + - 연산 이용. (1일 = 1 을 이용해서 적당히 연산)

2. NUMTODSINTERVAL, NUMTOYMINTERVAL, TO_YMINTERVAL, TO_DSINTERVAL 등의 함수 사용

3. 기간 데이터형 이용 (
Oracle 9i 이상에서 사용가능)

INTERVAL 'n' YEAR
INTERVAL 'n' MONTH
INTERVAL 'n' DAY
INTERVAL 'n' MINUTE
INTERVAL 'n' SECOND
INTERVAL 'y-m' YEAR TO MONTH
INTERVAL 'd hh24:mi:ss.ff' DAY TO SECOND


ex) 1시간 15분 10초전 시간 찾기
SELECT ( SYSDATE - INTERVAL '0 01:15:10' DAY TO SECOND )TARGET_DATE FROM DUAL;
:
Posted by Elick
2010. 3. 31. 15:10

Oracle 테이블, 컬럼 이름 수정 Work/ORACLE2010. 3. 31. 15:10


Oralcle은 테이블이나 컬럼의 이름 수정이 비교적 간단하다.

테이블 이름 수정
  : RENAME [Old table name] TO [New Table name]

컬럼 이름 수정
  : ALTER TABLE [Table_name] RENAME COLUMN [Old_column_name] TO [New_column_name]
:
Posted by Elick
2010. 2. 19. 18:26

sqlplus 사용시 알면 좋은 것 Work/ORACLE2010. 2. 19. 18:26

sqlplus를 사용해야만 하는 상황이 존재한다.
이때 알면 좋은 옵션을 기록한다.

set timing on
  -- 쿼리실행 후 실행시간 출력
set linesize 130
  -- sqlplus line 크기를 130 으로 설정한다.
    기본으로 사용하면 줄바뀜 현상으로 보기 어려운 형태로 출력되는 수가 많다.
col plan_plus_exp format a120
  -- 쿼리 plan 출력시 plan을 표현하는 컬럼 이름을 120 길이로 맞춘다.
     출력시 표현되는 이름으로 컬럼 길이를 조정하면 조정이 안된고 plan_plus_exp 라는 컬럼을 조정해야 원하는 길이로 표현 된다.

set autotrace on
-- SQL을 실제 수행하고 그 결과와 함께 실행계획 및 실행통계를 출력.

set autotrace on explain
-- SQL을 실제 수행하고 그 결과와 함께 실행계획을 출력.

set autotrace on statistics
-- SQL을 실제 수행하고 그 결과와 함께 실행통계를 출력.

set autotrace traceonly
-- SQL을 실제 수행하지만, 그 결과를 출력하지 않고, 실행계획과 통계만 출력.

set autotrace traceonly explain
-- SQL을 실제 수행하지않고, 실행계획만 출력


set autotrace traceonly statistics
-- SQL을 실제 수행하지만, 그 결과를 출력하지 않고, 실행통계만 출력.
:
Posted by Elick
2009. 4. 20. 10:59

Oracle의 Package에서 RecordSet 받기 Work/ORACLE2009. 4. 20. 10:59

Oracle은 Stored Procedure 에서 SELECT로 Record Set을 받아서 사용하려면 아래처럼 Package를 사용해야 한다.


CREATE OR REPLACE PACKAGE PKG_RECORDSET IS
 TYPE RECORDSET IS REF CURSOR;

 PROCEDURE up_Pkg_RecordSet
    (
        nParam NUMBER
    );

END PKG_RECORDSET;
/

CREATE OR REPLACE PACKAGE BODY PKG_RECORDSET IS
 PROCEDURE up_Pkg_RecordSet
    (
        nParam NUMBER
    )
 IS
 BEGIN
         OPEN pRECORDSET FOR
  SELECT Columns1, Columns2
  FROM Tables1
  WHERE Columns3 = nParam;
 END;
END PKG_RECORDSET;
/

:
Posted by Elick