달력

42025  이전 다음

  • 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

식별관계 , 비식별관계

DB 2009. 4. 26. 01:15

http://okjsp.pe.kr/seq/96724

식별관계냐 비식별관계냐는 erd를 작성하는 사람의 판단에 따른다고 생각합니다.

자식테이블의 pk를 구성하는 칼럼이 부모로부터 받는 거라면 식별이고
그렇지 않고 단순한 데이타 저장용 칼럼이라면 비식별 관계가 되겠지요.

이때 부모로 부터 받은 칼럼을 일반 칼럼으로 잡을 수도 있지만 pk로도 잡을 수 있는 애매한 상황등이 존재하는데 pk칼럼을 구성하는 원칙중 최소한의 원칙이란 것이 있습니다.
즉 자식테이블의 pk를 구성하는 칼럼이 col1,col2,col3,col4 4개가 있고 col4는 부모로부터 받은 칼럼입니다. 그런데 자식테이블 로우의 유일성을 구분할 수 있는 것이 col1,col2,col3만으로도 충분하다면 col4는 pk 구성에서 빠져야 합니다. 그렇다면 처음에는 식별관계였다가 이후 비식별관계가 되겠지요.

간단히 설명드렸는데 데이타베이스의 설계는 1+2=3 이다 이런식으로 수학공식처럼 딱 떨어지지 않는 부분이 많습니다. 상당히 인문학적인 요소가 들어간다고 할까요?
사실 개판으로 erd를 만들어도 프로그래머가 고생하고 엄청나게 비효율적인 프로그램이 만들어지고 유지보수가 어려울 뿐이지 프로그램이 안돌아가는 것은 아닙니다. 다만 훌륭하게 erd가 만들어지면 프로그램 소스가 깔끔하게 나오고 유지보수도 쉬어지면 그만큼 효율적인 시스템이 되겠지요.

장황하게 말씀드렸는데 결론은 erd작성에는 정답이 별로 없다라는 것입니다. 자신의 그동안의 경험에 의해 이렇게 하면 좋더라, 저렇게 했더니 프로그램이 걸레되더라 는 등 상당부분 자신의 경험을 바탕으로 해서 제각각 만들어지게 됩니다.
(물론 이화식님처럼 누구나 이렇게 데이타베이스를 설계해야 한다는 것을 공감하게 할 수 있는 절대적인 원칙이 있다라고 강조하시는 분도 계시지만 그 정도 내공에 이르기에는-모든 이들이 공감할 수 있는 수준의 설계를 한다는 것은 정말 힘들겠죠.)

보다 과학적이고 효율적인 데이타베이스 설계를 하고 싶다면 책을 사서 보시기 바랍니다. 프로그램을 하는데 있는 새로운 시각을 가지게 될 것입니다.


'DB' 카테고리의 다른 글

identity 제 7법칙  (0) 2009.04.26
[QUERY]실행된 쿼리 내역 조회  (0) 2009.01.14
[QUERY]ORACLE DEADLOCK 조회 및 KILL  (0) 2009.01.06
Toad 를 이용한 excel 로 import  (0) 2008.11.28
SQLPlus 를 이용한 Query trace  (0) 2008.11.12
Posted by marryjane
|

identity 제 7법칙

DB 2009. 4. 26. 01:12

http://guldook.blogspot.com/2005/02/identity-7.html

이 논의에 참가한 많은 사람들은 얼마나 "identity가 정황(context) 의존적인가"에 대해서 얘기했다. Scott C. Lemon은 그의 두번째 원칙에 서 "identity는 커뮤니티의 정황(context)을 고려하지 않고는 존재하지 않는다"고 극단적으로 논평했다. 그리고 Jamie Lewis는 Identity 제 4 법칙을 전할 때 "정황은 모든 것이다"라고 했다. 그는 또한 좋은 예제들을 주었다:

나는 오디오/비디오 광이다, 그래서 나는 Audio Visual Sciences 포럼의 멤버이다.
내 가 가입할 때 나는 내 identity를 스스로 넣었다, 그리고 그것은 AVSForum에 대해서는 괜찮다. 내가 포럼의 규칙들을 따르는 한, 포럼을 운영하는 사람들은 내가 내 자신을 위해 제시한 identity가 무엇이든 간에 그 identity를 사용해서 돌아다니는 것을 허용한다. AVSForum에 있는 평판 시스템은 많은 통제 문제들을 해결한다. 포럼의 중재자들과 관리자들은 그들이 필요할 때는 모든 권한을 가지고 들어간다.

하지만 은행에 대해서도 self-assertion할꺼냐? 아마 아닐 것이다. 그렇다, AVS Forum이 은행이 발급한 identity에 의존할 수 있지만 나는 사회적인 정황(context)에서 판단했을 때 그런 명확한 (그리고 가치있는) identity를 사용하기를 원하지 않을 것이다. 그리고 AVSForum이 왜 그렇게 해야 하느냐? 그렇게 함으로써 얻는 이익보다 비용이 훨씬 더 클 수 있다. 당신이 과거에 등록하고 나서, 서로 매우 다른 정황들에 따라 identity를 전달하고 사용할 때, 필요한 정책(credential 종류 및 강도), 속성들 그리고 관리 시스템은 차이가 있다. 넓게 보면, 이런 것들은 need-driven이어야 하고, 만병통치약은 없다.

다 른 말로 하면, identity는 당신이 상상할 수 있는 한 가장 정황 의존적인 요소이다; 사실상, 모든 사회 활동은 굉장히 정황 의존적이다, 특히 온라인은. 내가 누구이며, 무엇을 공유할 것이며, 어떤 얼굴을 보여줄 것인가 하는 것은 전체적으로 우리가 활동하는 정황에 따라 다르다.

활동영역은 점점 늘어날 것이고, 그 활동영역들은 자신의 영역내에서 고유하고 적당한 identity 메커니즘과 식별자를 가질 것은 자명하다.
이 예제들에 함축된 객관적인 제약조건들이 이전의 Identity 법칙들에 담겨있다. 제 3 법칙은, "identity 관계를 고려해서, 필요하고 정당한 경우에 있는 상대방"에게만 개인 정보의 공개를 해야한다는 것이다. 여기서 identity 관계는 명백히 정황이다. 제 4 법칙은, 왜 metasystem이 사적인 관계에서, 이것도 특정 상황이다, 사용될 수 있도록 "unidirectional 식별자"를 지원해야 하는 지를 설명한다. 그리고 제 5 법칙은, 서로 다른 party들에 의해서 운영되는 서로 다른 시스템들이 공존해야 하는 다원적인 metasystem의 필요성을 언급한다.

하지만 지금 좀 더 구체화해보자. 상황별로 여러 개의 식별자들을 가지게 될 미래를 생각해보자. 나는 Jamie가 임의의 identity 집합을 제거하고 선택하는 것을 언급할 것인 데, 그것은 아주 편해보인다:
  • 브라우징: 웹을 돌아다닐 때 스스로 입력한 identity (실제 데이터는 아무 것도 주지 않는)
  • 개인: 지속적이지만 사적인 관계를 원하는 사이트들에 입력한 identity (이름과 장기간 사용할 전자우편 주소를 포함하는)
  • 커뮤니티: 다른 사람들과 협력하는 것과 블로깅을 위한 공개 identity (커뮤니티 명과 장기간 사용할 전자우편 주소를 포함하는)
  • 프로페셔널: 고용주에 의해 발급된, 협업을 위한 공개 identity
  • 신용 카드: 은행에서 발급된 identity
  • 시민: 정부가 발급한 identity
모 든 사람이 내가 사용한 것과 같은 identity 집합을 선택한다면 아주 간단할 것이다. 하지만 당연히 그렇지 않다. Jamie는 개인 identity를 사용하지 않았다. 내 형의 고용주는 프로페셔널 identity를 발급하지 않는다. Marc는 시민 identity를 적용하지 않고 계획도 없다. 그리고 우리는 우리 자신을 identify할 수 많은 방법들로 혼란하다.

지금, 당신은 이것을 믿지 않으려 하겠지만, 이런 혼란은 좋은 것이다. 그것은 우리의 다양성에 부합한다. 우리는 그것에 대해서 흥분할 필요는 없고 그것을 받아들여야 한다.

당신은 다양성을 어떻게 처리하는가?

다양성이 기술적인 문제를 낳지 않는다고 가정하고 시작하자. 이것이 처음에는 stretch일 것임을 안다, 하지만 "내일"까지는 나와 함께 참고 다른 이슈들을 살펴보자.

어 떤 형식의 identity를 받을 것인가에 대한 답은 "relying party"가 가지고 있다. 다른 말로 하면, 각 웹 사이트가 어떤 종류의 identity들을 받아들일 것인 지를 결정한다. 다시, 예제가 도움이 될 것이니 몇 가지 예제를 들어보겠다.

"Kim Cameron's Identity Weblog"를 가지고 출발하자. Kim's weblog는 어떤 identity를 받을 것인가? 당신은 그것을 명명하고 - 나는 그것을 받아들일 것이다. 너에게 가용한 뭐든 나는 좋다 - 나는 (내 웹로그에서) 논의가 이루어지기를 원한다.

다른 한편, 당신이 eBay와 같은 사이트로 갔다고 하자. 그 사이트는 윈도우 쇼핑을 위해 어떤 identity (또는 no identity)도 사용할 수 있도록 할 것이다. 하지만 당신이 구입을 원할 때는 신용 카드 identity를 기대할 것이다. 그리고 당신이 어떤 물건을 판매하려고 하면, 사이트는, 평판이 가미된, 커뮤니티 identity를 제시할 것을 요구할 것이다.

시민 identity의 사용 예는, 사회 보장 제도 기여금에 대한 정보에 접근하는 경우를 들 수 있다. 또한 컨퍼런스에 들어가기 위해 프로페셔널 identity를 사용하는 예제를 들 수 있다.

그래서 두 가지 것이 명확하게 된다.
  1. 하나의 relying party는 종종 한 가지 이상의 identity를 받기를 원할 것이다.
  2. 사용자는 선택 옵션들을 이해하고 정황에 최적인 identity를 선택하기를 원할 것이다.
지금 여섯번째 법칙 - 인간 통합의 법칙 - 을 고려할 필요가 있다. 이것은 identity 정보의 요청, 선택 그리고 제공이, relying party(예: 웹 사이트)와 (첫번째두번째 법칙에 부합하는 방법으로) 정보를 제공하는 사용자 사이에 형성된, 안전한 채널을 통해서 이루어져야 하고 선택 옵션들은 일관되고 명확해야 한다는 것이다. 이런 제약조건 모두를 동시에 고려하면서 우리는 일곱번째 법칙을 접해야 한다:
조화로운 정황 자율성의 법칙 (The Law of Harmonious Contextual Autonomy)

통일된(unifying) identity metasystem은 relying party와 특정 identity를 가진 사용자 간의 협상과, 통일된 시스템이 서로 다른 정황에서 identity의 자율성를 허용하면서 조화롭고 기술적인 인간 인터페이스를 제시하는 그러한 관련 인코딩을 제공해야 한다.
이게 아주 어렵게 들리냐? 어렵다, 하지만 당신이 이후의 포스팅에서 보겠지만, 나는 이 산업계가 이것을 하는 데 필요한 도구들을 가지고 있다고 생각한다. 하지만, 통일된 identity metasystem을 가지지 않은 것의 댓가는 기하급수적으로 커져갈 것이다.

Doc Searls가 metadirectory에 관한 내 작업을 세심히 살피고 다음과 같이 말한 것이 아마 8년 전일 것이다.
"Kim. 그것은 간단하다. 우리는 다수의 시스템에 다수의 identity들을 가진다, 하지만그것들을 통합할 방법은 없다. 이런 일이 실세계에서 일어났다면, 우리는 다수의 인격 장애를 가졌을 것이다. 인터넷은 여전히 정신병적이다."
이런 생각이 결코 떠나지 않는다. 틀림없이 나는 사용자로써 우리가 여러 가지 identity들을
(소수만이 서로 독립적인 정황들에 대한 필요성을 유의하는) 통합된 세계의 일부로써 볼 필요가 있음을 납득했다.

'DB' 카테고리의 다른 글

식별관계 , 비식별관계  (0) 2009.04.26
[QUERY]실행된 쿼리 내역 조회  (0) 2009.01.14
[QUERY]ORACLE DEADLOCK 조회 및 KILL  (0) 2009.01.06
Toad 를 이용한 excel 로 import  (0) 2008.11.28
SQLPlus 를 이용한 Query trace  (0) 2008.11.12
Posted by marryjane
|

V$SQLTEXT, V$SQL, V$SQLAREA 를 이용할 수 있다.

SELECT PIECE, SQL_TEXT
FROM V$SQLTEXT
WHERE ADDRESS = '&sqladdress'
ORDER BY 1;

SELECT SQL_TEXT, SCHEMANAME, MACHINE, TERMINAL, PROGRAM
FROM  V$SQLAREA A, V$SESSION B
WHERE A.ADDRESS =B.SQL_ADDRESS

SELECT SQL_TEXT, PARSING_SCHEMA_NAME, MODULE, LAST_LOAD_TIME, LAST_ACTIVE_TIME
FROM V$SQLAREA
WHERE LAST_LOAD_TIME BETWEEN SYSDATE - 1 AND SYSDATE
    AND PARSING_SCHEMA_NAME <> 'SYS'
    AND SQL_TEXT LIKE 'UPDATE%'
ORDER BY LAST_LOAD_TIME;


'DB' 카테고리의 다른 글

식별관계 , 비식별관계  (0) 2009.04.26
identity 제 7법칙  (0) 2009.04.26
[QUERY]ORACLE DEADLOCK 조회 및 KILL  (0) 2009.01.06
Toad 를 이용한 excel 로 import  (0) 2008.11.28
SQLPlus 를 이용한 Query trace  (0) 2008.11.12
Posted by marryjane
|

http://blog.naver.com/jaekodog/100045483315

Test DB : Oracle 8.1.7 (Toad 8.0)

 

1. Lock이 걸린  사용자를 조회

   (Type의 값이 TM인 것이 DEAD LOCK이다.)   

   (Lock이 걸린 쿼리도 같이 조회하려면 ,"V$SQLTEXT" 관련 쿼리를 넣어준다)

 

SELECT  "V$LOCK"."TYPE"

             ,"V$SESSION"."SID"

             ,"V$SESSION"."SERIAL#" 

             ,"V$SESSION"."MACHINE"

             ,"V$SESSION"."TERMINAL"

             ,"V$SESSION"."OSUSER"

             ,"V$SESSION"."USERNAME"

             ,"V$SESSION"."PROGRAM"

             ,"OBJ"."OBJECT_NAME"

             ,"V$LOCK"."ID1"

             ,"V$LOCK"."REQUEST"

             ,"V$SESSION"."STATUS"

        --  ,"V$SQLTEXT"."SQL_TEXT"   

  FROM  "OBJ"

            ,"V$LOCK"

            ,"V$SESSION"

       --  ,"V$SQLTEXT"

 WHERE ( v$session.sid = v$lock.sid  )

      AND ( v$lock.id1 = obj.object_id (+))

  -- AND ( v$session.sql_hash_value = v$sqltext.hash_value )

      AND ( "V$SESSION"."USERNAME" is not null)  ;

 

2. Lock이 걸린 사용자를 Kill

   ALTER SYSTEM KILL SESSION 'SID번호, SERIAL#번호'   ; 

'DB' 카테고리의 다른 글

identity 제 7법칙  (0) 2009.04.26
[QUERY]실행된 쿼리 내역 조회  (0) 2009.01.14
Toad 를 이용한 excel 로 import  (0) 2008.11.28
SQLPlus 를 이용한 Query trace  (0) 2008.11.12
[함수]NVL, NVL2  (0) 2008.11.06
Posted by marryjane
|


1. Database -> Import -> Table Data

2. Database 와 Table, Commit 방법을 선택후 Show Data -> Execute Wizar

3. 파일종류를 선택( Text, Excel, mdb(Access) ) 

4. 자료형식 선택

5. File Preview 에서 각 컬럼 맵핑

7. import 모드를 확인하고 클릭
- 단순 add
- 단순 update
- 해당 record 가 있으면 update, 없으면 add
- 해당 record 가 있으면 delete 

'DB' 카테고리의 다른 글

[QUERY]실행된 쿼리 내역 조회  (0) 2009.01.14
[QUERY]ORACLE DEADLOCK 조회 및 KILL  (0) 2009.01.06
SQLPlus 를 이용한 Query trace  (0) 2008.11.12
[함수]NVL, NVL2  (0) 2008.11.06
[함수]DECODE  (0) 2008.11.06
Posted by marryjane
|


SQL> set autotrace trace;
SQL> SELECT ......


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   COUNT (STOPKEY)
   2    1     TABLE ACCESS (BY INDEX ROWID) OF '......'
   3    2       INDEX (RANGE SCAN) OF 'SYS_C0034253' (UNIQUE)




Statistics
----------------------------------------------------------
......

SQL> set autotrace off

* 권한 필요
SP2-0618: 세션 식별자를 찾을 수 없습니다. PLUSTRACE 롤이 사용 가능한지 점검하십시오
SP2-0611: STATISTICS 레포트를 사용 가능시 오류가 생겼습니다

'DB' 카테고리의 다른 글

[QUERY]ORACLE DEADLOCK 조회 및 KILL  (0) 2009.01.06
Toad 를 이용한 excel 로 import  (0) 2008.11.28
[함수]NVL, NVL2  (0) 2008.11.06
[함수]DECODE  (0) 2008.11.06
ORA-04030  (1) 2008.11.06
Posted by marryjane
|

[함수]NVL, NVL2

DB 2008. 11. 6. 18:05

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/index.htm

NVL

Syntax

nvl::=

Text description of functions180.gif follows 

NVL2

Syntax

nvl2::=

Text description of functions28.gif follows 

Examples

The following example shows whether the income of some employees is made up of salary plus commission, or just salary, depending on whether thecommission_pct column of employees is null or not.

SELECT last_name, salary, NVL2(commission_pct, salary + (salary * commission_pct), salary) income FROM employees WHERE last_name like 'B%' ORDER BY last_name; LAST_NAME SALARY INCOME ------------------------- ---------- ---------- Baer 10000 10000 Baida 2900 2900 Banda 6200 6882 Bates 7300 8468 Bell 4000 4000 Bernstein 9500 11970 Bissot 3300 3300 Bloom 10000 12100 Bull 4100 4100

'DB' 카테고리의 다른 글

Toad 를 이용한 excel 로 import  (0) 2008.11.28
SQLPlus 를 이용한 Query trace  (0) 2008.11.12
[함수]DECODE  (0) 2008.11.06
ORA-04030  (1) 2008.11.06
대용량DB에서 FK의 필요성 - sarang.net  (0) 2008.10.28
Posted by marryjane
|

[함수]DECODE

DB 2008. 11. 6. 17:54

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/index.htm

DECODE

Syntax

decode::=

Text description of functions157.gif follows 
Text description of decode


Purpose

DECODE compares expr to each search value one by one. If expr is equal to a search, then Oracle returns the corresponding result. If no match is found, then Oracle returns default. If default is omitted, then Oracle returns null.

If expr and search contain character data, then Oracle compares them using nonpadded comparison semantics. exprsearch, and result can be any of the datatypes CHARVARCHAR2NCHAR, or NVARCHAR2. The string returned is of VARCHAR2 datatype and is in the same character set as the first result parameter.

The searchresult, and default values can be derived from expressions. Oracle evaluates each search value only before comparing it to expr, rather than evaluating all search values before comparing any of them with expr. Consequently, Oracle never evaluates a search if a previous search is equal to expr.

Oracle automatically converts expr and each search value to the datatype of the first search value before comparing. Oracle automatically converts the return value to the same datatype as the first result. If the first result has the datatype CHAR or if the first result is null, then Oracle converts the return value to the datatype VARCHAR2.

In a DECODE function, Oracle considers two nulls to be equivalent. If expr is null, then Oracle returns the result of the first search that is also null.

The maximum number of components in the DECODE function, including exprsearchesresults, and default, is 255.

See Also:

Examples

This example decodes the value warehouse_id. If warehouse_id is 1, then the function returns 'Southlake'; if warehouse_id is 2, then it returns 'San Francisco'; and so forth. If warehouse_id is not 1, 2, 3, or 4, then the function returns 'Non-domestic'.

SELECT product_id, DECODE (warehouse_id, 1, 'Southlake', 2, 'San Francisco', 3, 'New Jersey', 4, 'Seattle', 'Non-domestic') "Location of inventory" FROM inventories WHERE product_id < 1775;

'DB' 카테고리의 다른 글

SQLPlus 를 이용한 Query trace  (0) 2008.11.12
[함수]NVL, NVL2  (0) 2008.11.06
ORA-04030  (1) 2008.11.06
대용량DB에서 FK의 필요성 - sarang.net  (0) 2008.10.28
SQLPlus 사용법  (0) 2008.10.25
Posted by marryjane
|

ORA-04030

DB 2008. 11. 6. 17:06

ORA-04030: out of process memory when trying to allocate 64544 bytes (sort subheap,sort key)

* 아래내용이 원인인 줄 알았으나....
TOAD 를 재시작해보니 TNS리스너가 죽어있었음. 접속중, TNS리스너가 죽어버린 경우에도 발생하는듯.


- 구성
SERVER   : AIX 5L
Oracle Ver : 10.2.0.3

- 에러내역
    Ora-04030
    04030, 00000, "out of process memory when trying to allocate %s bytes (%s,%s)" 
// *Cause:  Operating system process private memory has been exhausted 
// *Action:


10.2.0.3 버전에서 패치완료 됨으로 되어있음.
그래도 ora-04030이 발생함
그래서 oracle 환경적인 요소보다 OS 환경요소로 봄

ulimit –a 확인해서
time(seconds) unlimited
file(blocks)    unlimited
data(kbytes) 131072  (값으로 설정되어 있으면 unlimited로 설정)
stack(kbytes) 32768  (값으로 설정되어 있으면 unlimited로 설정) 

4. 참고 문헌

2.6.1 Configure Shell Limits
Verify that the shell limits shown in the following table are set to the values shown. The procedure following the table describes how to verify and set the values.

Shell Limit (As Shown in smit)

Recommended Value

Soft FILE size

-1 (Unlimited)

Soft CPU time

-1 (Unlimited)

Note: This is the default value.

Soft DATA segment

-1 (Unlimited)

Soft STACK size

-1 (Unlimited)


To view the current value specified for these shell limits, and to change them if necessary:

1. Enter the following command:
2. # smit chuser
3. In the User NAME field, enter the user name of the Oracle software owner, for example oracle. 
4. Scroll down the list and verify that the value shown for the soft limits listed in the previous table is -1.
If necessary, edit the existing value.
5. When you have finished making changes, press F10 to exit.

'DB' 카테고리의 다른 글

[함수]NVL, NVL2  (0) 2008.11.06
[함수]DECODE  (0) 2008.11.06
대용량DB에서 FK의 필요성 - sarang.net  (0) 2008.10.28
SQLPlus 사용법  (0) 2008.10.25
SQL loader 사용하기  (0) 2008.09.19
Posted by marryjane
|

http://database.sarang.net/?inc=read&aid=20928&criteria=oracle&subcrit=qna&id=&limit=20&keyword=&page=1


FK의 옵션에 따라서 다르게 반영됩니다.

물론 마스터테이블이 변경될때, FK테이블이 같이 변경되게 세팅된다면 그런 현상이 발생할수 있습니다.

그렇지 않게 세팅할수도 있습니다.

 

다만, FK를 걸어서 얻게되는 이익이 그리 크지 않습니다. 구지 거셔야한다면 꼭걸어야 하겠지만, DBA의 말대로 데이터일관성 측면에서는 FK보다는 프로그램으로 처리하는 경향이 많습니다.

또한, FK가 조인의 성능에 미치는 영향이 미미하기 때문에 실제로 FK를 걸어서 얻는이익은 그것을 생성해서 발생하는 cost보다 많지 않습니다.

 

참고만하세요,

장종훈님이 2004-12-06 09:28:33에 작성한 댓글입니다. Edit 

글 읽고 저도 한가지 궁금한게 있어서 한자 적습니다.

 

부모테이블이 변경될 경우 자식테이블에 Full Lock이 걸린다고 하셨는데, 자식테이블의 FK에 대응(?)되는 부모테이블의 PK가 아닌 다른 컬럼이 수정되어도 자식테이블에 Full Lock이 걸리는 것인가요?

 

그렇지 않다면... 보통 PK가 수정될 경우는 거의 없고, 수정이 필요한 경우에라도 추가로 insert를 해야지 update를 해서는 안된다고 알고 있습니다. 이렇다면, FK를 걸어서 성능상에 큰 이익을 보는 것이 아니더라도 모델링 측면에서 봤을 때는 FK를 생성하는 것이 맞는게 아닌지요.

 

모델링 공부한지 얼마 안대서 어리버리 합니다^^;

틀린부분있으면 과감한 지적 부탁합니다.

 

 

 

민윤기(amgblue)님이 2004-12-06 10:24:35에 작성한 댓글입니다.

PK 와 FK 의 경우 윗 분이 말씀하신데로... 데이터 베이스 모델링 측면에서 아주 중요한 부분이 됩니다.

즉 데이터의 일관성 유지및 스키마 관계에 대한 해석 및 정규화 등의 문제로 볼때 아주 중요한 설정이 될껍니다.

COST 비용을 말씀하셨는데... 만약 관리 하는 테이블이 정말 많다면.. 이 부분을 어떻게 일일이 다 프로그램으로 처리를 하여 관리하시겠다는 말씀인지... 관리가 가능할까요? 정말 중요한 데이터 들이라면...

 

PK 및 FK 설정시 말씀하신데로 LOCK 이 걸리는 현상은 발생합니다.

즉 SX 타입의 LOCK 이 걸려서 enqueue wait 이 발생하기도 합니다.

권장 사항은 fk 컬럼에도 인덱스를 생성하는 것입니다. 즉 대부분의 경우 pk 와 fk 간의 join 이 많이 발생하며, 조인시 update나 기타 insert 시 검색시간이 많이 걸린다면, 즉 해당 키를 찾기 위한 시간이 많이 걸린 다면 그만큼 테이블에 lock 이 오랜동안 지속되어 dead lock 이 발생할 확률이 많다는 이야기죠... 이런 부분들을 위해서 가능한한 fk 에 index 를 생성해 줄 것을 권고 하고 있으며, update 나 기타 insert 가 많이 발생하는 테이블이라면 initrans 나 freellists 를 더 늘려서 원활한 처리가 이루어 질수 있도록 하는 것도 방법이 될거 같습니다.

 

^^;; 수고하세요...

나그네님이 2004-12-06 10:55:08에 작성한 댓글입니다. Edit 

FK인 컬럼에 색인을 만들지 않았을 때 잠금 문제라든가. 데드락 상황이 생길 수 있음은 나그네님이 잘 설명해주신 것 같습니다.

 

저는 다른 관점에서 이 문제를 언급해보고자 합니다.

 

왜 현업에서 Foreign Key를 사용을 꺼리는걸까요?

 

첫째, 위와 같이 FK컬럼에 색인을 만들지 않았을 때 발생하는 부정적인 영향을 들을 경험한 DBA나 개발자는 FK를 이론적으로나 가능하고 실재론 못쓸 물건이라는 결론을 내리기 때문입니다. 허나 색인을 만들어주고 사용하면 됩니다.

 

두번째, FK가 성능에 악영향을 준다는 믿음. 매번 자식 테이블에 row를 insert할 때 마다 부모-자식 관계를 검증하기 위해 오버헤드를 준다는 믿음.     물론 FK를 주면 오버헤드가 있습니다. 하지만 테스트 결과 우려할 만큼 심각한 영향을 주는건 아니었습니다. 오히려 FK를 사용하지 않음으로써 불필요한 Outer join의 남발로 인한 성능 문제가 더 심각한게 현실입니다. 그러니 꼭 필요하다면 FK를 거십시오.

자료의 무결성은 그 무엇보다도 중요합니다. 나중에 정합성이 맞지 않는 쓰레기 데이타를 가지느니 FK를 걸고 두 다리 쭉 뻣고 주무시는게 훨씬 유익합니다.

그러나 로그성 테이블 처럼 무결성이 크게 중요치 않은 경우 걸지 않아도 됩니다.

 

세번째, 자료의 무결성 체크를 DB가 아닌 클라이언트에서 3GL언어를 사용해서 하려는 경향...

왜 이런 잘못된 믿음이 생겼는지는 모르나 대부분 DB의 잠금이나 무결성에 관련된 메카니즘을 잘못 이해함으로 생기는 미신입니다.

 

예를 들어... 어차피 이 자료는 VB로 만든 콤보박스에서 선택하도록 강제되므로 FK나 제약조건(Constraints) 가 불필요하다는 믿음.

이건 동시성 문제를 전혀 생각하고 있지 않다는 이야기가 됩니다.

 

무결성 체크를 어플리케이션에서 하기 위해서 자식 테이블에 insert를 하기 전에 부모키의 존재 여부를 확인하도록 루틴을 추가했다고 칩시다.

select count(*) into v_cnt from parent_table where key=123

v_cnt가 1이상이면 부모가 존재하므로 자식 쪽에 insert하는 것을 허용하도록 코드를 했습니다.

위에서 간과한 것이 count 직후 만약 부모 테이블의 자료를 삭제한다면 정상적으로 작동하지 않습니다.

결국 동시성 문제를 이해한 개발자라면 for update 로 잠금을 걸던가 해야 정확합니다.

허나 이리하면 실재로 FK를 건것보다 더 성능이 나오지 않습니다. 게다가 어플리케이션에 불필요한 코드가 들어감으로써 성능이 더 악화됩니다.

 

결론 데이타 정합성이 조금이라도 중요한 테이블이라면 FK를 반드시 거십시오. 그리고 불필요한 outer join을 남발하거나 3GL언어에서 정합성을 체크하려는 복잡성과 오버헤드를 제거하십시오.

 

 

이는 "제약조건을 사용하지마라"라는 미신과 더불어 정말 오래된 미신 가운데 하나입니다.

김주현님이 2004-12-06 11:38:26에 작성한 댓글입니다.
이 댓글은 2004-12-06 11:50:26에 마지막으로 수정되었습니다. Edit 

오우... 이해가 팍팍되는... 답변들이십니다...s-_-b

또 배워갑니다.. 감사^^/

민윤기(amgblue)님이 2004-12-06 11:53:20에 작성한 댓글입니다.

좋은 글들 감사합니다. 그러나, 아직도 현실적으로 FK를 사용하는데는 문제점이 있습니다. 개발자였으며 현재 DBA 쪽에 가까운 사람입니다.

 

이런적으로나 데이터 정합성 측면에서 FK는 확실한 대안일수 있습니다.  만약 4GL 같은 툴을 사용하지 않고 DB만으로 모든것을 처리한다면 FK는 확실한 효과를 거둘수 있는 대안이고, 관리 작업의 비용도 줄어들게 됩니다.

 

그러나, 현실에선 DBA의 role과 개발자의 role이 엄현이 구분됩니다. DBA는 데이터베이스의 모든권한을 가지고 있지만 개발자는 최소한의 권한만을 가지고 작업을 하는게 현실입니다. 이는 개발자가 DB의 생성권한도 없으며, 생성된 DB의 개별 개체의 형태를 조회할수 없을수도 있다는 이야기입니다. 이런상황에서 FK등의 제약사항을 가지고 있다면 개발자는 FK에 반한 작업을 할수도 있습니다.

 

또한, 어플리케이션의 입장에서 볼수도 있습니다. 한회사에 고객DB와 물건 판매기록이 있습니다. A라는 사람이 대리점에서 물건을 구매했습니다. 그럼 구매즉시 전표를 입력할것입니다. 그런데 공교롭게도 그는 그회사의 고객명부에 없습니다. 어떻게 할까요, 고객한테 회원이 아니니 회원가입양식을 입력하셔야만 물건구매를 할수있습니다. 이럴까요? 일단 구매기록을 입력하고, 고객등록을 받는게 고객우선 주의겠지요?

 

위와 같은 문제점은 FK를 사용할때 나타나는 문제들의 극히 일부입니다. FK는 이론상으로 또는 DB관리상의 비용을 상당히 줄여주는것은 사실입니다만, 현실에는 여러가지 예외사항이 있습니다. 물론 이건 FK만의 문제가 아니라. 이론을 실제에 적용할때 발상하는 문제들입니다.

꼭 FK를 사용할것이다,(혹은 프로그램적으로 제약사항을 걸것이다) 이런건 신중한 고려가 필요합니다.

 

입시프로그램을 짠적이 있습니다. 국내에는 주민번호알고리즘에 위배되는 주민번호도 상당수가 있습니다. 제약사항으로 주민번호 알고리즘을 체크했다면, 그사람은 대학입시 기회조차도 없었겠지요,

 

이론을 무시하자는 이야기는 아닙니다. 이론을 알아야하는것은 확실하지만 현실에 반영하는문제는 신중을 기해야 합니다,

 

좋은지적글들 감사합니다.^^

장종훈(장종훈)님이 2004-12-06 13:21:47에 작성한 댓글입니다.

장종훈님의 말씀도 맞지요. 업무상 그렇다면 재고해봐야할 겁니다.

 

제가 FK를 이야기하는 이유 중에 하나는 또 이런게 있습니다.

 

A라는 회사가 있습니다. VB 로 C/S방식의 어플리케이션을 작성해서 내부용으로 사용하던 것을 이젠 웹으로도 제공하기로 결정이 되었습니다. 그러니까... VB와 웹 모두 서비스를 제공해야 합니다.

 

만약 제약조건과 FK등을 사용했다면 데이타베이스의 무결성은 데이타베이스 자체가 검증하게 됩니다. 그러나 만약 그 동안 VB에서 3GL코드로써 이러한 작업을 해왔다면... 웹에서도 동일하게 이러한 에러 검증 코드를 재작성해야합니다. 그리고 어떤 이유로 에러 검증 루틴이나 규칙이 변했다면 VB로 작성한 코드와 웹코드를 모두 고쳐주어야 합니다.

만약 두개의 에러검증 코드가 일치하지 않는다면 데이타 무결성에 문제가 발생하게 됩니다.

 

자! 이 경우 DB에 이들 제약조건과 FK를 거는게 더 시간을 줄여줄까요? 아니면 3GL 코드에 이걸 박는게 더 좋은걸까요?

(시간, 확장성, 유연성 모두 고려했을 때...)
김주현님이 2004-12-06 14:10:54에 작성한 댓글입니다.
이 댓글은 2004-12-06 14:18:46에 마지막으로 수정되었습니다. Edit 

그 dba 에게 thomas kyte 가 쓴 effective oracle 의 1 장을 읽어보라고 하세요.(번역본도 있더군요)

"데이터베이스는 데이터더미가 아닙니다."

 fk 다시고, 윗분 고수님들 말씀대로 fk 에 대해 인덱스 생성하세요.

김성식(hellower)님이 2004-12-06 17:34:30에 작성한 댓글입니다.
이 댓글은 2004-12-06 22:06:12에 마지막으로 수정되었습니다.

대용량인가 아닌가는 기준이 될 수가 없습니다.

 

대용량이어서 FK나 Constraints를 쓸 수 없다는 이야기는 대용량이면 데이타 무결성이 깨어져도 상관없다는 이야기가 될 수도 있습니다.

좀 극단적으로 논의를 확장하면 대용량이면 Join도 쓰지 말아야한다는 논리까지 갈 수 있습니다. (실재로 이런 경우 있습니다.)

 

결론은 데이타 무결성이 기준이 되어야지 대용량 여부는 상관이 없습니다. 정규화 잘하고 Constraints걸고, FK 걸고도 성능 제대로 내는 것 얼마든지 가능합니다.

김주현님이 2004-12-07 10:18:32에 작성한 댓글입니다. Edit 

저는 장종훈님의 의견에 동갑합니다. 

아무리 설계상 FK 의 설정을 완벽하게 했다고 해도 업무를 하다보면 우리의 친애하는 현업님께서 

예외사항을 들고 오십니다. (^^ 다들 이부분에서는 공감하실 듯)

그러면, 저는 무조건 안 된다고 하죠. 그렇게 처리하는게 아니라고 ...그러면 현업도 알고 있다고 하면서

윗분들 예기 꺼네죠.(사장님 이하~~~ 쭉) 꼭 해야 되는 급한거라고( 어쩔수 없죠. 현업이 갑이니. ㅠ.ㅠ)

그렇다고 FK 를 없앨 수는 없는 거 아닙니까. 그러면 부모테이블과 자식테이블에 가상의 데이타를 입력하게 되는 경우가 생기죠...

이런것들이 하나둘 쌓이다 보면, FK의 본질적이 의미가 많이 퇴색되게 됩니다. (시스템 개발후 장시간이 흘렀으면 더 말할 것도 없구요)

윗분들 예기처럼 FK 는 성능상의 큰 차이점은 없는 거 같습니다. 

그런데, 제가 하고 싶은 예기는 이론과 현실은 다소 차이점이 있다는 것입니다. 

훌륭하신 분들의 좋은 글에 몇자 적었습니다.

오라클(cccc)님이 2007-01-11 09:51:03에 작성한 댓글입니다.

'DB' 카테고리의 다른 글

[함수]DECODE  (0) 2008.11.06
ORA-04030  (1) 2008.11.06
SQLPlus 사용법  (0) 2008.10.25
SQL loader 사용하기  (0) 2008.09.19
토드 단축키  (0) 2008.09.16
Posted by marryjane
|