database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 6791 게시물 읽기
No. 6791
mssql 에서 채번? PK코드 값을 자동으로 넣고 싶습니다.
작성자
풀잎
작성일
2014-03-12 14:18
조회수
12,834

안녕하세요 늘 도움만 받고 이렇게 또 질문 합니다.

제가 하고 싶은 것은 예를 들어 쇼핑몰의 주문번호 같은 형태입니다.

ex:20080001 ( 날짜+ 순번)

mssql에서 'IDENTITY'  키워드를 이용해서 자동으로 순번이 채워 지는 것으로 알고 있습니다.

문제는 int형으로 1,2,3..... 형태로 되는 것입니다.

저는 베이스 코드 테이블을 생성할때

S0000001, S00000002 와 같은 스트링+순번의 조합으로 자동으로 넣고

또 그 PK 코드값을 다른 테이블에도 참조하고 싶습니다.

 

업무적으로 시퀀스만 써도 문제는 없지만 이런 경우가 한번은 발생할 것 같아서

이번에 정리할려고 합니다.

검색해보니 채번테이블을 별도로 두어 max값을 가져와서 update +1 하고

그 값을 원하는 테이블에 넣는다. 이런 방법도 있던데요.

혹시 실무에서는 어떤 방식을 쓰는지 알고 싶습니다.

또 다른 좋은 방법이 있는지 많은 의견 부탁드립니다.

---------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

이 글에 대한 댓글이 총 4건 있습니다.

IDENTITY는 보통 INT형으로 넣으므로 4byte죠.
'S0000001'은 8byte죠.(CHAR인 경우, NCHAR면 16byte죠)

PK라면 그 위에 nonclustered index를 생성할때 PK값을 리프 노드에 포함도 되고
외래키를 이용해서 참조할때도 보관이 되는 등 사방군데에서 사용이 되는 중요한 data type인데
1/2 또는 1/4로 그 크기를 줄일 수 있다면 제사를 지내서라도 줄여야할 일임에도 불구하고
굳이 왜~~ 키우는지 잘 모르겠기에 전 그냥 INT 씁니다만....
가끔 아는 척하는 찌질이들이 보기가 안 좋네... 남들도 다 쓰네... 식의 투정을하면

  1. 찌질이가 상급자면
    • view를 만들어서 (레코드의identity값 - 전날짜max의 identity값) 을 이용해서 적당히 만들어 주고 "됐지?"라고 합니다.(어차피 내가 설계하는 DB에 그 따위 값은 참조용으로 안 쓰기에)
    • 상황에 따라서는 위의 방법을 이용해서 계산된 열을 테이블에 추가하기도 합니다.
    • 자정 근처에서도 data가 많이 들어왔다가 사라져서 저 방식이 깨질거 같으면 조금 변형을 하기도 하지만 4byte는 꼭 지켜내는 편입니다.
  2. 찌질이가 하급자면
    • 등짝스매쉬를 갈긴 후에 "왜 그렇게 안하는지에 대해서 보고서 제출해라"라고 합니다.

 

우욱님이 2014-03-12 15:39에 작성한 댓글입니다. Edit

오홋.. 역시 이번에도 우욱님께서. 답변을..

늘 도움만 받는거 같습니다.

쓰신 글 수십번 읽어 보고 이해했습니다.

사방군데에서 사용이 되는 중요한 data type을

크기를 늘려서 관리할 필요가 없다는 것으로 이해했습니다.

또 identity를 이용해서 db단에 맡기는게 효율면에서 가장 좋을 것 같습니다.

사실 며칠 고민했습니다.  S0000001처럼 사람 눈에 보이는 pk 코드값(주문번호,코드값 등)이

무슨 의미가 있을까..... 그냥 identity와 같은 키워드를 이용하면 되는데...

우욱님 말씀처럼 고민할 필요없이 여기저기 다 쓰이는 (FK 등) 이 중요한 값을 왜 고민했는지...

여담으로... 우욱님 아랫사람이 아니었길.. 다행이라고 생각하면서.... (ㅋ)

 

꽃씨하나(wtb0307)님이 2014-03-12 16:39에 작성한 댓글입니다.

인덱스의 구조를 보시면

넌클러스터드 인덱스의 리프노드에는 레코드를 찾아가기 위해서 PK의 값이 들어있습니다.

http://technet.microsoft.com/ko-kr/library/ms177484(v=sql.105).aspx

에 나와있는

테이블에 클러스터형 인덱스가 있거나 인덱스가 인덱싱된 뷰에 있는 경우 행 로케이터는 행에 대한 클러스터형 인덱스 키입니다.

라는 말이 바로 그런 의미이죠.

그래서 clustered index가 있는 경우(즉, PK를 clustered index로 잡은 경우) nonclustered index를 이용해서 탐색을 할때는 

 

와 같이 2번의 B-tree 탐색이 발생합니다.(출처: https://www.simple-talk.com/sql/database-administration/brads-sure-guide-to-indexes/ )

어찌됐든 위의 그림에서 nonclustered index의 끝에 Key value, Bookmark로 되어 있는 쌍 중에서 Bookmark에 해당하는 값을 저장하는데 PK가 사용되는데

그까짓 4byte밖에 차이가 나지 않는다고 하더라도 데이터가 천만건이면 40MB의 용량이 쓸데없이 증가하겠고,

그런 nonclustered index가 5개쯤 된다면 nonclustered index의 leaf node에서만 200MB가 쓸데없이 버려지는 용량이 될텐데요...

그에 따른 back up 용량도 늘어나죠... 아... 전 걍 INT 쓸랍니다..

 

 

 

웬지 숙제 내준 다음에 숙제를 해주는 평소의 느낌이.... 쯥... -_-;;

 

우욱님이 2014-03-12 17:35에 작성한 댓글입니다.
이 댓글은 2014-03-12 17:37에 마지막으로 수정되었습니다. Edit

아.. 위 댓글에

넌클러스터드 인덱스

리프노드 등등의 용어를 보고 수많은 검색과 숙지를 했습니다 ㅎ

왠지 숙제를 열심히 한 학생이 된 기분이라고 해야 할까요? ㅎ

친절한 주석과 자료까지... 정말 많은 도움이 됬습니다.

일말의 의심과 고민이 사라진......느낌입니다.

사실.. 사정상 혼자 개발하고 혼자 검수하는 경우가 많은데

개발하면서 늘 느끼는게.. 이게 맞나? 이게 최선인가? 라는 고민을 많이합니다.

다른 경우를 제쳐두고라도.. 이 경우에는

----

그까짓 4byte밖에 차이가 나지 않는다고 하더라도 데이터가 천만건이면 40MB의 용량이 쓸데없이 증가하겠고,

그런 nonclustered index가 5개쯤 된다면 nonclustered index의 leaf node에서만 200MB가 쓸데없이 버려지는 용량이 될텐데요...

----

의 말씀처럼.. 한방에 고민 해결입니다.

거듭 감사드립니다 (__)

 

풀잎님이 2014-03-12 17:52에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6794정적쿼리 질문 또한가지 [1]
상도동
2014-03-17
8267
6793동적정적쿼리 병행사용 [2]
상도동
2014-03-17
8661
6792날짜 출력에 관하여 질문 드려용 [1]
이성원
2014-03-13
8462
6791mssql 에서 채번? PK코드 값을 자동으로 넣고 싶습니다. [4]
풀잎
2014-03-12
12834
6790테이블 데이터 삭제 후 조회. [3]
초보
2014-03-12
8861
6789한 테이블 동시 접근에 관하여 질문 드려요! [4]
이성원
2014-02-28
11436
6787전화번호 번호이동에 따른 전화번호 업데이트 관련 문의입니다. [6]
골프
2014-02-07
9514
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다