2015.05.26 17:30

[Oracle] Procedure 예외처리 (SQLCODE, SQLERM)

http://pino93.tistory.com/373

 

 

 

SQLCODE, SQLERRM

-       WHEN OTHERS문으로 트랩(Trap) 되는 오류들의 실제 오류 코드와 설명을 볼 때 사용한다

-       SQLCODE : 실행된 프로그램이 성공적으로 종료하였을 때는 오류번호 0을 포함하며, 그렇지 못할 경우에는 해당 오류코드 번호를 포함한다.

-       SQLERRM : SQLCODE에 포함된 오라클 오류 번호에 해당하는 메시지를 가진다

 

SQLCODE Value

Description

0

오류 없이 성공적으로 종료

1

사용자 정의 예외 번호

+100

DATA NOT FOUND 예외 번호

음수

위의 부분을 제외한 오라클 서버 에러 번호

 


  ================================================
    * Oracle Community OracleClub.com
    * http://www.oracleclub.com
    * http://www.oramaster.net
    * 운영자 : 김정식 (oramaster _at_ empal.com)
  ================================================ 

 

 

 

 

Trackback 0 Comment 0
2015.01.12 21:55

[Oracle] MERGE INTO

MERGE INTO 구문

 

 - MERGE문은 조건에 따라서 데이터의 삽입,갱신,삭제 작업을 한번에 할 수 있다.
 - 해당 행이 존재하는 경우 UPDATE(DELETE포함 할 수 있음)를 수행하고, 새로운 행일경우 INSERT를 수행한다.
 - 대상 테이블에 대한 UPDATE/INSERT 조건은 ON절에 의해 결정된다.
 - MERGE문에서 CLOB 사용시 업데이트 할 내용이 2000bytes가 넘을때 ORA-00600 오류가 발생하며, patch set 11.2.0.2 버전으로 해결할 수 있다.

 

 

◆ 문법

 

MERGE INTO 테이블 a               -- update또는 insert할 테이블

       USING 대상테이블/뷰 b      -- 비교대상 (동일 테이블이라면 using dual 사용)

           ON (조건)                   -- a와 b의 조인식

        WHEN MATCHED THEN

                  UPDATE SET

                              컬럼1 = 값1

                              컬럼2 = 값2

                  DELETE WHERE (조건)

        WHEN NOT MATCHED THEN

                  INSERT(컬럼1, 컬럼2...)

                  VALUES(값1, 값2...)

 

 - INTO : DATA가 UPDATE되거나 INSERT 될 테이블 또는 뷰를 지정.
 - USING : 비교할 SOURCE 테이블 또는 뷰나 서브쿼리를 지정, INTO절의 테이블과 동일하거나 다를 수 있다.
 - ON : UPDATE나 INSERT를 하게 될 조건으로, 해당 조건을 만족하는 DATA가 있으면 WHEN MATCHED 절을 실행하게 되고, 없으면 WHEN NOT MATCHED 이하를 실행하게 된다.
 - WHEN MATCHED : ON 조건절이 TRUE인 ROW에 수행 할 내용 (UPDATE, DELETE포함 될 수 있음)
 - WHEN NOT MATCHED : ON 조건절에 맞는 ROW가 없을 때 수행할 내용 (INSERT)

 

※ 오라클 9버전이상에서 사용가능하다.

 

 

◆ SAMPLE

 

MERGE INTO STO_TEMP1 T1
     USING (SELECT EBELN, EBELP
              FROM STO_TEMP
             WHERE EBELN = '4501134859' AND EBELP = '00010') T
        ON (T1.EBELN = T.EBELN AND T1.EBELP = T.EBELP)
WHEN MATCHED
THEN
   UPDATE SET T1.MBLNR = T.MBLNR, T1.BUDAT = T.BUDAT
   DELETE
           WHERE T1.MBLNR = '4926768928'
WHEN NOT MATCHED
THEN
   INSERT     (T1.EBELN,
               T1.EBELP,
               T1.MBLNR,
               T1.BUDAT)
       VALUES (T.EBELN,
               T.EBELP,
               T.MBLNR,
               T.BUDAT)

 

 

Trackback 0 Comment 0
2014.09.18 15:50

[Oracle] 16진수 <-> 10진수 변환

1. 16진수 -> 10진수

 

SELECT  TO_CHAR(15,'0X'), TO_CHAR(16,'0X'), TO_CHAR(17,'0X') 
  FROM  DUAL;

 >> OF   10   11

 

SELECT  TO_CHAR(15,'000X'), TO_CHAR(16,'000X'), TO_CHAR(17,'000X') 
  FROM  DUAL;

 >> 000F   0010   0011

 

 

2. 10진수 -> 16진수

 

SELECT  TO_NUMBER('F', 'XX')TO_NUMBER('10', 'XX'), TO_NUMBER('11', 'XX') 
  FROM  DUAL;

 >> 15   16   17

 

 

Trackback 0 Comment 0
2014.09.02 09:11

[Oracle] IO를 많이 발생시키는 쿼리 찾기

SELECT  S.FIRST_LOAD_TIME, TO_CHAR(S.BUFFER_GETS,'999,999,999,990') BUFFER_GETS,

              S.DISK_READS, S.ROWS_PROCESSED, S.EXECUTIONS,
              SUBSTR(U.NAME,1,1) USERNAME, S.MODULE, S.SQL_TEXT
   FROM  V$SQLAREA S, SYS.USER$ U
 WHERE  S.PARSING_USER_ID = U.USER#
     AND  U.NAME <> 'SYS'
     AND  S.DISK_READS > 10000
     AND  S.FIRST_LOAD_TIME >= TO_CHAR(SYSDATE,'yyyy-mm-dd')||'/00:00:00'
 ORDER BY  S.FIRST_LOAD_TIME DESC;

 

Trackback 0 Comment 0
2014.04.28 21:20

[Oracle] HINT 정리

◆ 개요
힌트는 SQL 튜닝의 핵심부분으로 일종의 지시구문이다.
SQL에 포함되어 쓰여져 Optimizer의 실행 계획을 원하는 대로 바꿀 수 있게 해준다.
오라클 Optimizer라고 해서 항상 최선의 실행 계획을 수립할 수는 없으므로 테이블이나 인덱스의 잘못된 실행 계획을 개발자가 직접 바꿀 수 있도록 도와주는 것이다.
사용자는 특정 SQL 문장에서 어떤 인덱스가 선택도가 높은지에 대해 알고 있는데 이 경우 오라클 서버의 Optimizer에 의존하여 나온 실행 계획보다 훨씬 효율적인 실행 계획을 사용자가 구사할 수 있다.
 
 
◆ 사용
힌트를 사용하여 아래와 같은 것들을 할 수 있다.
액세스 경로, 조인 순서, 병렬 및 직렬 처리, Optimizer의 목표(Goal)를 변경 가능하다.
 
 
◆ 오라클 힌트 사용예
 SELECT /*+ INDEX(idx_col1) */
             id, password, name
  FROM emp;
 SELECT /*+ ORDERED  INDEX(b idx_col1) */
             id, password, name
  FROM emp a
         , depart b
※ 주의! 주석 표시 뒤에 '+' 기호가 있다.

 

 

◆ INDEX Access Operation 관련 HINT

 HINT

 내용

 사용법

 INDEX

 INDEX를 순차적으로 스캔

 INDEX(TABLE_name, INDEX_name)

 INDEX_ASC

 INDEX를 내림차순으로 스캔. 

 

 INDEX_DESC

 INDEX를 오름차순으로 스캔.

 INDEX_DESC(TABLE_name, INDEX_name)

 INDEX_FFS

 INDEX FAST FULL SCAN

 INDEX_FFS(TABLE_name, INDEX_name)

 PARALLEL_INDEX

 INDEX PARALLEL SCAN

 PARALLEL_INDEX(TABLE_name, INDEX_name)

 NOPARALLEL_INDEX

 INDEX PARALLEL SCAN 제한

 NOPARALLEL_INDEX(TABLE_name, INDEX_name)

 AND_EQUALS

 여러개의 INDEX MARGE 수행

 AND_EQUALS(INDEX_name, INDEX_name)

 FULL

 FULL SCAN

 지정된 테이블에 대한 전체 스캔.

 FULL(TABLE_name)

 

 

◆ JOIN Access Operator 관련 HINT

 HINT

 내용

 사용

 USE_NL

 NESTED LOOP JOIN

 옵티마이저가 NESTED LOOP JOIN을 사용하도록 한다.

 먼저 특정 TABLE의 ROW에 액세스하고 그 값에 해당하는 다른 TABLE의 ROW를 찾는 작업을 해당범위까지 실행하는 조인.

 USE_NL(TABLE1, TABLE2)

 USE_NL_WITH_INDEX

 INDEX를 사용해서 NESTED LOOP JOIN을 사용하도록 한다.

 USE_NL_WITH_INDEX(TABLE  INDEX)

 USE_MERGE

 SORT MERGE JOIN

 옵티마이저가 SORT MERGE JOIN을 사용하도록 한다.

 먼저 각각의 TABLE의 처리 범위를 스캔하여 SORT한 후, 서로 MERGE하면서 JOIN하는 방식.

 USE_MERGE(TABLE1, TABLE2)

 USE_HASH

 HASH JOIN

 옵티마이저가 HASH JOIN을 사용하도록 한다.

 USE_HASH(TABLE1, TABLE2)

 HASH_AJ

 HASH ANTIJOIN

 HASH_AJ(TABLE1, TABLE2)

 HASH_SJ

 HASH SEMIJOIN

 HASH_SJ(TABLE1, TABLE2)

 NL_AJ

 NESTED LOOP ANTIJOIN

 NL_AJ(TABLE1, TABLE2)

 NL_SJ

 NESTED LOOP SEMIJOIN

 NL_SJ(TABLE1, TABLE2)

 MERGE_AJ

 SORT MERGE ANTIJOIN

 MERGE_AJ(TABLE1, TABLE2)

 MERGE_SJ

 SORT MERGE SEMIJOIN

 MERGE_SJ(TABLE1, TABLE2)

 

 

◆ JOIN시 DRIVING 순서 결정 HINT

 HINT

 내용

 사용법

 ORDERED

 FROM절에 명시된 테이블의 순서대로 DRIVING

 

 LEADING 

 파라미터에 명시된 테이블의 순서대로 JOIN

 LEAING(TABLE_name1, TABLE_name2, ...)

 DRIVING

 해당 테이블을 먼저 DRIVING

 DRIVING(TABLE)

 

 

◆ 기타 HINT

 HINT

 내용

 사용법

 APPEND

 INSERT시 DIRECT LOADING

 

 PARALLEL

 SELECT, INSERT시 여러개의 프로세스로 수행

 PARALLEL(TABLE, 개수)

 CACHE

 데이터를 메모리에 CACHING

 

 NOCACHE

 데이터를 메모리에 CACHING하지 않음

 

 PUSH_SUBQ

 SUBQUERY를 먼저 수행

 

 REWRITE

 QUERY REWRITE 수행

 

 NOREWIRTE

 QUERY REWRITE를 수행 못함

 

 USE_CONCAT

 IN절을 CONCATENATION ACCESS OPERATION으로 수행

 

 USE_EXPAND

 IN절을 CONCATENATION ACCESS OPERATION으로 수행못하게 함

 

 MERGE

 VIEW MERGING 수행

 

 NO_MERGE

 VIEW MERGING 수행못하게 함

 

 

※ 추가
ALL_ROWS : 가장 좋은 단위 처리량의 목표로 문 블록을 최적화하기 위해 cost-based 접근 방법을 선택합니다. (즉, 전체적인 최소의 자원 소비, 모든 레코드의 처리하는 시간의 최소화를 목적으로 최적화)

FIRST_ROWS : 가장 좋은 응답 시간의 목표로 문 블록을 최적화하기 위해 cost-based 접근 방법을 선택합니다. (첫번째 레코드의 추출 시간을 최소화할 목적으로 최적화)

CHOOSE : 최적자(optimizer)가 그 문에 의해 접근된 테이블을 위해 통계의 존재에 근거를 두는 SQL문을 위해

 

rule-based 접근 방법과 cost-based 접근 방법 사이에 선택하게 됩니다.

CLUSTER : 지정된 테이블에 대한 클러스터 스캔.

HASH : 지정된 테이블에 대한 해쉬 스캔.

ROWID : 지정된 테이블에 대한 ROWID에 의한 테이블 스캔.

RULE : explicitlly chooses rule-based optimization for a statement block. rule-base Optimizer를 사용.

 

 

◆ 주의
 SELECT /*+ ORDERED USE_NL(A B C) INDEX(B ITOREDRETL1) */
    FROM TORDERDTL  B, TORDER  A, TITEM  C
  WHERE ...
1. ORDERED : FROM 절에 기술한 테이블 순(B → A → C 순)으로 조인함. USE_NL에 사용한 순서가 아님.
    ※ 참고) LEADING, 예) LEADING(B) : FROM 절의 기술 순서와 상관없이 B테이블이 가장 먼저 선행됨.
2. USE_NL : 조인방법을 Nested Loops방식으로 선택.
    예) USE_NL(A B), 테이블명이 아닌 테이블에 대한 Alias명
    참고) USE_HASH, USE_MERGE
3. INDEX : 특정 인덱스를 오름차순으로 읽음.
    예) INDEX(B  ITORDERDTL1) : B는 TORDERDTL 테이블의 Alias명, 사용할 인덱스명 기술
    참고) USE_DESC(B ITORDERDTL1) : ITORDERDTL1 인덱스를 내림차순으로 읽음
 


◆ 실행계획 살펴보기 1
 SELECT *
    FROM ( ==> 인라인뷰 3
                ( ==> 인라인뷰 2
                   ( ==> 인라인뷰 1
                   )
                )
              )
과 같이 되어 있다고 하자.
이럴 경우 실행계획을 보면, 우리가 예상했던대로 인라인뷰1 ==> 인라인뷰2 ==> 인라인뷰3 순서로 드라이빙 되지 않는 경우가 있다.
이런 경우 강제로 위 순서대로 실행계획을 수립하도록 하는 힌트
SELECT /*+ ORDERED */
            *
  FROM ( .....
위 힌트를 사용하면 맨 깊숙한 인라인뷰부터 실행된다.
 
 
◆ 힌트 사용하기
1. /*+ USE_CONCAT */
USE_CONCAT : 조건절에 있는 OR 연산자조건 (또는 IN 연산자 조건)을 별도의 실행단위로 분리하여 각각의 최적의 액세스 경로를 수립하여 이를 연결(Concatenation)하는 실행계획을 수립하도록 유도하는 힌트.
반드시 처리주관 조건이 OR로 나누어졌을 때 적용해야 하며, 잘못 사용하면 비효율이 발생할 수 있으므로 주의해야 함.
예>
SELECT /*+ USE_CONCAT */
   FROM employees
 WHERE job = &job
       OR dept_no = &deptno;
풀어쓰자면
SELECT *
    FROM employees
  WHERE job = &job
UNION ALL
SELECT *
    FROM employees
WHERER dept_no = &deptno;
WHERE 절 이후에 나오는  컬럼에 맞게 인덱스를 탄다.
 
2. /*+ NO_EXPAND */
조건절에 있는 OR 연산자 조건 또는 IN 연산자 조건을 연결 실행계획으로 처리되지 않도록 할 때 사용하는 힌트.
USE_CONCAT의 반대 개념.
예>
SELECT /*+ NO_EXPAND */
   FROM customer
 WHERE cust_type in ('A','B');
참고 : http://blog.naver.com/hkjhc107?Redirect=Log&logNo=130035827974


◆ 참고
1. Nested Loop
   - 테이블의 인덱스끼리 inner-outer 루프를 형성하여 결과를 쿼리하는 방식입니다.
   - 제일 많은 유형의 실행계획입니다.
2. Sort Merge
   - 쿼리의 결과가 많은 양의 데이터를 읽는 경우, 테이블들을 각각 full-scan하여 같은 키값을 갖는 데이터끼리 조인하여 실행합니다.
   - Sort-Merge 방식은 많은 메모리와 디스크 I/O를 필요로 하기 때문에, sqlplus를 실행하는 주체의 메모리/CPU/디스크 스펙에 많은 영향을 받습니다.
3. Hash Join
   - 한 테이블은 매우 많은 Row를 갖고, 다른 한 테이블은 매우 적은 Row를 가질 때, 해쉬 알고리즘에 의해 큰 테이블을 여러개의 버켓으로 나누어 쿼리를 수행하는 방식입니다. 작은 테이블은 인덱스를 태우는 것보다 full-scan을 하는 것이 유리할 때 사용됩니다.

 

 

'DB Tuning' 카테고리의 다른 글

[Oracle] LEADING HINT  (0) 2014.04.28
[Oracle] HINT 정리  (0) 2014.04.28
[Oracle] SUBQUERY -> INLINE VIEW  (0) 2014.04.28
[Oracle] INTERSECT, MINUS -> JOIN, NOT EXISTS  (0) 2014.04.28
Trackback 0 Comment 0
2014.04.28 20:48

[Oracle] INTERSECT, MINUS -> JOIN, NOT EXISTS

1. before SQL & plan


DELETE      TIMAGECOMPLETE
      WHERE (OWNERID, ORDERID) IN (
               (SELECT OWNERID, ORDERID
                  FROM TIMAGECOMPLETE
                INTERSECT
                SELECT OWNERID, ORDERID
                  FROM TTASKTRANSHI)
               MINUS
               SELECT OWNERID, ORDERID
                 FROM TTASKTRANS)
Execution Plan
--------------------------------------------------------------------------------
   0      DELETE STATEMENT Optimizer=CHOOSE (Cost=260K Card=3K Bytes=108K)
   1    0   DELETE OF 'TIMAGECOMPLETE'
   2    1     NESTED LOOPS (Cost=260K Card=3K Bytes=108K)
   3    2       VIEW OF 'SYS.VW_NSO_1' (Cost=260K Card=3K Bytes=62K)
   4    3         MINUS
   5    4           INTERSECTION
   6    5             SORT (UNIQUE) (Card=3K Bytes=46K)
   7    6               INDEX (FAST FULL SCAN) OF 'TIMAGECOMPLETE_PK' (UNIQUE) (Cost=3 Card=3K Bytes=46K)
   8    5             SORT (UNIQUE) (Card=32M Bytes=549M)
   9    8               TABLE ACCESS (FULL) OF 'TTASKTRANSHI' (Cost=133K Card=32M Bytes=549M)
  10    4           SORT (UNIQUE) (Card=378K Bytes=6M)
  11   10             TABLE ACCESS (FULL) OF 'TTASKTRANS' (Cost=2K Card=378K Bytes=6M)
  12    2       INDEX (UNIQUE SCAN) OF 'TIMAGECOMPLETE_PK' (UNIQUE) (Card=1 Bytes=18)
 


1.1 문제점 및 해결책


  - INTERSECT 와 MINUS 인해 TTASKTRANSHI, TTASKTRANS 테이블에 대해  full table scan이 발생하여 성능저하 현상이 발생과 동시에 Lock holding이 발생함.
  - INTERSECT와 MINUS를 join 및 not exists로 변경하여 성능개선 가능.
  - 업무담당자와 협의 및 데이터 검증 필요.
  
 
2. After SQL & plan


DELETE      TIMAGECOMPLETE
      WHERE (OWNERID, ORDERID) IN (
               SELECT A.OWNERID, A.ORDERID
                 FROM TIMAGECOMPLETE A, TTASKTRANSHI B
                WHERE 1 = 1
                  AND A.OWNERID = B.OWNERID
                  AND A.ORDERID = B.ORDERID
                  AND NOT EXISTS (
                         SELECT 1
                           FROM TTASKTRANS C
                          WHERE 1 = 1
                            AND A.OWNERID = C.OWNERID
                            AND A.ORDERID = C.ORDERID))
                       
Execution Plan
--------------------------------------------------------------------------------
   0      DELETE STATEMENT Optimizer=CHOOSE (Cost=8K Card=1 Bytes=42)
   1    0   DELETE OF 'TIMAGECOMPLETE'
   2    1     MERGE JOIN (SEMI) (Cost=8K Card=1 Bytes=42)
   3    2       INDEX (FULL SCAN) OF 'TIMAGECOMPLETE_PK' (UNIQUE) (Cost=12 Card=3K Bytes=46K)
   4    2       SORT (UNIQUE) (Cost=8K Card=2M Bytes=37M)
   5    4         VIEW OF 'SYS.VW_NSO_1' (Cost=5M Card=2M Bytes=37M)
   6    5           FILTER
   7    6             NESTED LOOPS (Cost=136 Card=2M Bytes=55M)
   8    7               INDEX (FAST FULL SCAN) OF 'TIMAGECOMPLETE_PK' (UNIQUE) (Cost=3 Card=132 Bytes=2K)
   9    7               INDEX (RANGE SCAN) OF 'TTASKTRANSHI_IDX02' (NON-UNIQUE) (Cost=3 Card=12K Bytes=214K)
  10    6             INDEX (RANGE SCAN) OF 'TTASKTRANS_IDX02' (NON-UNIQUE) (Cost=3 Card=1 Bytes=18)

 

 

'DB Tuning' 카테고리의 다른 글

[Oracle] LEADING HINT  (0) 2014.04.28
[Oracle] HINT 정리  (0) 2014.04.28
[Oracle] SUBQUERY -> INLINE VIEW  (0) 2014.04.28
[Oracle] INTERSECT, MINUS -> JOIN, NOT EXISTS  (0) 2014.04.28
Trackback 0 Comment 0
2014.03.06 10:00

[Oracle] 각 테이블/인덱스 사이즈 조회 쿼리

## 테이블 사이즈 조회 쿼리

 

SELECT A.SEGMENT_NAME,
             ROUND(SUM(A.BYTES)/1024/1024) "SIZE_MB",

             ROUND(SUM(A.BYTES)/1024/1024/1024) "SIZE_GB",
             A.SEGMENT_TYPE
  FROM DBA_SEGMENTS A,
            DBA_TABLES B
WHERE A.SEGMENT_NAME = B.TABLE_NAME
     AND A.SEGMENT_TYPE IN ('TABLE','TABLE PARTITION')
     AND A.OWNER = '유저아이디'
 GROUP BY A.SEGMENT_NAME, A.SEGMENT_TYPE
 ORDER BY 2 DESC;

 

 

## 인덱스 사이즈 조회 쿼리

 

SELECT A.SEGMENT_NAME,
             ROUND(SUM(A.BYTES)/1024/1024) "SIZE_MB",

             ROUND(SUM(A.BYTES)/1024/1024/1024) "SIZE_GB",
             A.SEGMENT_TYPE
  FROM DBA_SEGMENTS A,
            DBA_INDEXES B
WHERE A.SEGMENT_NAME = B.INDEX_NAME
     AND A.SEGMENT_TYPE IN ('INDEX','INDEX PARTITION')
     AND A.OWNER = '유저아이디'
 GROUP BY A.SEGMENT_NAME, A.SEGMENT_TYPE
 ORDER BY 2 DESC;

 

 

*** TABLE PARTITION

 세그먼트가 분할된 테이블을 말한다.

 분할에 사용되는 정보입력은 Value 이며 이는 Hash / Range / List 등으로 나뉘어진다.

 

 

Trackback 0 Comment 0
2014.03.04 18:56

[Oracle] 테이블 스페이스 용량/사용량 산출

// TABLESPACE_NAME 별로 합처리

 

SELECT  SUBSTR(A.TABLESPACE_NAME,1,30) TABLESPACE,
              ROUND(SUM(A.TOTAL1)/1024/1024,1) "TOTALMB",
              ROUND(SUM(A.TOTAL1)/1024/1024,1)-ROUND(SUM(A.SUM1)/1024/1024,1) "USEDMB",
              ROUND(SUM(A.SUM1)/1024/1024,1) "FREEMB",
              ROUND((ROUND(SUM(A.TOTAL1)/1024/1024,1)-ROUND(SUM(A.SUM1)/1024/1024,1))

              /ROUND(SUM(A.TOTAL1)/1024/1024,1)*100,2) "USED%"
  FROM
             (SELECT  TABLESPACE_NAME,0 TOTAL1,SUM(BYTES) SUM1,MAX(BYTES) MAXB,

                            COUNT(BYTES) CNT
                 FROM  DBA_FREE_SPACE
               GROUP  BY TABLESPACE_NAME
              UNION
              SELECT  TABLESPACE_NAME,SUM(BYTES) TOTAL1,0,0,0
                 FROM  DBA_DATA_FILES
               GROUP  BY TABLESPACE_NAME) A
GROUP BY A.TABLESPACE_NAME
ORDER BY TABLESPACE;

 

 

// 전체 합처리

 

SELECT  ROUND(SUM(A.TOTAL1)/1024/1024/1024,1) "TOTALGB",
              ROUND(SUM(A.TOTAL1)/1024/1024/1024,1)-ROUND(SUM(A.SUM1)/1024/1024/1024,1) "USEDGB",
              ROUND(SUM(A.SUM1)/1024/1024/1024,1) "FREEGB",
              ROUND((ROUND(SUM(A.TOTAL1)/1024/1024,1)-ROUND(SUM(A.SUM1)/1024/1024,1))

              /ROUND(SUM(A.TOTAL1)/1024/1024,1)*100,2) "USED%"
  FROM
             (SELECT  TABLESPACE_NAME,0 TOTAL1,SUM(BYTES) SUM1,MAX(BYTES) MAXB,

                            COUNT(BYTES) CNT
                 FROM  DBA_FREE_SPACE
               GROUP BY TABLESPACE_NAME
              UNION
              SELECT  TABLESPACE_NAME,SUM(BYTES) TOTAL1,0,0,0
                 FROM  DBA_DATA_FILES
               GROUP BY TABLESPACE_NAME) A

 

 

Trackback 0 Comment 0
2013.09.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+"%')

 

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


 

Trackback 0 Comment 0
2013.07.31 10:23

[Oracle] session 수 체크 및 session 죽이기

-- oracle session 수 체크

 

select count(*)
from  v$session a,
      v$process b
where a.paddr=b.addr;

 

select count(*)
from  v$session a,
      v$process b
where a.paddr=b.addr
  and a.schemaname = 'SEC';
  
 

 

-- USER ACCOUNT LOCK 해제

 

alter user nosun account unlock;

 

 

 

-- 락 죽이기

 

select a.sid, a.serial#
  from v$session a, v$lock b, dba_objects c
 where a.sid = b.sid
  and b.id1 = c.object_id
  and b.type = 'TM'
  and c.object_name = 'INVLOG';

  
alter system kill session '1050, 4549';

 

 

 

-- LOAD 걸린 SQL 보기

1. oracle/chun1001 접속
2. sqlplus "/as sysdba"
3. @?/rdbms/admin/awrrpt
3. 옵션 일수 선택 - > 스냅샷 시작 id 입력 -> 스냅샷 종료 id 입력
4. html ftp 로 다운로드

 

 

Trackback 0 Comment 0