2009-06-04 3 views
4

인덱스 유지 관리 란 무엇이며 어떻게해야합니까? 얼마나 자주해야합니까? 이점은 무엇입니까? 이것은 자주 변경 될 수있는 트랜잭션 테이블과 관련이 있습니다. 모든 DML 작업은 해당 테이블에서 실행됩니다.인덱스 유지 관리

답변

12

색인 유지 관리의 빈도를 제외하고는 Jonathan이 말한 두 번째 항목은 모두 두 번째입니다.

잘 설계된 색인 (예 : GUID 키의 클러스터 된 색인)을 사용하는 경우 실제로는 매일 밤 또는 낮 중에도 수행해야 할 수도 있습니다.

일반적으로, 인덱스 조각화가 5 % 미만이면 모두 정상입니다. 약 5 %에서 약 5 % 사이의 단편화가있는 경우 색인이 30 % 이상 인덱스 조각화가있는 경우

ALTER INDEX (your index name) ON (your table name) REORGANIZE 

, 당신은 완전히 다시 작성해야합니다 : 30 %, 당신은 인덱스 재구성해야 파괴 할 수있는 인덱스를 재 구축

ALTER INDEX (your index name) ON (your table name) REBUILD 

을 - 시간외 근무에서 해보 려구요. 밤 동안. 인덱스 조각화를 결정하기 위해,이 DMV 쿼리를 사용할 수 있습니다에서

:

SELECT 
    t.NAME 'Table name', 
    i.NAME 'Index name', 
    ips.index_type_desc, 
    ips.alloc_unit_type_desc, 
    ips.index_depth, 
    ips.index_level, 
    ips.avg_fragmentation_in_percent, 
    ips.fragment_count, 
    ips.avg_fragment_size_in_pages, 
    ips.page_count, 
    ips.avg_page_space_used_in_percent, 
    ips.record_count, 
    ips.ghost_record_count, 
    ips.Version_ghost_record_count, 
    ips.min_record_size_in_bytes, 
    ips.max_record_size_in_bytes, 
    ips.avg_record_size_in_bytes, 
    ips.forwarded_record_count 
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips 
INNER JOIN 
    sys.tables t ON ips.OBJECT_ID = t.Object_ID 
INNER JOIN 
    sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id 
WHERE 
    AVG_FRAGMENTATION_IN_PERCENT > 0.0 
ORDER BY 
    AVG_FRAGMENTATION_IN_PERCENT, fragment_count 

미셸 Ufford은이를 좋은 자동 index defrag script이 - 추천! 또는 예를 들어 실행할 수있는 SQL Server maintenance plans을 조사해야합니다. 매일 밤 당신의 색인을 정리하십시오.

마크

+0

감사합니다. 처음으로 인덱스를 만들 때 I/O 작업이 없습니까? 그리고 또 다른 한개는 크기에 관해서는, 색인의 크기는 데이터/거래와 함께 성장할 것입니다. 나는 잠시 후 같은 인덱스를 다시 만들었습니다. 크기와 I/O 작업이 줄어들 것입니다. – rmdussa

+0

오 - 인덱스를 만들면 잠재적으로 많은 I/O 작업! 인덱스의 크기는 테이블의 행 수에 따라 달라집니다. 많은 행을 삭제할 때 삭제 된 행에서 이전에 사용 된 공간을 다시 사용할 수 있기 때문에 인덱스를 다시 작성하면 크기가 약간 줄어들 수 있습니다. table times 인덱스의 바이트 수 (인덱스 필드의 합)가 필요합니다. 거기에는 마법이 없습니다. –

+0

<5, > 5 <30 조언과 관련하여 avg_fragmentation_in_percent를 조사해야합니까? 30 대 이상은 어떨까요? 그들을 재건 하는가? –

1

일반적으로 DBMS는 색인을 자동으로 처리하므로 색인이 계속 작동합니다. 그러나 삽입, 삭제 및 업데이트 작업이 충분할 경우 색인에 개선의 여지가 있다고 생각할 수 있습니다. 즉, 인덱스를 삭제하고 다시 작성하면 결과 인덱스가 수정 된 인덱스보다 작고 효율적입니다. 그리고 궁극적으로 인덱스가 작을수록 I/O 작업이 적어지고 I/O 작업은 계산보다 훨씬 비쌉니다.

이 내가 잘 모르는 것 같아요 SQL Server에 대한 구체적인 답변이 될 수 있지만 :

  • 인덱스 유지 보수는 인덱스가 더 잘 수행하게하는 과정이 될 것입니다.
  • 인덱스 유지 관리를 수행하는 한 가지 방법은 인덱스를 삭제하고 다시 작성하는 것입니다.
  • 또 다른 방법은 인덱스를 다시 작성해야하는 방식으로 테이블을 변경하는 것입니다 (클러스터링, 아마도).
  • 매우 자주 할 필요는 없지만 주로 MS SQL Server의 품질과 인덱스 처리 방식에 따라 달라집니다. 나는 그것이 적어도 적절할 것으로 기대합니다. 어쩌면 한 달에 한 번, 편리한 다운 타임이 있다면 가능할 것입니다. 그렇지 않으면, 전혀 그렇지 않은 경우가 적습니다.
  • 인덱스가 사용하는 공간이 적고 인덱스를 사용하면 성능이 향상됩니다.
+0

인덱스를 처음 만들 때 I/O 작업이 없습니까?그리고 또 다른 한개는 크기에 관해서는, 색인의 크기가 데이터/거래와 함께 성장할 것입니다. 나는 같은 인덱스를 삭제하고 다시 만들었습니다. 크기와 I/O 작업이 줄어들 것입니다. – rmdussa

+0

테이블에 10,000,000 개의 레코드가있는 경우 당신은 인덱스를 만들면 I/O가있게됩니다. 0 레코드가 있으면 I/O가 거의 없습니다. 일부 레코드를 삭제하고 다른 레코드를 추가하고 레코드의 전체 채우기를 거의 일정하게 유지하면 인덱스에 어떤 변화가 생기지 만 일반적으로 부드럽게 증가합니다. 어떤 패턴은 다른 패턴보다 나쁩니다. 예를 들어, 단조롭게 증가하는 식별 C 럼이 있고 맨 끝에서 항상 h 제하고 하이 엔드에서 추가하면 인덱스 구조의 균형을 i 업시킬 수 있습니다. 그러나 저는 MS SQL Server 전문가가 아닙니다. 저의 의견에 동의하지 않습니다. –

관련 문제