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 2534 게시물 읽기
No. 2534
테이블구성 및 index에 대해서
작성자
김지환(iw2bfree)
작성일
2005-12-07 10:52
조회수
4,350

OS : Microsoft Windows 2000 Server / Advanced Server
SQL : Microsoft SQL Server 2000 Standard / Enterprise Edition

어플리케이션과 Webr과 연동하는 ASP를 운영중인데요.

요즘 DB연동하는 부분이 속도가 느려져서, 개선을 할려고 합니다.

현재 구조는

어플리케이션 연동 중 임시 데이터를 저장하는 부분(worktemp), 완료되면 통계를 위한
데이터를 저장하는 부분(worklog)로 구성되어있습니다.


A.테이블 구성은

1.worktemp
- 어플리케이션과 연동 임시데이터, 지워도 관계없음
- 항상 guid로 검색함
guid varchar(50) pk, clustered index
status varchar(6)
.
.

2.worklog
- 통계 및 사후 조회필요
guid varchar(50) pk, clustered index
waitname varchar(50)
id varchar(2)
.
.
index는 mssql이 기본적으로 PK에 잡아주는 것만 잡혀있고 별도의 인덱스는 걸지 않았습니다.

3.report : 보고서
guid varchar(50) pk, clustered index


B.DB연동 절차는

1.어플리케이션이 구동되면서 worktemp에 insert
2.구동중 worktemp를 update(key=guid),
report insert
3.완료되면 worktemp-> worklog로 insert(key=guid)


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

궁금한 점은 아래와 같습니다.

1.첫번째는 1번테이블을 어플리케이션이 종료되면 지울까 하다가, 매번 쓰고 지우고 하면 서버에 좋지 않을것 같아서,

일정기간에 한번씩 임의로 삭제할려고 지우지 않는 방법을 택했습니다. 궁금한 것은 저 테이블에 하루에 만건정도

데이터를 쓰고 지우고 해도 별 문제가 안되는 지요.

만약 문제가 되서 지금처럼 임시데이터를 지우지 않는 상태로 놔둔다면 개선할려면(인덱스튜닝) 어떤 식으로 해야할
지요.

2.두번째 통계및 사후관리를 위한 worklog에 대해서 입니다.
2번 테이블에서 guid가 index로 잡혀있는데, Clustered Index는 20byte를 초과하면
성능이 떨어진다고 들었는데, 이부분을 개선할려면, indentity field를 추가해서 이 idx에 index를 잡아주는 것이좋을지
요. 아니면 이대로 두고 추가로 waitname, id 등에 인덱스를 추가해도 될른지요
2번테이블은 3번테이블과 guid로 조인해서 검색하기도 하고,
startdate, enddate로 구간검색
유저아이디, 이름으로 검색을 주로 합니다.


----------------------------------------------
제가 생각하고 있는 문제 개선방법을 요약하면

1.worktemp
- 어플리케이션 시작시 생성된 row를 종료시 삭제한다.

2.worklog
- idx(identity)를 추가해서 guid 대신 PK, Clustered Index로 잡는다.


이렇게 하면 될지 싶습니다.

제가 뭔가 잘못생각하고 있다면 조언 부탁드립니다.

그럼 모두 부자되세요..





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

참고가 될지 모르지만..

 

1. 매번 쓰고 지우면 서버에 좋지 않을 것 같아서.. => 상관 없어보입니다.. ^^*

지우지 않고 놔 두더라도 상관 없어보입니다.. worktemp에 pk이외의 index가 없다면, index tuning 할 이유가 없습니다..

 

2. worklog에 index 추가 문제..

index는 기본적으로 clustered pk를 참조합니다.. 따라서, 현재의 pk(clustered pk)가 각 인덱스에 참조가 될테니, 가능한 한 그 크기가 적은 것이 좋겠죠..

 

현재의 pk를 non-clustered pk로 변경하시면 될 것 같습니다.. 그리고, 필요한 index를 만들어서 사용하시면 되겠죠..

명시적으로 clustered pk를 지정하지 않으면, sql server에서 내부적으로 적용시킵니다.. 다른 index를 위해서 쓰지도 않을 identity 칼럼을 만드는 것은 별로 좋지 않아보이네요..

 

참고로, clustered index가 20bytes를 초과하면 성능이 떨어진다기 보다는, 20bytes를 초과한 상태에서 다른 index가 존재한다면 성능이 떨어지는 것으로 봐야 정확할 것 같아보이네요..

 

그럼..

길가는 나그네..님이 2005-12-07 21:59에 작성한 댓글입니다. Edit

댓글주신것 감사드립니다. ^^

추가로 궁금한것 물어도 될까요?

1번테이블의 인덱스튜닝을 생각했던 것은 속도가 느린관계였고, 삭제하지않을 경우 추가적인 인덱스를 잡을까 고려중이었습니다. 이테이블은 삭제하는식으로처리할것이므로 문제가 안될것같습니다.

 

문제는 2번테이블인데요. guid를 nonclustered index로 잡으시라고 했는데 이테이블에서 unique한 값은 guid뿐이거든요. clustered index는 반드시 하나 존재해야하는걸로 아는데요..그러기 위해서 identity field를 추가할려고 했던 것인데 추가없이 가능한지요?

 

 

김지환님이 2005-12-07 22:25에 작성한 댓글입니다. Edit

clustered index는 특별히 지정해 주지 않으셔도 물리적으로는 존재합니다..

 

guid는 pk로 그대로 잡으시면 됩니다.. 다만 non-clustered pk로 잡으시면 됩니다..

 

그럼..

길가는 나그네..님이 2005-12-08 11:29에 작성한 댓글입니다. Edit

성능이 떨어지는 이유는 석이님의 설명 그대로입니다.. 석이님 설명대로 resource를 효율적으로 사용못하는 것 때문이죠..

 

제가 아는 한도 내에서 설명을 하자면,

clustered index가 data를 가르키고 있겠죠..

그런데, user가 clustered index를 지정하지 않으면 sql server가 clustered index를 내부적으로 가지게 됩니다.. (쉽게 주소를 가진다고 보면 되겠죠..) 즉, 모든 index는 leaf에서 최종 data를 가르키는 clustered index의 정보를 가지고 있다고 보면 됩니다..

user가 특별히 clustered index를 지정하지 않았다면, 모든 non-clustered index는 sql server가 내부적으로 가진 clustered index(주소)를 가지게 되는 것이죠..

 

참고로  non-clustered index는 249개(?)까지 가질 수 있으니, 그것들이 모두 data를 가리킬 수는 없겠죠.. ^^*

 

그럼..

길가는 나그네..님이 2005-12-08 12:48에 작성한 댓글입니다.
이 댓글은 2005-12-08 12:49에 마지막으로 수정되었습니다. Edit

내부적으로 클러스터 인덱스를 만든다고 하지는 않았는데요..

다만, 내부적으로 clustered index 정보를 가진다고 했죠..

 

그냥 존재하는 (쉽게.. 주소) 정보를 가지는 것일 뿐입니다.. ^^*

 

그럼..

길가는 나그네..님이 2005-12-08 12:56에 작성한 댓글입니다.
이 댓글은 2005-12-08 12:57에 마지막으로 수정되었습니다. Edit

^^*

 

석이님, 이제 sql 고수님이 되신듯.. ^^*

 

지난 번에 재밌는 문제 같이 풀어봤었죠..

석이님이 제출하시고, 석이님이랑 셋이서 답안을 만들어 봤었던 것 기억이 있는데요.. 채점(?)도 석이님이 하셨죠.. 아마도.. ^^*

 

그럼, 좋은 하루 되세여~

꾸벅..

길가는 나그네..님이 2005-12-08 13:03에 작성한 댓글입니다. Edit

길가는나그네님, 석이님 댓글 감사드립니다.

Clustered index가 반드시 하나 존재해야된다고 잘못알고있어서 쓸데없는 고민을 했네요.

두분 덕분으로

guid -> NonClustered Index로 하는것으로 해결될것같습니다. Index 개념도 더 이해할 수 있었구요.

쓸데없이 identity field 만들고, 이전하고 하는 문제를 고민했네요.

 

감사드립니다.

좋은하루 되세요.

김지환님이 2005-12-08 13:07에 작성한 댓글입니다. Edit

저도 뵙고 싶은데.. 좀 힘들것 같네요..

 

제가 바깥에 나와 있어서요.. ^^;;

길가는 나그네..님이 2005-12-08 13:48에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
2537으하하~ 조때따~ㅋㅋㅋ [1]
아침에농약한잔
2005-12-08
2452
2536[질문]구분자를 잘라 테이블 변수에 저장하기
창밖의그녀
2005-12-07
2282
2535달력 테이블 만들기 [2]
전융
2005-12-07
8018
2534테이블구성 및 index에 대해서 [8]
김지환
2005-12-07
4350
2533access질문 입니다. select [2]
이재기
2005-12-06
3077
2532파라미터가 있는 Stored Procecdure
김정이
2005-12-06
2049
2531multiple table delete [4]
진석
2005-12-06
2270
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다