반응형

오라클 LOCK 걸린 개체 확인 및 LOCK 해제


오라클이나 다른 DBMS 제품을 사용하는 중에 LOCK 이 걸려본 경험은 다들 한두번씩 있을거라고 봅니다.

일반적으로 TOAD 나 ORANGE 같은 상용제품을 사용할 때는 모니터링툴이 있으니 바로 열어서 확인해볼수 있지만

SQL Developer 같은 무료제품을 사용할 때에는 어떻게 해야 하는지 알 수 없습니다.


사실 모니터링툴도 다 DBMS 에서 관리하고 있는 시스템인데 SQL 로 조회해보면 됩니다.

자주 사용하는 sql 정도는 몇개 저장해두고 사용하면 편하게 쓸 수 있습니다.


일단 LOCK 걸린 객체를 확인해보겠습니다.



1. lock 걸린 개체 확인


SELECT OBJECT_ID
     , SESSION_ID       -- SID
     , ORACLE_USERNAME
     , OS_USER_NAME
  FROM V$LOCKED_OBJECT
;


OBJECT_ID	SESSION_ID	ORACLE_USERNAME		OS_USER_NAME
-----------------------------------------------------------------
163990		401		SCOTT			js
163966		401		SCOTT			js




이걸로는 자세한 내용을 아직 알기 어렵습니다.


그러면 다음으로 해당 sid 와 serial 번호로 락걸린 object name 을 확인해보겠습니다.


2. 해당 sid 와 serial 번호로 락걸린 object name 을 확인


SELECT A.SID
     , A.SERIAL#
     , object_name
     , A.SID || ', ' || A.SERIAL# AS KILL_TASK
  FROM V$SESSION A
 INNER JOIN V$LOCK B
    ON A.SID = B.SID
 INNER JOIN DBA_OBJECTS C
    ON B.ID1 = C.OBJECT_ID
 WHERE B.TYPE  = 'TM'
 ;
   

SID	SERIAL#	OBJECT_NAME	KILL_TASK
------------------------------------------------------------
401	12761	EMP		401, 12761
401	12761	EMP		401, 12761



자 이제 뭔가 OBJECT_NAME 이 보이면서 이 TABLE이 LOCK 이 걸렸구나 라는것을 확인할 수 있습니다.



그럼 LOCK 이 걸린것은 확인했고 LOCK 을 해제하려면 어떻게 해야 할까요?

정답은 마지막에 SID 와 SERIAL# 로 조회된 NUMBER 로 해당되는 SESSION 을 KILL 시키면 됩니다.


          

3. sid 와 시리얼 번호로 세션 해제


 ALTER SYSTEM KILL SESSION '401, 12761'
 ;


뒤에 입력된 숫자인 401, 12761 는 위에서 말씀드린 SID와 SERIAL# 에 대한 값입니다.

편하게 KILL_TASK 라는 값을 복사해서 사용할 수 있게 미리 만들어주었습니다.



 ( ALTER 명령은 별도의 COMMIT 이 필요없는거 다들 아시리라 생각합니다. )

 


이 단계까지 왔으면 LOCK 걸린 테이블의 SESSION 은 해제되었을 것이라고 봅니다.


그런데 위에서 조회된 세션이 단순히 LOCK 걸린것이 아니라 아직 작업중인 SQL 일수도 있다는 생각이 들수도 있습니다.


그럴때는 LOCK 을 발생시킨 SQL 이 뭔지 확인해볼수 있습니다.

 

  

  

4. 락 발생 사용자 및 OBJECT 조회 + 어떤 sql 를 실행중하여 lock 을 걸고 있는지 확인


SELECT DISTINCT T1.SESSION_ID , T2.SERIAL# , T4.OBJECT_NAME , T2.MACHINE , T2.TERMINAL , T2.PROGRAM , T3.ADDRESS , T3.PIECE , T3.SQL_TEXT FROM V$LOCKED_OBJECT T1 , V$SESSION T2 , V$SQLTEXT T3 , DBA_OBJECTS T4 WHERE 1=1 AND T1.SESSION_ID = T2.SID AND T1.OBJECT_ID = T4.OBJECT_ID AND T2.SQL_ADDRESS = T3.ADDRESS ORDER BY T3.ADDRESS, T3.PIECE ; SESSION_ID SERIAL# OBJECT_NAME MACHINE      TERMINAL PROGRAM      ADDRESS PIECE SQL_TEXT -------------------------------------------------------------------------------------------------------------------------------------------- 401      12761 EMP      machine_com1 unknown JDBC Thin Client 230134658 0     INSERT /*+ APPEND */ INTO EMP 401      12761 EMP      machine_com1 unknown JDBC Thin Client 230134658 1     , EMPNO 401      12761 EMP      machine_com1 unknown JDBC Thin Client 230134658 2     , EMPNM 401      12761 EMP      machine_com1 unknown JDBC Thin Client 230134658 3     , DEPTNO



위와 같이 조회되면 맨 우측에 SQL_TEXT 를 조회해보면 어떤 SQL 이 실행되었는지 알 수 있습니다.



이상으로 오라클 TABLE LOCK 조회 및 해제방법에 대해 알아보았습니다.


반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에서 테이블 복원


실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.



1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원





4. Recycle Bin 에서 테이블 복원


FLASHBACK TABLE ~ TO BEFORE DROP 


위의 문법을 사용하여 Recycle Bin 에서 객체를 복구할 수 있습니다.


Recycle Bin에 있는 테이블이 이름이나 원래 테이블 이름을 지정할 수 있습니다.

선택적으로 RENAME TO 절을 사용하면 복구할 때 테이블의 이름을 변경하여 복구할 수 있습니다.

Recycle Bin 의 이름은 Recycle Bin 에 있는 View 및 Query 에 표시된대로 DBA_RECYCLEBIN 또는 USER_RECYCLEBIN View 에서 가져올 수 있습니다.

FLASHBACK TABLE ... TO BEFORE DROP 문을 사용하려면 테이블을 삭제하는것과 동일한 권한이 필요합니다.



아래의 예제는 TB_USER_INFO 테이블을 지우고 새로운 이름으로 복원하는 방법에 대한 예시입니다.


FLASHBACK TABLE TB_USER_INFO TO BEFORE DROP
   RENAME TO TB_USER_INFO2 ;


시스템에서 생성한 Recycle Bin 의 이름은 테이블을 여러번 삭제한 경우 매우 유용합니다.

예를 들어 Recycle Bin 에 TB_USER_INFO 테이블의 버전이 5가지가 있으며 4번째 버전을 복구하려고 한다고 가정합니다.

두개의 FLASHBACK TABLE 문을 실행하여 이 작업을 수행하거나 아래의 예제와 같이 휴지통을 Query 한 다음 

시스템에서 만든 이름으로 FLASHBACK 할 수 있습니다.

쿼리에 테이블 생성시간을 포함시키면 OBJECT NAME 을 확인 후 정확한 테이블을 복원할 수 있습니다.



SELECT OBJECT_NAME, ORIGINAL_NAME, CREATETIME FROM RECYCLEBIN ;


BIN$UofUBMjLnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:44:26
BIN$UofUBMjMnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:45:26
BIN$UofUBMjNnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:45:52
BIN$UofUBMjOnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:46:08
BIN$UofUBMjPnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:46:17


FLASHBACK TABLE "BIN$UofUBMjOnkDgUOABLqNFXg==$0" TO BEFORE DROP;



Recycle Bin 에서 테이블을 복원할 때 인덱스와 같은 종속된 객체는 원래 이름으로 다시 가져오지 않습니다.

종속된 객체는 시스템에서 생성한 Recycle Bin 의 OBJECT_NAME 을 그대로 유지합니다.

원본 이름으로 복원하려면 종속된 객체의 이름을 수동으로 변경해야 합니다.

종속 객체의 원래 이름을 수동으로 복원하려면 테이블을 복원하기전에 각 종속 객체의 시스템에서 생성한 Recycle Bin 에서 ORIGINAL_NAME을 기록해두어야 합니다.



아래 예시는 TB_USER_INFO 에서 생성한 일부 인덱스의 이름을 원래 이름으로 복원하는 예입니다.

이 예에서는 SCOTT 사용자로 로그인 했다고 가정합니다.


1. 테이블 생성 후 테이블 삭제


CREATE TABLE TB_USER_INFO ( USER_NO VARCHAR2(10 BYTE)
                          , USER_NM VARCHAR2(50 BYTE)
                          , AGE NUMBER
                          , CONSTRAINT "PK_TB_USER_INFO" PRIMARY KEY ( USER_NO )
)
;

DROP TABLE TB_USER_INFO ; 



2. Recycle Bin 에서 복원하기 전에 아래의 쿼리를 실행합니다.


SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE, CREATETIME FROM RECYCLEBIN
ORDER BY CREATETIME;

BIN$UofUBMjZnkDgUOABLqNFXg==$0   TB_USER_INFO      TABLE   2017-06-22:16:04:19
BIN$UofUBMjYnkDgUOABLqNFXg==$0   PK_TB_USER_INFO   INDEX   2017-06-22:16:04:19


3. 테이블을 복원합니다.


FLASHBACK TABLE TB_USER_INFO TO BEFORE DROP ;



4. 아래의 쿼리를 실행하여 TB_USER_INFO 의 인덱스가 시스템에서 생성한 Recycle Bin 에 이름이 있는지 확인합니다.


SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'TB_USER_INFO';
BIN$UofUBMjYnkDgUOABLqNFXg==$0



5. 아래와 같이 인덱스의 원래 이름을 복원합니다.


ALTER INDEX "BIN$UofUBMjYnkDgUOABLqNFXg==$0" RENAME TO PK_TB_USER_INFO;


시스템에서 생성된 이름은 큰따옴표로 감싸줍니다.



반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에서 객체제거


실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.



1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원






3. Recycle Bin 에서 객체제거


Recycle Bin 에서 객체를 복원하지 않고 Recycle Bin 의 객체를 제거하고 저장공간을 확보하려면 PURGE 문을 사용하면됩니다.

이 때 권한은 항목을 삭제하는 것과 동일한 권한이 필요합니다.



PURGE 문을 사용하여 테이블을 제거하면 Recycle Bin이나 테이블의 원래 이름에서 테이블을 알 수 있는 고유한 이름을 사용할 수 있습니다.

Recycle Bin 의 이름은 Recycle Bin 오브젝트에 있는 View 나 Query 에 표시된대로 DBA_RECYCLEBIN or USER_RECYCLEBIN View 에서 가져올 수 있습니다.


아래의 예시는 TB_USER_INFO 테이블을 Recycle Bin에 놓았을 때 BIN$Ulu8B5c+Oz3gUOABLqObkg==$0 의 이름으로 바뀝니다.


PURGE TABLE "BIN$Ulu8B5c+Oz3gUOABLqObkg==$0" ;


아래의 문장을 통해 동일한 결과를 얻을수 있습니다.

( 테이블이 DROP 되어 RECYCLEBIN 에 존재하는 경우 사용 가능합니다. )


PURGE TABLE TB_USER_INFO ;



테이블스페이스에 존재하는 모든 Recycle Bin 의 내용을 지우고 싶은 경우, 또는 지정한 사용자의 테이블스페이스의 객체에 있는 Recycle Bin의 내용을 제거할 수 있습니다.


PURGE TABLESPACE ts_01 ;
PURGE TABLESPACE ts_01 USER scott ;


사용자는 아래의 문장을 사용하여 자신이 가진 객체의 Recycle Bin 을 제거하고 여유공간을 확보할 수 있습니다.


PUREGE RECYCLEBIN ;


SYSDBA 권한이 있는 경우 PURGE RECYCLEBIN 대신 PURGE DBA_RECYCLEBIN 을 입력하면 전체 Recycle Bin 을 제거할 수 있습니다.


위에서는 테이블을 삭제하였는데 PURGE 문을 사용하면 Recycle Bin 에서 Index 를 제거하거나 지정된 테이블스페이스에 있는 모든 오브젝트를 Recycle Bin에서 제거할 수 있습니다.



반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에 있는 객체 조회 및 쿼리방법



실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.



1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원






2. Recycle Bin 에 있는 객체 조회 및 쿼리방법


오라클 데이터베이스는 Recycle Bin 에 있는 오브젝트에 대한 정보를 얻는 2가지 View 를 제공합니다.


USER_RECYCLEBIN

 - 이 View 는 사용자가 자신의 삭제된 객체를 Recycle Bin에 표시하는데 사용할 수 있습니다.

   synonym 으로 RECYCLEBIN 을 사용할 수 있습니다.



DBA_RECYCLEBIN

 - 이 View 는 관리자에게 제공된 것으로 Recycle Bin 에 있는 모든 삭제된 객체를 볼 수 있습니다.



이러한 View 의 한가지 용도는 데이터베이스가 삭제된 객체에 할당한 이름을 식별한 것입니다.


아래 예시 참조


SELECT object_name
, original_name
FROM dba_recyclebin
WHERE owner = 'SCOTT'
;

         OBJECT_NAME                      ORIGINAL_NAME
------------------------------        -----------------------
BIN$Ulu8B5c+Oz3gUOABLqObkg==$0              EMPLOYEES




SQL Plus Command 인 SHOW RECYCLEBIN 을 사용하여 Recycle Bin 의 내용을 조회할 수 있습니다.



SQL> show recyclebin

ORIGINAL NAME             RECYCLEBIN NAME               OBJECT TYPE         DROP TIME
----------------    ------------------------------   ----------------  -------------------
EMPLOYEES          BIN$Ulu8B5c+Oz3gUOABLqObkg==$0         TABLE        2017-06-20:14:00:19





다른 객체를 쿼리할 수 있는것처럼 Recycle Bin 에 있는 객체를 쿼리할 수 있습니다.

그러나 Recycle Bin 에서 식별된대로 객체의 이름을 지정해야 합니다.



SELECT * FROM "BIN$Ulu8B5c+Oz3gUOABLqObkg==$0";



다음에는 Recycle Bin 에 있는 객체를 제거하는 방법에 대해 알아보겠습니다.

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 이란 무엇인가


실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.


1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원





1. Recycle Bin 이란 무엇인가?


Recycle Bin 은 실제로 삭제된 객체(Table, Index 등)의 정보가 들어있는 데이터 사전 테이블입니다.

삭제된 테이블 및 인덱스, PK 등 관련된 객체는 제거되지 않고 여전히 공간을 차지하고 있습니다.


Recycle Bin 에서 특별히 제거 될 때까지 또는 사용자가 테이블 스페이스 제한으로 인해 데이터베이스에서 제거할 때까지 사용자공간에 계속 쌓여있습니다.


각각의 사용자들은 자신의 Recycle Bin이 있는것으로 보면 됩니다.

사용자가 SYSDBA 권한이 없으면 사용자가 휴지통에 액세스 할 수 있는 객체는 자신이 소유한 객체에만 권한이 있습니다.

자신이 소유한 객체의 Recycle Bin 을 확인하는 방법은 아래 문법을 사용하면 됩니다.



SELECT * FROM RECYCLEBIN;



데이터를 포함하여 테이블스페이스를 삭제할 때, 테이블스페이스의 객체는 Recycle Bin에 저장되지 않으며 

데이터베이스는 테이블스페이스에있는 객체의 Recycle Bin에있는 항목을 제거합니다.


또한 데이터베이스는 데이터를 포함하지 않고 테이블스페이스를 삭제할 때 

테이블스페이스의 오브젝트에 대한 Recycle Bin 항목을 제거하고, 그렇지 않으면 테이블스페이스를 비워둡니다.


  • 사용자를 삭제하면 해당 사용자에 속한 모든 객체가 Recycle Bin 에 저장되지 않고 Recycle Bin의 모든 객체가 제거됩니다.
  • 클러스터를 삭제하면 멤버의 테이블이 Recycle Bin 에 저장되지 않고 Recycle Bin 의 이전 멤버 테이블이 제거됩니다.
  • type 을 삭제하면 하위타입과 같은 종속된 오브젝트가 Recycle Bin 에 배치되지 않고 Recycle Bin 에 있는 이전의 종속된 오브젝트가 제거됩니다.



Recycle Bin 에서의 이름생성 규칙


삭제된 테이블을 Recycle Bin으로 이동하면 테이블과 관련 개체의 이름은 시스템이 생성하게 됩니다.

여러 테이블의 이름이 같을 경우 이름이 충돌되는 내용이 발생할 수 있습니다.

위와 같은 상황은 아래와 같을 때 발생할 수 있습니다.


  • 사용자가 테이블을 삭제하고 같은 이름으로 다시 생성한 후 다시 삭제한 경우
  • 두명의 사용자가 같은 이름의 테이블을 가지고 있을 때 두 사용자가 테이블을 삭제한 경우


Recycle Bin 의 이름변경규칙은 다음과 같습니다.


    BIN$unique_id$version


이름작성규칙

  • unique_id 는 Recycle Bin 의 전역적으로 unique한 26자의 식별자로, 모든 데이터베이스에서 unique 한 Recycle Bin 의 이름으로 만듭니다.
  • version 은 데이터베이스에 의해 할당된 버전의 번호입니다.




Recycle Bin 활성화 및 비활성화



Recycle Bin 초기화 파라메터를 사용하여 Recycle Bin을 활성화 시키거나 비활성화 시키도록 설정할 수 있습니다.


Recycle Bin이 활성화되는 경우

 - 삭제된 테이블과 관계된 객체들은 Recycle Bin에 저장됩니다.


Recycle Bin이 비활성화되는 경우

 - 삭제된 테이블과 관계된 객체들은 Recycle Bin에 저장되지 않습니다.

   단순히 Drop 된 테이블이기 때문에 다른수단을 사용하여 복구해야 합니다.

   ( ex : 기존에 백업해놓은 곳에서 복구 )

   



Recycle Bin 의 Default 값은 활성화로 되어있습니다.


Recycle Bin 비활성화 하는 방법

( 아래문장 중 하나를 실행하시면 됩니다. )

ALTER SESSION SET recyclebin = OFF;
ALTER SYSTEM  SET recyclebin = OFF;


Recycle Bin 활성화 하는 방법

( 아래문장 중 하나를 실행하시면 됩니다. )

ALTER SESSION SET recyclebin = ON;
ALTER SYSTEM  SET recyclebin = ON;


ALTER SYSTEM 또는 ALTER SESSION 으로 Recycle Bin 을 활성화 및 비활성화하면 즉시 적용됩니다.

Recycle Bin 을 비활성화해도 이미 Recycle Bin 에 있는 객체가 제거되거나 영향을 미치지 않습니다.


다른 초기화 파라메터와 마찬가지로 텍스트 초기화 파일인 initSID.ora 에서 recyclebin 의 파라메터 초기값을 설정할 수 있습니다.


recyclebin=on
recyclebin=off



이상으로 Recycle Bin 에 대해 알아보았습니다.

다음에 뒷 부분에 대해서 포스팅하도록 하겠습니다.



반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 SQL 튜닝 by Nested Loops Join



오라클의 조인은 크게 조인방식과 조인형식으로 나누어집니다.



조인 방식

  • 중첩 루프 조인 ( Nested Loops Join )
  • 소트 머지 조인 ( Sort Merge Join )
  • 해쉬 조인 ( Hash Join )



조인 형식


  • 기본 조인
  • 아우터 조인
  • 세미 조인
  • 카테시안 조인
  • 부정 조인



여기서 얘기해 볼 내용은 실행계획을 볼 때 많이 보이는 Nested Loops Join 에 대해서 얘기해보려고 합니다.


일단 실행계획을 알아보기 전에 먼저 알아야 할 부분은 Driving 테이블과 Inner 테이블이 어떤 테이블인지 알아야합니다.


Driving 테이블 : 2개 테이블 중 Join 을 실행 시 먼저 Access 하는 테이블

Inner 테이블    : 2개 테이블 중 Join 을 실행 시 나중에 Access 하는 테이블


2개의 테이블을 예시로 들었지만 3개, 4개, 그 이상의 테이블을 조인시에도 먼저 Access 되는 테이블은 Driving 테이블 나중에 Access 되는 테이블은 Inner 테이블이 됩니다.

( 아무리 테이블이 많이 조인되어도 하나씩 풀어보면 2개의 테이블간 조인이 이루어지기 때문입니다. )




Nested Loops Join 의 수행방식을 알아보겠습니다.



SELECT DEPT_NM
     , EMP_NM
     , SALARY
  FROM EMP T1
 INNER JOIN DEPT T2
 WHERE T1.SALARY >= 100000
   AND T2.LOC = 'SEOUL'



Index 생성 내역

DEPT 테이블 : CREATE INDEX IX_DEPT ON DEPT ( LOC )
EMP 테이블 : CREATE INDEX IX_EMP ON EMP ( DEPT_NO )



1. Driving 테이블의 Index Scan 후 테이블 엑세스

    Driving 테이블이 DEPT 테이블로 선정이 되었다면 인덱스 스캔이 이루어져 LOC 이 SEOUL 인 항목의 값을 INDEX 에서 값을 엑세스합니다.

    그 후 엑세스 된 ROWID 값을 받아서 DEPT 테이블의 ROWID 값으로 DEPT_NO 값을 찾게됩니다.


2. INNER 테이블인 EMP 테이블의 IX_EMP 인덱스 스캔

    1에서 찾은 DEPT_NO 의 값을 찾아서 EMP 테이블의 IX_EMP 인덱스를 엑세스하여 DEPT_NO 의 값을 찾습니다.

    Driving 테이블과 마찬가지로 DEPT_NO 에 해당하는 ROWID 를 찾게됩니다.

 


3. EMP 테이블 스캔

    2에서 찾은 IX_EMP 인덱스의 ROWID 의 값으로 EMP 테이블의 DEPT_NO 를 랜덤엑세스합니다.


4. EMP 테이블의 조건 수행

    3 에서 추출된 데이터를 대상으로 EMP 테이블의 조건절에 해당하는 SALARY >= 100000 인 데이터를 확인하여 추출합니다.


5. 반복 수행

    1~4단계에 해당하는 과정을 반복수행하여 LOC = 'SEOUL' 인 데이터가 없을 때까지 반복 수행합니다.



이런 경우 실행계획은 아래와 같이 이루어집니다.


NESTED LOOPS
    TABLE ACCESS ( BY INDEX ROWID) OF 'DEPT' (TABLE)
          INDEX ( RANGE SCAN ) OF 'IX_DEPT' (INDEX)
    TABLE ACCESS ( BY INDEX ROWID) OF 'EMP' (TABLE)
          INDEX ( RANGE SCAN ) OF 'IX_EMP' (INDEX)


이렇게 실행계획이 나오면 NESTED LOOPS 밑에서 첫번째 나오는 테이블이 DRIVING 테이블, 두번째 나오는 테이블이 INNER 테이블이 됩니다.






반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,

AIX core 갯수확인

IT/Server 2017. 6. 9. 10:00
반응형

AIX core 갯수확인


오라클 병렬 처리 할 때 몇개 프로세스까지 병렬로 실행할 수 있는가에 대해서 궁금했다.

병렬 프로세스의 기준은 해당 서버의 cpu 코어수를 기준으로 작업하면 된다.

현재 내 OS 의 코어갯수가 몇개인지 확인하는 방법은!


AIX 기준 아래명령을 실행하면 알 수 있다.


#lsdev -Cc processor
proc0  Available 00-00 Processor
proc4  Available 00-04 Processor
proc8  Available 00-08 Processor
proc12 Available 00-12 Processor



위와 같이 프로세스가 4개가 존재하는 것을 확인할 수 있다.


오라클 힌트를 줄 때 /*+ parallel (T1 4) */ 이런식으로 sql hint 를 주면 된다.


4 이상 주었을 때 의미는 없을 것으로 보인다.

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

인터넷검색기록삭제 10초만에 해결


오늘은 PC방, 도서관, 카페, 서비스센터 등 공용피씨에서 인터넷을 사용했을 때 

내 로그인 정보나 사용기록이 남아있는경우 '누가 내 정보를 빼가는거 아니야??' 라고 한번쯤 생각해보셨을꺼에요~


그래서 내가 방문한인터넷 페이지의 흔적들을 삭제하는 방법을 알려드릴께요

잘 따라오시면 1분안에 해결할 수 있습니다!


그럼 우리나라에서 많이 사용하는 인터넷 익스프롤러, 크롬, 파이어폭스 기준으로 알아보겠습니다.







인터넷 익스프롤러


1. 메뉴 > 도구 > 인터넷 옵션

  ( 또는 우측상단 톱니바퀴 > 인터넷 옵션 )








2. 일반탭 > 삭제 > 삭제 할 항목 체크 ( 전체 체크 ) > 삭제 !








3. 일반탭 > 설정 > 파일보기 클릭 > 파일 전체 선택 ( 단축키 : Ctrl + A ) 후 쿠키 전체 삭제!!








4. 일반탭 > 종료할 때 검색 기록 삭제 체크!








5. 기록탭 > 페이지 보관일수 : 기본값이 20일로 설정되어 있는데 0 으로 설정!!


  방문한 사이트를 저장하지 않는 설정입니다.








6. 브라우저 캐시 삭제

   키보드의 F12 Push > 네트워크탭 > 브라우저 캐시 지우기

   ( 그냥 브라우저의 Ctrl + R 키 눌러도 삭제 가능하니 편하게 Ctrl + R )






크롬



1. 우측 상단 ... 선택 > 설정








2. 고급 설정 표시 클릭 > 인터넷 사용 기록 삭제 > 항목 전체 체크 > 인터넷 사용 기록 삭제!!







파이어폭스



1. 우측상단 가로줄 3개 선택 > 방문기록 클릭 ( 단축키 Ctrl + H )







2. 최근 방문 기록 삭제 클릭 > 전체 체크 박스 선택 > 지금 삭제 클릭!!







자 1분만에 인터넷 검색기록을 잘 삭제하셨나요!


도움이 되셨다면 다행입니다^^

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 테이블 생성 ( not null enable )




테이블 생성 시 not null enable 이라고 되어 있는것이 있다.

not null 이면 not null 이지 enable 은 뭔가?


아래 예제를 살펴보자



SQL> CREATE TABLE T1 (USER_NO VARCHAR2(14 BYTE) not null enable);

Table created.

SQL> CREATE TABLE T2 (USER_NO VARCHAR2(14 BYTE) not null disable);

Table created.

SQL> select table_name, constraint_name, constraint_type, status
  2  from user_constraints;

TABLE_NAME                     CONSTRAINT_NAME                C STATUS
------------------------------ ------------------------------ - --------
T1                             SYS_C007492                    C ENABLED
T2                             SYS_C007493                    C DISABLED

SQL> insert into T1 (USER_NO) values (null);
insert into T1 (USER_NO) values (null)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."T1"."USER_NO")
        ( NULL 을 삽입할 수 없습니다. )


SQL> insert into T2 (USER_NO) values (null);

1 row created.

SQL> commit;

Commit complete.






NOT NULL ENABLE : NULL 값 입력 불가

NOT NULL DISABLE : NULL 값 입력 가능


결국 NOT NULL 만 써도 ENABLE 은 기본값인 것을 알 수 있다.





반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

테이블 logging 옵션 10초만에 변경!



테이블이 매일 TRUNCATE 후 INSERT 되는데 INSERT 할 때 굳이 Redo LOG 를 쌓아야 하나 의문이 들었다.


Redo 로그를 쌓는다는 것은 I/O 가 발생하게 된다는 건데 DB 는 I/O 가 발생하게 되면 그만큼 속도가 느려지게 된다.


Redo 로그를 그럼 안쌓기 위한 방법은??


바로 테이블에 NOLOGGING 옵션을 부여하면 됩니다.


이미 생성된 테이블은 어떻게 하나?


ALTER TABLE EMP NOLOGGING ;


위와 같은 설정을 하면 Redo LOG 가 남지 않고 INSERT 를 할 수 있게 됩니다.


또 다른 방법으로는 /*+ APPEND */ 힌트를 주어서 INSERT 하면 Redo LOG 를 남기지 않아요! 



INSERT /*+ APPEND */INTO EMP
SELECT * FROM EMP_TEST;


조금이라도 속도를 높여봅시다!

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형