Row Level Locking

Posted 2008. 12. 12. 17:26 by maxmini MAXMINI

1. Row Level Locking 이란?

 row level lock 은 oracle에서 기본적으로 제공하는 기능입니다. 그리고 기본적
으로는 dml 에서 주로 사용합니다. 참고로 ddl lock 같은 경우는 주로 table 단위
로 lock 을 걸지요

A 라는 USER 가 특정 DATA를 UPDATE,DELETE 등을 할 경우 A 가 사용하고 있는 DATA
는 다른 USER 가 UPDATE,DELETE 를 할 수 없습니다.

A USER
   UPDATE XXXXX SET ABC ='ZZZZ' WHERE ABC = 'DEF' 이라고 하고 COMMIT 를 하지
않았다면 A 이외의 USER 는 SELECT 시에는 DEF 의 DATA 가 보이고 UPDATE,DELETE
시에는 LOCK 이 걸려 WAITING 이 걸립니다.

A USER 가 COMMIT 를 했을 경우에는
모든 USER 는 SELECT 시에는 ZZZZ 가 보이며
     UPDATE ,DELETE 시에는 DEF 라는 DATA는 없으므로 UPDATE 할 수 없고
     UPDATE 할 수 있는 DATA는 ZZZZ가 됩니다.
물론 PRIMARY KEY 를 수정했을 경우는 A 이외의 USER 는 DATA가 없기 때문에 수정을
할 수 없습니다.

2. HINT란?

 사용자가 엑세스 경로의 변경을 위해서 SQL 내에 요구사항을 기술하면, 옵티마이
져가 엑세스 경로를 결정할 때 이를 참조하도록 하는 사용자 인터페이스를 말한다.

- HINT 사용방법및 예

 Select ord_dept, ordqty
  From  ordert
 Where ord_dept like '12%'
   And   ord_date between '950101' and '950131' ;
 위의 SQL에서는 where 조건절의 ord_dept 필드와 ord_date 필드 각각 인덱스가
있다고 가정할 때 어떤 인덱스가 사용될 지 확실치가 않다.  만약 ord_date 필드의
인덱스를 사용하는 것이 효율적이라고 판단될 경우, 아래와 같이 Hint를 사용하여
특정 인덱스를 지정할 수 있다.

 Select  /*+ INDEX(a ord_date_index) */  ord_dept, ordqty
  From  ordert  a
 Where ord_dept like '12%'
   And   ord_date between '950101' and '950131' ;
 Syntax는 SQL 내에  /*+  ...  */ (여러 라인 가능) 혹은
                               --+ ...  (한 라인만. 필드명은 다음 라인에
                                         기술하여야 함.)  를  사용함.

- HINT의 종류

ALL_ROWS : 모든 ROW 를 SELECT 하는 방안을 찾는다.(COST BASED 를 사용)
FIRST_ROWS : 첫번째 ROW 를 SELECT 하는 방안을 찾는다.(COST BASED 를 사용)
RULE : 기본적으로 VERSION 7에서는 COST-BASED 를 사용하지만 RULE-BASED 를
      사용할려고 할때 사용한다.
FULL : 특정 TABLE 을 FULL SCAN 할려고 함.
ROWID : ROWID 를 사용해서 SCAN 할려고 함.
CLUSTER : CLUSTER 를 사용해서 SCAN 할려고 함.
HASH : HASH SCAN
INDEX : INDEX 를 사용해서 SCAN 할려고 함.
INDEX_ASC : INDEX 를 사용해서 ASCENDING SCAN 할려고 함.
INDEX_DESC : INDEX 를 사용해서 DESCENDING SCAN 할려고 함.
AND_EQUAL : 여러 SINGLE COLUMN INDEX 를 사용할려고 함.
ORDERED : FROM 절의 TABLE 순서를 명확히 할려고 함.
         없으면 TBALE 순서는 OPTIMIZE 가 정함.
USE_NL : NESTED LOOP 를 사용할려고 함.
USER_MERGE : SORT-MERGE JOIN 를 사용할려고 함.

 기본적으로 ANALYZE 를 사용하지 않는 TBALE 은 RULE-BASED 를 사용한다. 그리고
COST-BASED 를 사용하지 않을 경우에 위의 HINT 들을 사용하게 된다.

 HINT는 코딩이 잘못 되거나, 논리적으로 맞지 않거나, 옵티마이져가 판단할 때
너무 많은 비용이 소요된다고 판단하면 사용자의 힌트를 무시한다. 즉 HINT는 장기
나 바둑의 '훈수' 라고 생각하면 된다. 훈수를 받을 수는 있으나 반드시 훈수대로
두는 것은 아니다. 따라서 힌트를 사용한 경우 힌트가 감안되었는지 무시되었는지
를 실행계획 (Explain Plan) 혹은 SQL_TRACE 를 통해 확인하여야 한다.

3. Database Link?

 link 는 remote db에 대해서 network(sql*net) 을 사용하여 자기 db에 있는 것과
같이 사용을 목적으로 하고 있다. link 를 사용하기 위해 우선 조건은 sql*net이
제대로 작동해야 하며 sql*net은 o/s 끼리의 network (tcp,lu6.2 decnet ) 이 되어
야 한다.

 그럼 link를 만드는 명령어를 쳐 보겠습니다.

sql> create database link test_link connect to scott
    identified by tiger using 'main' ;

위의 test_link 는 link 이름입니다.

    scott 는 상대편 userid 이며 뒤의 tiger 는 상대편 password 입니다.
    2번째 줄의 main 는 sql*net version 2를 사용할 경우는 tnsnames.ora에 등록
된 이름을 뜻합니다.
    ( 현재 T-520 은 'ora722t' 로,  K-460 은 'main' 으로 등록되어 있습니다. )

다음은 link를 사용하는 방법입니다.

sql> select * from tab@test_link ;
   위의 @test_link 는 link 이름이며 사용하고자 하는 table의 이름 뒤에 적용하
면 됩니다. 나머지 액션들은 자기 db에 있는 것과 똑 같이 사용하시면 됩니다.
   사용시 많은 data 가 이동되지 않도록 주의 하시면 됩니다.
   
   이 부분은 여러분이 현 운영환경의 data를 이동시 많이 사용하게 되므로
   그리고 어려운 부분이 아니므로 한 번 쯤은 test 를 해보시기 바랍니다.
   
sql> create synonym   emp  for  emp@test_link ;
 위와 같이 하면 Remote db 의 emp table 을 마치 자기 db에 있는 것처럼 사용할
수 있습니다.  

Tag : ,

Write your message and submit
« PREV : 1 : ··· : 12 : 13 : 14 : 15 : 16 : 17 : 18 : 19 : 20 : ··· : 58 : NEXT »