준준의 기록일지

[sql] 복합키 본문

Database

[sql] 복합키

junjunwon 2021. 1. 18. 16:29

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."




이번에 고객사 운영서버에서 직접 쿼리 작업을 진행하다가 대형사고를 냈다. 

2021년 1월 14일..

백업 및 접속이력 테이블에 데이터가 실제로 insert되는 시간을 확인하기 위해 temp table에 데이터생성일자 컬럼을 추가했고, 데이터를 쌓고 있었다. 이 문제는 어려움 없이 해결했는데, 아무래도 고객사 DB기 때문에 3시간에 한번씩은 데이터를 비워주는 작업이 필요했다.

이 부분을 해결하기 위해서 datediff, dateadd between등 다양한 시도를 했고, 일이 터졌다.

해당 부분을 계속 테스트하기 위해서 where절에 최신 데이터만 insert해주는 조건을 빼버린 것..

얼마나 멍청했는지, 스케줄러는 1분마다 도는데, 1분마다 30,000개의 데이터가 누적된 것이다. 3시간뒤 약 5백만개...가 쌓여서 고객사 DB 용량이 full이 되서 접속이 불가능한 상황이 됐다ㅋㅋㅋ어이가..없네요.

테스트서버에서 충분한 테스트 없이 운영서버에 직접 쿼리를 작업하는 것자체가 이해가 안되지만, 상황이 그랬고, 내가 실수했으니 내 잘못이겠지.....

일단 다음날부터 쭉 수습해서 문제는 해결했지만 책임님이 식별자에 대한 정의만 되어있었어도, 중복된 데이터를 무자비하게 insert해오는 일은 없었을거라고,,,,,,,,,,,

사실 기본키를 찾으려고 했는데, 마땅한 키가 없어서 최신데이터 이후에 데이터만 불러오게 짠건데,,,,이거 조차 생각이 없었던 것..!!

그래서 기본키를 공부하게 됐다. 보다보니까 sessionkey랑 특정 날짜를 복합키로 두고 가져오면 문제가 없을 듯하다.

복합키(Composite Key)

하나의 속성으로는 기본키가 될 수 없는 경우, 둘 이상의 컬럼을 묶어 식별자로 정의해야 하는데, 이를 복합키라고 한다.

이슈 : 복합키 중에 어떤 컬럼을 먼저 둘 것인가? 

컬럼을 기본키로 정의하게 되면 기본적으로 해당 컬럼에 유니크한 클러스터드 인덱스가 정의되어진다.

이럴 경우 먼저 정의한 컬럼을 기준으로 인덱스가 생성되기 때문에 복합키 중에서 주로 조회의 조건으로 사용되는 컬럼을 먼저 정의하는 것이 성능 향상을 위해 도움이 된다.

 

예시 : 사원 급여 내역 테이블

"누가 언제, 얼마의 급여를 받았는가"에 대한 정보를 관리해야 하므로 '지급 년 월', '사번'이란 속성을 도출할 수 있다.

지급 년 월

사번

지급일자

급여액

201904

123

20190430

3,000,000

201904

124

20190430

4,000,000

201905

125

20190530

2,000,000

201905

123

20190530

5,000,000

해당 테이블에서 사번으로만 기본키가 될 수 없다. 기본키라면 유일성을 보장해줘야 하는데, 위의 데이터를 보면 사원에 대한 급여정보가 매달 무적될 것이다. 만약 기본키가 사번으로 정해진다면 사번은 매달 중복이 될 것이다.

그래서 여기서는 '지급 년월 + 사번'이 합쳐져야 각각의 인스턴스(레코드)들에 대한 유일성을 보장할 수 있다.

 => 이것이 복합키이다. 복합키는 둘 이상의 속성으로 기본키가 구성된 것을 말한다.

 

출처 : dog-foot-story.tistory.com/60

 

[SQL] 식별자의 정의와 종류(후보키, 기본키, 대체키, 복합키, 대리키)

식별자(Identifier)란? 한 실체(Entity)내에서 각각의 인스턴스를 유일하게 구분할 수 있는 단일 속성 또는 그룹 속성을 말한다. 실체 내에서 식별자에 동일한 값이 중복될 수 없으며, 이를

dog-foot-story.tistory.com

 

'Database' 카테고리의 다른 글

[Hibernate] Criteria  (0) 2021.02.15
[sql] 복합키  (0) 2021.01.25
[sql] sql 쿼리를 활용한 ip주소 찾기.  (0) 2021.01.06
[DB] 데이터베이스 이중화  (0) 2021.01.04
[MSSQL] group by 대신 사용하는 over partition by  (0) 2020.12.10