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 7126 게시물 읽기
No. 7126
테이블 인덱스 구조 조언좀 부탁드립니다
작성자
남현진(morningtak)
작성일
2018-06-25 17:29:45
조회수
96

본론부터 말하자면

PK가 없는 테이블에 (기본키를 잡지않지만 고유번호는 생성할 생각입니다)

자주 정렬이 일어나는 컬럼 두개를 클러스터인덱스로 만들고,
고유번호로써 사용되는 컬럼(IDENTITY) 하나는 넌클러스터 인덱스로 할 예정입니다.

자주 정렬이 일어나는 두개의 컬럼... 사실 정렬을 안하는게 제일 좋겠지만 그럴수가없을거같아요 ㅠㅠ
억개중 상위 몇개 이런식으로 접근이 많이 할 데이터여서요.

고유번호는 IDENTITY 를 걸어놓음으로써 이미 중복값같은게 들어올리는 없을테니까 문제없어보이네요

제가생각한게 맞는지 모르겠습니다. 고민이 많아서 진전이없네요 ㅋㅋ ㅠ

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

 클러스터 인덱스로 만들

2개 컬럼에 대해 단편화 문제가 없다면

생각하시는 것처럼 해도 될 것 같습니다.

박인호(paerae)님이 2018-06-26 09:56:28에 작성한 댓글입니다.

join도 없고 where도 없는 등이라면 말씀대로 클러스터드 인덱스가 최선일 수 있겠지만 identity를 만드셔야 되는 이유가 join이나 where 등에 사용하시려고 하시는 것은 아닌지...

MS-SQL은 pk를 기준으로 clustered index를 생성하지 않아도 되므로(MySQL의 InnoDB는 허용하지 않지만요) 어지간하면 pk는 만드시는 편이 좋겠습니다.

우욱님이 2018-06-26 11:47:40에 작성한 댓글입니다. Edit

두분 답변감사드립니다 ㅎㅎ
제가 DB를 전문적으로 다루지를 않아서 
밑에는 테이블 구조 이해를 돕고자 작성하였습니다.
 

Table(
 - ID -> IDENTITY
 - Value1
 - Value2 )
Clustered Index (Value1, Value2)
Non Clustered Index (ID)

 

1. SELECT할때 WHERE절에서 ID를 많이 사용함.
2. 정렬된 Value1, Value2를 기준으로 SELECT 하는일이 더 빈번할것으로 예상됩니다.

 

박인호님
제가 DB에 대한 지식이 전무해서..
그냥 컴퓨터공학 책에서 나오는 단편화는 알지만 데이터베이스의 단편화는 어떤 단편화인지 궁금합니다.
어떤경로로해서 구멍이 생기는지.. 그게 DB가 인덱스 관리 도중에 생기는 문제인가요?

 

우욱님
ID값으로 JOIN은 사용을 안하고있어요.
안써도 되는상황이라서요.
하지만 WHERE 절에서 ID 값을 자주사용하는데... 문제될 여지가 많을까요?

 

추가적으로 제가 인터넷을 찾던중...
인덱스 내부 구조상 한쪽으로 데이터가 삽입될때 한쪽으로 치우칠 수 있다는 글을 봤는데 위와같은 구조면 한쪽으로 치우칠거같은데 맞나요??
 

남현진(morningtak)님이 2018-07-09 11:52:50에 작성한 댓글입니다.
이 댓글은 2018-07-09 11:53:01에 마지막으로 수정되었습니다.

페이지 조각화에 대한 설명은 showcontig(앞으로 없어지지만 이해를 위한 글이 제일 많이 튀어나오는 검색어)를 검색하셔서 읽어보시면 됩니다.

 
 
 
SELECT TOP (10) 컬럼들
FROM tbl
ORDER BY value1, value2
;
식의 쿼리와 
 
SELECT 컬럼들
FROM tbl
WHERE ID = 7126
;
식의 쿼리만이 대부분이라면 계획과 같이 index를 잡으면 좋겠습니다만 제가 우려한 경우는
 
SELECT 컬럼들
FROM tbl
WHERE 어떤 조건
ORDER BY value1, value2
;
과 같은 쿼리가 주로 사용된다면 ORDER BY 가 있을지라도 where에 해당하는 조건이
value1에 대한 조건
id에 대한 조건
중에 어느 하나라도 포함하지 않는 경우 where의 처리 때문에 clustered index의 효과를 보기는 커녕 table scan만 할 것을 걱정했습니다.
 
 
삽입으로 인덱스가 치우칠 수 있다는 얘기는 예를 들어 하나의 페이지에 5건의 데이터가 들어간다고 하고 숫자에 index가 잡혀 있고 숫자 순서대로 삽입시
  1. 최초 5건 삽입시
    1. page1: 12345
  2. 1건 추가 삽입시
    1. page1: 123
    2. page2: 456
  3. 2건 추가 삽입시
    1. page1: 123
    2. page2: 45678
  4. 1건 추가 삽입시
    1. page1: 123
    2. page2: 456
    3. page3: 789
와 같이 진행되어 9건 입력시 총 3개의 페이지를 사용하게 되는데 사실 2페이지에
page1: 12345
page2: 6789
와 같이 담을 수 있는 것을 3개 페이지에 담게 되는데 데이터가 많아지면 비효율적이 될 수 있습니다.
더 최악은 저 3페이지 상황에서 2가 10으로, 3이 11로, 4가 12로 update되면 아주 뽕맞은 것 같은 느낌이 날 수 있습니다. ㅋ
 

 

우욱님이 2018-07-11 10:47:54에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
7129mssql 로그인 실패 횟수에 따라 잠금 설정 방법 좀 알려주세요
최키럽
2018-07-05
47
7128MSSQL 로그인 권한 관련 질문입니다.
권한
2018-07-04
55
7127MSSQL VS MARIA [1]
DBA
2018-07-02
76
7126테이블 인덱스 구조 조언좀 부탁드립니다 [4]
남현진
2018-06-25
96
7124조건문에 CASE LIKE 구문을 같이 썼을때 왜 문제일까요? [1]
김태옥
2018-06-12
102
7123안녕하십니까 고수님들 c언어 연동 질문있습니다. [1]
도와주세요
2018-05-09
158
7122열을 행으로 바꾸고 싶습니다. 도와주세요. [2]
왕초보왕초보
2018-04-19
225
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2018 DSN, All rights reserved.
작업시간: 0.069초, 이곳 서비스는
	PostgreSQL v10.4로 자료를 관리합니다