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 1976 게시물 읽기
No. 1976
인덱스는 주기적으로 업데이트 해줘야 하나요?
작성자
호야
작성일
2005-05-23 18:10
조회수
4,118

테이블의 특정 5개 컬럼에 대하여 인덱스 각각 5개를 만들었습니다.

물론 이 테이블은 insert, delete, update 가 발생할수 있는 테이블이고요

이때 저 만든 5개의 인덱스를 drop index..., create index ... 이런식으로 주기적으로 자주 갱신해줘야 하나요?

아니면 insert나 delete 해도 자동으로 업데이트 되나요? 자동으로 된다면 처음 한번의 인덱스 생성후 따로 관리할 필요가 없겠지요??

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

인덱스 역시 페이지에 기록되는 데이터의 일종이죠..

특별한 하나의 테이블이라고 보면 되지 않을까요..

 

insert, update, delete를 통해서 조각화 현상이 일어나겠죠..

따라서, 시간이 지남에 따라서 어느 정도 효율이 떨어질 수 있겠죠..

 

drop index, create index를 하면 깔끔하게 새로 정리할 수 있지만, 그 동안에는 테이블을 이용할 수 없게되는 단점이 있습니다..

대형 테이블이라면 어느 정도 문제가 있겠지만, 일반적인 기업체의 데이터라면 문제가 없을 겁니다..

 

서버가 한가한 시간에 job를 걸어주면 되겠죠..

데이터베이스 유지 관리 계획을 사용하면 한 큐에 많은 것을 scheduling할 수 있습니다..

 

online을 계속유지해야 한다면, dbcc indexdefrag라는 것을 사용해도 좋을 것입니다..

 

그럼..

길가는 나그네..님이 2005-05-25 21:58에 작성한 댓글입니다. Edit

인덱스 관리 기본 정리


* CLUSTERED 와 NONCLUSTERED index

  CLUSTERED index

 Clustered indexes have one row in sysindexes with indid = 1.
 The pages in the data chain and the rows in them are
 ordered on the value of the clustered index key.
  
 All inserts are made at the point the key value in the
 inserted row fits in the ordering sequence.
  
 Microsoft® SQL Server™ 2000 indexes are organized as B-trees.
 Each page in an index holds a page header followed by index rows.
 Each index row contains a key value and a pointer to either a lower-level page
 or a data row.

 Each page in an index is called an index node.
 The top node of the B-tree is called the root node.
 The bottom layer of nodes in the index are called the leaf nodes.
 The pages in each level of the index are linked together in a doubly-linked list.
 In a clustered index, the data pages make up the leaf nodes. Any index levels
 between the root and the leaves are collectively known as intermediate levels.

 For a clustered index, sysindexes.root points to the top of the clustered index.
 SQL Server navigates down the index to find the row corresponding to a clustered index key.
 To find a range of keys,
 SQL Server navigates through the index to find the starting key value in the range,
 and then scans through the data pages using the previous or next pointers.
 To find the first page in the chain of data pages,
 SQL Server follows the leftmost pointers from the root node of the index.

  인덱스의 구성을 이해하기 앞서 간단한 설명이 필요할 것 같다.
  Page  : 8 KByte 이며, 한번의 쿼리에서 최소 단위이다.
  extent : page * 8 한 인덱스의 기본단위 이다.
  B-Tree : balanced Tree 구조를 말한다. 참고 도서 좀 보기 바람

  Root note : 인덱스의 최상위 노드 Intermediate level 의 주소를 가지고 있다.
  Intermediate level : 리프레벨의 주소를 가지고 있다.
  Leaf nodes/data pages : 직접적인 데이터이다.

  중요한 점은 이런 B-tree 구조와 fillfactor 와 pad_index 를 이해 해야지 page split 왜 일어나며,
  읽기 전용테이블과 읽기 쓰기 삭제가 일어나는  테이블의 fillfactor, pad_index 률이 다르다는 것이다.

  또한 이 fillfactor 가 적으면 검색 속도가 늦어진다. (당연히 extent 들이 많아지니 느려지는것 당연하다.)
  이때의 적절한 퍼센트률을 황금률이라고들 한다.

  읽기 전용 테이블은 fillfactor 100% 나 0%으로 주는 것이다.

  The following table illustrates how the pages of an index are filled up if FILLFACTOR is specified.

 ** FILLFACTOR Intermediate page Leaf page

 0 percent One free entry 100 percent full
 1 - 99 percent One free entry <= FILLFACTOR percent full
 100 percent One free entry 100 percent full


 CREATE CLUSTERED INDEX zip_ind
 ON authors (zip)
 WITH FILLFACTOR = 100

 
 CREATE INDEX au_id_ind
 ON authors (au_id)
 WITH PAD_INDEX, FILLFACTOR = 10

 

  NONCLUSTERED index

 이것은 물리적 정렬이 없는 index 를 말한다. 하나의 테이블에 clustered index 는
 하나만 존재 할 수 있다. 당연히 identity attribute 는 필요에 따라 nonclusterd
 index 로 바꾸어 주어야 한다.

 clustered index 와 비슷한 구조로 되어 있으나 리프레벨에 클러스터드 인덱스의 주소값을
 가지고있다는 것을 기억하기 바란다.
 그러니 Range Query(0개 1개 여러개 의 검색값) 를 할때는 clustered index 를 만들어
 사용하는 것이 바람직 할 것이다. 왜? 데이터는 정렬되어 있으며, 리프레벨은 데이터이다.
 생각해 보라 빠르지 않겠는가?

 nonclusterd index 는 테이블당 200개 이상 만들수 있다. (정확히 기억이 안남)
 만드는것은 좋으나 이것을 만듦으로 인한 storage 사용과 insert delete 의 작업의 느려짐은
 Trade off(이게 좋으면 저건 나빠지는) 관계이니 잘 알아서 황금률을 구하기 바란다.

 하나의 테이블에 nonclusted index 하나 추가는 20% 정도의 용량이 추가되며 clustered index
 는 그보다 약간 작다 이말도 이해가 갈 것이다.

 여기서 또 하나 알아야 할 점은 nonclustered index 가 만들어져 있는 상황에서 clusteded index
 를 만들면 이 nonclustered index 들은 모두 다시 만들어 진다. 또한 clustered index 를 지워도
 nonclustered index 는 다시 만들어 진다. 생각해 보라 nonclustered index 의 리프레벨에
 무엇이 있다고 했는지.

 dbcc 명령을 이용한 index defragmentation 을 해 page split 으로 인한 인덱스의 흐트러짐을 적은
 디비 부하를 가지고 인덱스 조각모음을 할 수 있다.

  point query 는 nonclustered index 를 사용하라

 nonclustered index 와 clustered index 의 속도차이는 거의 없다. 하지만 분명 clustered index
 가 빠르다 용도에 따라 clustered index 를 잘 사용하고 point query 는 nonclustered index 를
 사용하는 것이 옳다.

  FK 를 clustered index 로 사용함을 고려하라

 테이블의 상관관계를 맺는 이 컬럼을 clustered index 로 사용할 것을 적극 고려하는 것이 바람직하다.

  ASC DESC 같은 정렬은 한 방향으로 하도록 한다.

석이님이 2005-05-26 10:29에 작성한 댓글입니다. Edit

dba 의 주요업무중에

백업

인덱스 재작성 혹은 인덱스 조각모음 디비 셔링크

저장프로시져 리컴파일

등이 있죠....

 

뭐 근데 작으면 관리마법사에서 한방에 ^^

 

석이님이 2005-05-31 01:23에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1981답변형(계층형)게시판에서 검색 방법에 대한 문의 [1]
이방은
2005-05-24
3639
1978check 제약조건에 관한 질문입니다. [1]
궁금이
2005-05-24
2252
1977MS-SQL과 MFC 연동후, 쿼리를 날리면 반환값을 어떻게받는지요 [1]
김재호
2005-05-24
4622
1976인덱스는 주기적으로 업데이트 해줘야 하나요? [3]
호야
2005-05-23
4118
1975동적으로 인덱스를 걸수 있을까요? [2]
^^
2005-05-23
1724
1974힌트에 대하여 설명되어 있는 문서좀 있나요? [1]
나그네
2005-05-23
2168
1973저장된 데이터를 변경.... [3]
mook
2005-05-23
2998
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다