ik7122
554
2019-06-11 23:42:09
5
151

MSSQL 인덱스 조각화 관련 질문 드립니다.


 안녕하세요. 현재 DB는 MSSQL을 사용 중 입니다.

약 100만건이 있는 테이블에서 조회를 하니 너무너무 느려서

검색을 하는 도중 인덱스 조각화에 대한 내용을 읽게 되었습니다.

전체 DB에 대해 논리적 조각화 정도를 확인하니 데이터가 수초 단위로 INSERT, UPDATE, DELETE가 일어나는 모든 테이블은 논리적 조각화 정도가 100%에 가까웠습니다.

심지어 6월1일에 만든 테이블(현재 ROW는 3만)조차 인덱스 논리적 조각화 정도가 70~80%가 넘었습니다.

보통 이렇게 자주 INSERT, UPDATE, DELETE가 일어나는 테이블 관리는 어떻게 해야 될까요? 주기적으로 인덱스 리빌드를 하는 건가요?


0
0
  • 답변 5

  • 개나소나고생
    5k
    2019-06-12 08:28:36

    저의 경우는 인덱스 리빌드를 해서 유지보수 했었습니다.

    1
  • 삼식이
    1k
    2019-06-12 09:21:35

    인덱스 리빌드 하기 귀차느면 파티셔닝 테이블로 재구성 하세요.

    1
  • 르매
    560
    2019-06-12 12:57:27 작성 2019-06-12 13:01:10 수정됨

    인덱스를 리빌드하면 두 가지 변화가 생깁니다.

    하나는 인덱스 페이지의 순서가 물리적으로 정렬되고, 둘째로 페이지에 빈 공간이 없이 - fill factor 에 따라 다른데 기본값은 100% - 채워 집니다.

    각각에 어떤 성능적인 장점이 발생하는지 살펴보면..

    1. 페이지의 순서가 물리적으로 완전히 정렬된 상태에서는 테이블을 스캔할 때 랜덤 액세스가  발생하지 않기 때문에 성능이 개선되고

    2. 페이지에 빈 공간이 없이 100%로 채워지면 같은 I/O 당 읽은 레코드의 수가 증가하기 때문에 성능이 개선됩니다. (페이지의 밀도가 높다고 말합니다.)

    자.. 그러면 인덱스 리빌드는 정기적으로 꼭 필요한 작업일까요?

    고려해야할 몇 가지가 있는데요.

    - 페이지의 순서가 정렬되는 것은 SSD에서는 큰 매리트가 없습니다. 랜덤 액세스의 성능이 극단적으로 떨어지는 것은 디스크에서 발생하는 문제이고 원인은 모터로 헤더를 직접 이동시켜서 읽는 방식이기 때문입니다. 반면에 SSD에서는 디스크 같은 구동계 없이 데이터에 액세스하기 때문에 랜덤 액세스로 인한 성능 저하가 심하지 않습니다.

    - 페이지의 밀도를 높이는 일은 SSD와 디스크 모두에게 의미가 있습니다. 하지만 여기에 함정이 있는데 애초에 이 테이블은 왜 조각화가 심한걸까요? 당연한 얘기지만 잦은 INSERT, UPDATE, DELETE 또는 순차적이지 않은 컬럼에 걸린 인덱스, 레코드의 사이즈가 심하게 변하는 UPDATE 같은 것이 원인이 됩니다. 이 얘기를 하는 이유는.. 강제로 페이지 밀도를 높였을 때 이것은 결국은 page split을 유발하고 종합적으로 봤을 때 오히려 성능에 부정적이 영향을 주기 때문입니다. (page split은 오버헤드가 심한 작업입니다.)

    그래서 권고를 드리자면..

    1. Disk 를 사용하고 주기적으로 점검 시간을 가질 수 있다면, 인덱스를 리빌드하세요. (라이브 상황이라면 부하가 적은 시간에 reorganize 하시구요)

    2. 단, fill factor를 명시적으로 설정하시고.. 이 값이 너무 높지 않게 주의하시기 바랍니다. (최적의 값은 테이블이 사용되는 패턴에 따라 다 다르기 때문에 경험적으로 찾아야 합니다.)

    1
  • 개나소나고생
    5k
    2019-06-12 20:25:26

    주관적인 경험상 reorganize 해본경험이 있는데..사실상 무용지물이더라구요..의미가 없더라구요.

    1
  • ik7122
    554
    2019-06-13 14:13:07

    다들 감사드려요~!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.