Resolve index fragmentation by reorganizing or rebuilding indexes

  • 03/19/2020
  • 21 minutes to read
    • p
    • j
    • M
    • M
    • d
    • +11

Applies to: 네SQL 서버(지원되는 모든 버전) 네Azure SQL 데이터베이스네Azure SQL 관리 인스턴스네Azure 냅 분석네병렬 데이터 웨어하우스가

이 문서에서 설명하는 방법을 지수는 조각이 발생하고 설명합에 미치는 영향을 쿼리 성능이 저하됩니다. 일단 당신의 양을 결정하는 조각 존재하는 인덱스에 대해할 수 있는 조각에는 인덱스에 의해 하나 재구성 또는 인덱스를 다시 작성하여 인덱스 Transact-SQL 을 실행 명령에서 당신의 선택의 도구를 사용하여 SQL 서버 관리 Studio.

지수는 조각 개요

What is 지수는 조각과는 그것에 대해 걱정:

  • 조각 존재하는 경우 인덱스 페이지가 있다는 논리적 순서에 인덱스,키 값을 기준으로 인덱스의 일치하지 않는 물리적 순서 내부의 인덱스 페이지입니다.
  • 데이터베이스 엔진이 자동으로 수정할 때마다 인덱스를 삽입 업데이트하거나 삭제 작업은 기본 데이터입니다. 예를 들어 테이블에 행을 추가하면 rowstore 인덱스의 기존 페이지가 분할되어 새 키 값을 삽입할 공간이 생길 수 있습니다. 시간이 지남에 따라 이러한 수정으로 인해 인덱스의 정보가 데이터베이스에 흩어질 수 있습니다(조각화). 조각 존재하는 경우 인덱스 페이지가 있다는 논리적 순서에 따라 키 값이 일치하지 않는 물리적 순서 내부의 데이터 파일이 있습니다.
  • 크게된 인덱스를 쿼리 성능이 저하될 수 있습기 때문에 추가 I/O 를 찾는 데 필요한 데이터를 인덱스 포인트입니다. I/O 가 많을수록 특히 스캔 작업이 관련된 경우 응용 프로그램이 느리게 응답하게됩니다.

를 검출하는 금액의 조각

첫 번째 단계에서 결정되는 인덱스 조각 모음 방법을 사용하여 분석하는 인덱스의 정도를 결정하는 단편화. Rowstore 인덱스와 columnstore 인덱스에 대해 조각화를 다르게 감지합니다.

참고.

특별하게 검토하는 것이 중요하 index 또는 힙 조각 후에,대량의 데이터가 삭제됩니다. 힙의 경우 업데이트가 자주 발생하는 경우 전달 레코드의 확산을 피하기 위해 조각화를 검토해야 할 수도 있습니다. 힙에 대한 자세한 내용은 힙(클러스터 된 인덱스가없는 테이블)을 참조하십시오.

sys 를 사용하여 rowstore 인덱스

의 조각화 감지.dm_db_index_physical_stats,검색할 수 있습니다 조각에 특정 지 모두에서 인덱스 테이블이나 인덱스보기 모든 인덱스는 데이터베이스에서,또는 인덱스에서 모든 데이터베이스가 있습니다. 분할된 인덱스의 경우 sys.dm_db_index_physical_stats 는 각 파티션에 대한 조각화 정보도 제공합니다.

sys.dm_db_index_physical_stats 에 의해 반환 된 결과 집합에는 다음 열이 포함됩니다:

Column Description
avg_fragmentation_in_percent 퍼센트의 논리적인 조각(의 기 위해 페이지를 인덱스에서).
fragment_count 조각의 수를(육체적으로 연속 잎 페이지)에 인덱스입니다.
avg_fragment_size_in_pages 의 평균 수 페이지에서 한 조각에서는 인덱스입니다.

조각화 수준을 알려져있다,다음 테이블을 사용하여 결정한 가장 좋은 방법을 제거하는 단편화:지수를 재구성 또는 인덱스입니다.

avg_fragmentation_in_percent value Corrective statement
> 5% and < = 30% 1 ALTER INDEX REORGANIZE
> 30% 1 ALTER INDEX REBUILD WITH (ONLINE = ON) 2

1 These values provide a rough guideline for determining the point at which you should switch between iv 나는 이것이 어떻게 작동하는지 잘 모르겠습니다. 그러나 실제 값은 사례마다 다를 수 있습니다. 환경에 가장 적합한 임계 값을 결정하기 위해 실험하는 것이 중요합니다.

경우,예를 들어,주어진 인덱스는 주로 사용되는 검사 작업을 제거하는 단편화 성능을 향상시킬 수 있습의 이러한 작업입니다. Seek 작업에 주로 사용되는 인덱스의 경우 성능 이점이 눈에 띄지 않을 수 있습니다.
마찬가지로 제거하는 단편화에 힙(이 없는 테이블의 클러스터 지수)은 특히 유용한 인덱스 검사 작업을,하지만 효과가 거 검색 작업입니다.

2 인덱스 재 구축은 온라인 또는 오프라인으로 실행할 수 있습니다. 색인을 재구성하는 것은 항상 온라인으로 실행됩니다. 재구성 옵션과 유사한 가용성을 달성하려면 온라인으로 인덱스를 다시 작성해야합니다. 자세한 내용은 온라인 색인 및 색인 작업 수행을 참조하십시오.

인덱스와 조각화의 5%미만이 필요하지 않습을 실행하기 때문에 혜택을 제거에서 같은 작은 금액의 조각은 거의 항상을 시도하던 한 여인을 구하게 되고 CPU 비용이 발생하는 재구성 또는 인덱스를 다시 작성합니다. 또한 작은 rowstore 인덱스를 재구성하거나 재구성하면 일반적으로 실제 조각화가 감소하지 않습니다.최대,및 포함,SQL Server2014(12.x),sql Server 데이터베이스 엔진은 혼합 익스텐트를 사용하여 공간을 할당합니다. 따라서 작은 인덱스의 페이지는 때때로 혼합 익스텐트에 저장됩니다. 혼합 익스텐트에서 공유하는 여덟 개체므로,조각에는 작은 인덱스가 줄어들지 않을 수 있습을 재구성 또는 재건니다. Rowstore 인덱스 재구성에 관련된 고려 사항도 참조하십시오. 익스텐트에 대한 자세한 내용은 페이지 및 익스텐트 아키텍처 가이드를 참조하십시오.

를 검출하는 분열의 인덱스 테이블

를 사용하여 sys.dm_db_column_store_row_group_physical_stats 확인할 수 있습의 백분율 삭제된 행을 인덱스에서는 합리적인 측정에 대한 조각에서 행 그룹의 데이터베 index. 이 정보를 사용하여 계산하는 분열에 특정 지 모든 인덱스 테이블에,모든 인덱스는 데이터베이스에서,또는 인덱스에서 모든 데이터베이스가 있습니다.

결과 설정에 의해 반환되는 sys.dm_db_column_store_row_group_physical_stats 다음과 같은 열이 포함되어 있습니다:

Column Description
total_rows 수의 행 물리적 저장된 행에 있는 그룹이다. 압축된 행 그룹의 경우 삭제됨으로 표시된 행이 포함됩니다.
deleted_rows 의 행 수를 물리적으로 저장된 압축 줄 그룹을 삭제하도록 표시됩니다. 델타 저장소에 있는 행 그룹의 경우 0 입니다.

이 정보를 사용하여 반환을 계산하는 인덱스는 분열을 사용하여 이식:

100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)

후 도 인덱스의 조각화 알려져있다,다음 테이블을 사용하여 결정한 가장 좋은 방법을 제거하는 단편화:지수를 재구성 또는 인덱스입니다.

computed fragmentation in percent value Applies to version Corrective statement
> = 20% SQL Server 2012 (11.x) and SQL Server 2014 (12.x) ALTER INDEX REBUILD
> = 20% Starting with SQL Server 2016 (13.x) ALTER INDEX REORGANIZE

을 확인하는 분열의 아스템 뷰 지수 Transact-SQL 을 사용하여

다음 예제를 찾은 평균 단편화 비율의 모든 indexesHumanResources.EmployeeAdventureWorks2016데이터베이스입니다.

SELECT a.object_id, object_name(a.object_id) AS TableName, a.index_id, name AS IndedxName, avg_fragmentation_in_percentFROM sys.dm_db_index_physical_stats (DB_ID (N'AdventureWorks2016_EXT') , OBJECT_ID(N'HumanResources.Employee') , NULL , NULL , NULL) AS aINNER JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;GO

이전 문은 다음과 유사한 결과 집합을 반환합니다.

object_id TableName index_id IndexName avg_fragmentation_in_percent----------- ------------ ----------- ----------------------------------------------------- ------------------------------1557580587 Employee 1 PK_Employee_BusinessEntityID 01557580587 Employee 2 IX_Employee_OrganizationalNode 01557580587 Employee 3 IX_Employee_OrganizationalLevel_OrganizationalNode 01557580587 Employee 5 AK_Employee_LoginID 66.66666666666671557580587 Employee 6 AK_Employee_NationalIDNumber 501557580587 Employee 7 AK_Employee_rowguid 0(6 row(s) affected)

자세한 내용은 sys.dm_db_index_physical_stats 를 참조하십시오.

을 확인하는 분열의 인덱스 테이블을 사용하여 Transact-SQL

다음 예제를 찾은 평균 단편화 비율의 모든 indexesdbo.FactResellerSalesXL_CCIAdventureWorksDW2016데이터베이스입니다.

SELECT i.object_id, object_name(i.object_id) AS TableName, i.index_id, i.name AS IndexName, 100*(ISNULL(SUM(CSRowGroups.deleted_rows),0))/NULLIF(SUM(CSRowGroups.total_rows),0) AS 'Fragmentation'FROM sys.indexes AS i INNER JOIN sys.dm_db_column_store_row_group_physical_stats AS CSRowGroups ON i.object_id = CSRowGroups.object_id AND i.index_id = CSRowGroups.index_idWHERE object_name(i.object_id) = 'FactResellerSalesXL_CCI'GROUP BY i.object_id, i.index_id, i.nameORDER BY object_name(i.object_id), i.name;

이전 문은 다음과 유사한 결과 집합을 반환합니다.

object_id TableName index_id IndexName Fragmentation----------- --------------------------- ----------- ------------------------------- ---------------114099447 FactResellerSalesXL_CCI 1 IndFactResellerSalesXL_CCI 0(1 row(s) affected)

체크인 지수는 조각을 사용하여 SQL 서버 관리 Studio

참고.

Management Studio 를 사용할 수 없습을 계산하는 분열의 인덱스 테이블에서 SQL 서버가 사용할 수 없습니다 계산하는 분열의 인덱스 Azure SQL 데이터베이스에서. 앞의 Transact-SQL 예제를 사용하십시오.

  1. Object Explorer 에서 인덱스의 조각화를 확인할 테이블이 포함된 데이터베이스를 확장합니다.
  2. 테이블 폴더를 확장합니다.
  3. 인덱스의 조각화를 확인하려는 테이블을 확장합니다.
  4. 인덱스 폴더를 확장합니다.
  5. 조각화를 확인하려는 색인을 마우스 오른쪽 단추로 클릭하고 속성을 선택하십시오.
  6. 페이지 선택에서 조각화를 선택합니다.

다음에 관한 정보를 열람할 수 있는 조각 페이지:

Value Description
페이지의 충만 나타내는 평균의 충만 인덱스 페이지 으로 백분율입니다. 100%는 색인 페이지가 완전히 가득 찼음을 의미합니다. 50%는 평균적으로 각 인덱스 페이지가 절반으로 가득 차 있음을 의미합니다.
총 조각화 논리적인 조각화 비율입니다. 이는 순서대로 저장되지 않은 색인의 페이지 수를 나타냅니다.
평균 행 크기 리프 수준 행의 평균 크기입니다.
깊이 의 수준에 포함하여 인덱스 리프 수준입니다.
전달된 레코드 레코드 수가 있는 힙 앞으로 포인터를 다른 데이터를 위치에 있습니다. (이 상태는 원래 위치에 새 행을 저장할 공간이 충분하지 않을 때 업데이트 중에 발생합니다.)
령 행 의 행 수를 삭제하도록 표시되어 있지만 아직 제거됩니다. 서버가 바쁘지 않을 때 이러한 행은 정리 스레드에 의해 제거됩니다. 이 값에는 뛰어난 스냅샷 격리 트랜잭션으로 인해 유지되는 행이 포함되지 않습니다.
인덱스 유형 인덱스의 유형입니다. 가능한 값은 클러스터형 인덱스,비클러스터형 인덱스 및 기본 XML 입니다. 테이블은 힙(인덱스 제외)으로 저장할 수도 있지만이 인덱스 속성 페이지를 열 수 없습니다.
리프 수준 행 리프 수준 행 수입니다.
최대 행 크기 최대 잎은 수준의 행은 크기입니다.
최소 행 크기 최소 잎은 수준의 행은 크기입니다.
페이지 총 수의 데이터 페이지입니다.
파티션 ID 인덱스를 포함하는 b-트리의 파티션 ID 입니다.
령 버전 행 레코드 수있는 보유되어지로 뛰어난 스냅샷 격리는 트랜잭션이 있습니다.

모음 다시 작성하여 인덱스 또는 재구성 index

을 조각 조각난 인덱스를 사용하여 다음 방법 중 하나:

  • 인덱스 개편
  • 인덱스 재작성

참고.

한 분할된 인덱스 파티션에서 방식을 사용할 수 있습니다 다음 방법 중 하나에서 전체 색인 또는 단일 파티션의 인덱스입니다.

인덱스 재구성

인덱스 재구성은 최소한의 시스템 리소스를 사용하며 온라인 작업입니다. 이것은 장기 차단 테이블 잠금하지 않은 개최고를 쿼리하거나 업데이트를 기본 테이블을 계속할 수 있는 동안ALTER INDEX REORGANIZE트랜잭션이 있습니다.

  • 대스템 뷰 인덱스,데이터베이스 엔진 또 리프 수준의 클러스 및 인덱스 테이블과 전망을 물리적으로 재정렬 리프 수준에 맞게 페이지의 논리적 순서 리프 노드(왼쪽에서 오른쪽). 또한 재구성하면 색인의 채우기 계수 값을 기준으로 색인 페이지가 압축됩니다. 채우기 요인 설정을 보려면 sys 를 사용하십시오.색인. 구문 예제는 예제:Rowstore 재구성 을 참조하십시오.

  • 때 사용하여 인덱스 테이블,델타 저장 끝낼 수 있습니다으로 여러 작은 그룹 삽입한 후 업데이트 및 삭제하는 데이터이다. 를 재구성하는 인덱스 테이블의 세력의 모든 그룹으로 테이블,그리고 다음을 결합 그룹으로 적은 그룹으로 더 많은 행이 있습니다. 재구성 작업은 columnstore 에서 삭제된 행도 제거합니다. 처음에 재구성하면 데이터를 압축하기 위해 추가 CPU 리소스가 필요하므로 전체 시스템 성능이 저하 될 수 있습니다. 그러나 데이터가 압축 되 자마자 쿼리 성능이 향상됩니다. 구문 예제는 예제:ColumnStore 재구성 을 참조하십시오.

인덱스 재 구축

인덱스 재 구축은 인덱스를 삭제하고 다시 만듭니다. 의 유형에 따라 지수 및 데이터베이스 엔진 버전을 다시 작업을 수행할 수 있습니다 온라인 또는 오프라인입니다. T-SQL 구문을 참조하십시오 ALTER INDEX 재구축

  • 대스템 뷰 인덱스를 재 구축,제거한 조각,회수하여 디스크 공간을 압축하면 페이지에 따라 지정 또는 기존인 설정을 제약 조건의 영향을 받지 않는 인덱스에서 행인접 페이지입니다. ALL가 지정되면 테이블의 모든 인덱스가 삭제되고 단일 트랜잭션에서 다시 작성됩니다. 외래 키 제약 조건은 사전에 삭제할 필요가 없습니다. 때 인덱스를 가진 128extent 나 이상의 다시 작성,데이터베이스 엔진을 연기하는 실제 페이지의 취소는 해당과 관련된 잠금,후까지 거래가한다. 구문 예제는 예제:Rowstore 재구성 을 참조하십시오.

  • 에 대한 인덱스 테이블,재건을 제거한 조각,이동한 모든 행하도록 지정합니다.,그리고 회수하여 디스크 공간을 물리적으로 삭제된 행을 논리적으로 테이블에서 삭제됩니다.

    SQL Server2016 시작(13.x),재건하도록 지정합니다.인덱스는 일반적으로 필요하지 않기 때문REORGANIZE수행의 요점이 다시에서 배경으로 온라인 작업입니다.

    구문 예제는 예제:ColumnStore rebuild 를 참조하십시오.

권한

에는 테이블 또는 뷰에 대한ALTER권한이 필요합니다. 사용자의 구성원이어야에서 다음 중 하나 이상의 역할:

  • 하여 데이터베이스 역할 1
  • 에 대한 데이터베이스 역할
  • 버 서버 역할

1db_ddladmin 데이터베이스 역할은 적어도 있습니다.

제거를 분열을 사용하여 SQL 서버 관리 Studio

를 재구성 또는 재건하는 지수

  1. 개체 탐색기에서,데이터베이스를 확장하는 테이블을 포함할을 재구성하는 인덱스입니다.
  2. 테이블 폴더를 확장합니다.
  3. 인덱스를 재구성하려는 테이블을 확장합니다.
  4. 인덱스 폴더를 확장합니다.
  5. 재구성하려는 색인을 마우스 오른쪽 버튼으로 클릭하고 재구성을 선택하십시오.
  6. 인덱스 재구성 대화 상자에서 올바른 인덱스가 재구성 할 인덱스 그리드에 있는지 확인하고 확인을 클릭하십시오.
  7. 대형 개체 열 데이터 압축 확인란을 선택하여 LOB(large object)데이터가 포함된 모든 페이지도 압축되도록 지정합니다.
  8. 확인을 클릭합니다.

을 재구성하는 모든 인덱스 테이블

  1. 개체 탐색기에서,데이터베이스를 확장하는 테이블을 포함할을 재구성 인덱스입니다.
  2. 테이블 폴더를 확장합니다.
  3. 인덱스를 재구성하려는 테이블을 확장합니다.
  4. 인덱스 폴더를 마우스 오른쪽 버튼으로 클릭하고 모두 재구성을 선택하십시오.
  5. 인덱스 재구성 대화 상자에서 올바른 인덱스가 재구성 할 인덱스에 있는지 확인하십시오. 재구성 할 인덱스에서 인덱스를 제거하려면 그리드,인덱스를 선택한 다음 삭제 키를 누릅니다.
  6. 대형 개체 열 데이터 압축 확인란을 선택하여 LOB(large object)데이터가 포함된 모든 페이지도 압축되도록 지정합니다.
  7. 확인을 클릭합니다.

을 재건하는 지수

  1. 개체 탐색기에서,데이터베이스를 확장하는 테이블을 포함할을 재구성하는 인덱스입니다.
  2. 테이블 폴더를 확장합니다.
  3. 인덱스를 재구성하려는 테이블을 확장합니다.
  4. 인덱스 폴더를 확장합니다.
  5. 재구성하려는 인덱스를 마우스 오른쪽 단추로 클릭하고 다시 작성을 선택하십시오.
  6. 에서 다시 작성 인덱스 대화 상자인지 확인하는 올바른 인덱스는 인덱스에 재건되어야 그리드 및 확인을 클릭합니다.
  7. 대형 개체 열 데이터 압축 확인란을 선택하여 LOB(large object)데이터가 포함된 모든 페이지도 압축되도록 지정합니다.
  8. 확인을 클릭합니다.

파편을 제거하 Transact-SQL 을 사용하여

참고.

에 대한 더 많은 예제에 대해 Transact-SQL 을 사용하여 빌드하거나 재구성 인덱스를 참조하십시오 ALTER INDEX 예:인덱스 테이블 및 변경 지수는 예:스템 뷰 인덱스입니다.

를 재구성화 지수

다음 예제를 재구성하는IX_Employee_OrganizationalLevel_OrganizationalNodeHumanResources.EmployeeAdventureWorks2016데이터베이스입니다.

ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;

다음 예제를 재구성하는IndFactResellerSalesXL_CCIdbo.FactResellerSalesXL_CCIAdventureWorksDW2016데이터베이스입니다.

-- This command will force all CLOSED and OPEN rowgroups into the columnstore.ALTER INDEX IndFactResellerSalesXL_CCI ON FactResellerSalesXL_CCI REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

을 재구성하는 모든 인덱스 테이블

다음 예에서 모든 재구성 인덱스에는HumanResources.EmployeeAdventureWorks2016데이터베이스입니다.

ALTER INDEX ALL ON HumanResources.Employee REORGANIZE;

다시 작성하는 조각 index

다음 예는 다시 작성하는 단일 인덱스에는EmployeeAdventureWorks2016데이터베이스입니다.

ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;

을 재건하에 있는 모든 인덱스 테이블

다음 예는 다시 작성한 모든 인덱스 테이블과 연결된AdventureWorks2016ALL키워드를 사용합니다. 세 가지 옵션이 지정됩니다.

ALTER INDEX ALL ON Production.ProductREBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);

자세한 내용은 ALTER INDEX(Transact-SQL)를 참조하십시오.

자동 인덱스 및 통계 management

활용 솔루션을 같이 적응 인덱스 Defrag 자동 관리 지수는 조각 및 통계를 업데이트한 하나 이상의 데이터베이스가 있습니다. 이 절차가 자동으로 선택할지 여부를 재 구축하거나 재구성하는 인덱스에 따라 그 조각화 수준이 다른 매개 변수 및 통계를 업데이트와 함께 선형적 임계값입니다.

고려 사항 특정을 재건에스템 뷰 indexes

재건에 이러 인덱스가 자동으로 다시 작성하는 모든이터 인덱스를 참조하는 클러스터링을 키우 논리적 또는 물리적 식별자가 포함된 인덱스 레코드를 변경해야합니다.

다음 시나리오는 테이블의 모든 rowstore 비 클러스터형 인덱스를 자동으로 다시 작성하도록 강제합니다:

  • 만들기 클러스터 인덱스 테이블
  • 제거 인덱스는 원인이블로 저장하는 것이 힙
  • 변경하는 클러스터링을 키거나 포함되는 열 제외

다음과 같은 시나리오를 필요로하지 않는 모든스템 뷰는 인덱스를 자동으로 재건에서 테이블:

  • 다시 작성한 클러스터 지수
  • 재건하는 고유하지 않는 클러스터 지수
  • 변경하는 스키마가 지수, 적용과 같은 분할 계획을 인덱스로 이동하거나 인덱스를 다른 그룹

중요

인덱스는 수 없이 재구성 또는 재건되는 경우에 그룹에 위치하는가 오프라인 또는 설정을 읽기 전용입니다. 을 때는 키워드는 모든 지정하고 하나 이상 인덱스가 오프라인 또는 읽기 전 그룹,문은 실패합니다.

인덱스 재구성이 발생하는 동안 물리적 미디어에는 인덱스의 두 복사본을 저장할 수있는 충분한 공간이 있어야합니다. 재구성이 완료되면 데이터베이스 엔진이 원래 인덱스를 삭제합니다.

ALLALTER INDEX성명,관계형 인덱스는 모두 클러스터 및 클러스터와 XML 인덱스 테이블에 다시 구성됩니다.

고려 사항은 다시 작성 인덱스 테이블

를 다시 작성할 때보다 많은 메모리가 필수 데이터베이스 엔진 모든 데이터를 읽고서 원본 테이블을 포함하여 인덱스 델타에 저장합니다. 데이터를 새 행 그룹으로 결합하고 행 그룹을 columnstore 로 압축합니다. 데이터베이스 엔진은 테이블에서 논리적으로 삭제된 행을 물리적으로 삭제하여 columnstore 를 조각 모음합니다. 삭제된 바이트는 디스크에 회수됩니다.

참고.

재구성하는 인덱스 테이블 Management Studio 를 사용하여 결합합니다 압축 그룹이 함께,그러나 강요하지 않습은 모든 그룹이 될 것으로 압축하도록 지정합니다.. 폐 그룹이 될 것이 압축되어 있지만 오픈 그룹이 되지 않으로 압축하도록 지정합니다..을 강제로 모든 압축 그룹이 사용 Transact-SQL 예 아래.

참고

SQL Server2019 로 시작(15.x)tuple-발동기에 의해 도움이 배경을 병합하는 작업이 자동으로 압축하여 작은 열 델타 그룹이는 몇 시간 동안 존재에 의해 결정되는 내부 임계값,또는 병합 압축 그룹이있는 곳에서 많은 수의 행 삭제되었습니다. 이렇게하면 시간이 지남에 따라 columnstore 인덱스 품질이 향상됩니다.
columnstore 용어 및 개념에 대한 자세한 내용은 Columnstore index:Overview 를 참조하십시오.

다시 파티션에 대한 전체를 테이블

  • 재건 전체를 테이블의 오랜 시간이 걸리는 경우 지수가 크고,필요한 디스크 공간이 부족하여 저장소에 추가로의 복사본을 색인하는 동안 다시 작성합니다. 일반적으로 가장 최근에 사용한 파티션 만 다시 작성하면됩니다.
  • 파티션된 테이블에 대한하지 않습을 재 구축 할 필요가 전체 인덱스 테이블 때문에 분열이 발생할 가능성이에서만 수정된 파티션이다. 팩트 테이블과 대형 차원 테이블은 일반적으로 테이블의 청크에 대해 백업 및 관리 작업을 수행하기 위해 분할됩니다.

무거운 DML 작업 후 파티션 재 구축

파티션 재 구축은 파티션을 조각 모음하고 디스크 스토리지를 줄입니다. 다시 작성하면 삭제가 표시된 columnstore 의 모든 행이 삭제되고 delta store 의 모든 행 그룹이 columnstore 로 이동합니다. 델타 저장소에 행 수가 백만 개 미만인 행 그룹이 여러 개 있을 수 있습니다.

데이터를로드 한 후 파티션 다시 작성

로드 날짜 이후에 파티션을 다시 작성하면 모든 데이터가 columnstore 에 저장됩니다. 을 때 동시 프로세스 각 부하 100,000 행 같은 파티션으로,같은 시간에 파티션이 끝날 수 있는 델타 여러 상점이다. 다시 작성하면 모든 델타 저장소 행이 columnstore 로 이동합니다.

고려 사항을 재구성하는 데이터베 index

재구성 할 때보다 많은 메모리가 필수 데이터베이스 엔진의 압축 서 폐쇄 delta 행 그룹으로 데이터베으로 압축된 행 그룹. SQL Server2016 시작(13.x)과 SQL 데이터베이스REORGANIZE명령이 수행하는 다음과 같은 추가적인 조각 온라인 최적화:

  • 육체적으로 제거에서 행 저 when10%이상의 행 논리적으로 삭제됩니다. 삭제된 바이트는 실제 미디어에서 회수됩니다. 예를 들어,1 백만 행의 압축 된 행 그룹에 100k 행이 삭제 된 경우 SQL Server 는 삭제 된 행을 제거하고 900k 행으로 행 그룹을 다시 압축합니다. 그것은 삭제 된 행을 제거하여 저장소에 저장합니다.

  • 하나 이상의 압축 된 행 그룹을 결합하여 행 그룹 당 행을 최대 1,048,576 행까지 증가시킵니다. 예를 들어,102,400 행의 5 배치를 대량으로 가져 오면 5 개의 압축 된 행 그룹을 얻게됩니다. 재구성을 실행하면 이러한 행 그룹은 512,000 행 크기의 압축 된 행 그룹 1 개로 병합됩니다. 이것은 사전 크기 나 메모리 제한이 없다고 가정합니다.

  • 에 대한 그룹에서는 10%이상의 행 논리적으로 삭제된 데이터베이스 엔진 결합하려고 이 행 그룹으로 하나 이상의 그룹. 예를 들어,rowgroup1 은 500,000 행으로 압축되고 rowgroup21 은 최대 1,048,576 행으로 압축됩니다. Rowgroup21 에는 삭제 된 행의 60%가 있으며 409,830 개의 행이 남습니다. 데이터베이스 엔진은이 두 행 그룹을 결합하여 909,830 개의 행이있는 새 행 그룹을 압축하는 것을 선호합니다.

데이터 로드를 수행 한 후 델타 저장소에 여러 개의 작은 행 그룹을 가질 수 있습니다. 당신이 사용할 수 있는ALTER INDEX REORGANIZE을 강제로 모든 그룹으로 데이터베이며,다음을 결합 그룹으로 적은 그룹으로 더 많은 행이 있습니다. 재구성 작업은 columnstore 에서 삭제된 행도 제거합니다.

제한 및 제한

128 개 이상의 익스텐트가있는 Rowstore 인덱스는 논리적 및 물리적 인 두 단계로 재구성됩니다. 논리적 단계에서 기존 할당에 의해 사용되는 인덱스가 표시되 할당 해제,데이터는 행을 복사하고 정렬된 다음,이 새로운 단위의 할당을 저장하기 위해 만들어진 다시 작성 인덱스입니다. 물리적 단계에서는 할당을 단위로 이전에 표시 할당 해제는 육체적으로 떨어에서 짧은 거래에서 일어나는 배경,그리고 필요하지 않습니다. 익스텐트에 대한 자세한 내용은 페이지 및 익스텐트 아키텍처 가이드를 참조하십시오.

ALTER INDEX REORGANIZECould not allocate space for object '###' in database '###' because the '###' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.

경고

을 만들고 재건을 정렬된 인덱스 테이블에 1,000 개 이상의 파티션이 가능하지만,은 지원되지 않습니다. 그렇게하면 이러한 작업 중에 성능이 저하되거나 과도한 메모리 소비가 발생할 수 있습니다. Microsoft 는 파티션 수가 1,000 개를 초과 할 때 정렬 된 인덱스 만 사용하는 것이 좋습니다.

인덱스는 수 없이 재구성 또는 재건되는 경우에 그룹에 위치하는가 오프라인 또는 설정을 읽기 전용입니다. 때 키워드ALL지정하고 하나 이상 인덱스가 오프라인 또는 읽기 전 그룹,문은 실패합니다.

통계:

  • 인덱스를 생성할 때 또는 재건,통계으로 만들거나 업데이트 검사는 모든 행 테이블에 있습니다. 그러나 SQL Server2012(11.x),통계는 분할 된 인덱스가 생성되거나 다시 작성 될 때 테이블의 모든 행을 스캔하여 생성되거나 업데이트되지 않습니다. 대신 쿼리 최적화 프로그램은 기본 샘플링 알고리즘을 사용하여 이러한 통계를 생성합니다. 하여 통계를 얻을 검사하여 분할된 인덱스에 대한 모든 행 테이블에 사용한 통계를 만들거나 업데이트 통계를 가진FULLSCANclause.

  • 인덱스가 재구성되면 통계가 업데이트되지 않습니다.

ALLOW_PAGE_LOCKS가 OFF 로 설정된 경우 인덱스를 재구성할 수 없습니다.

SQL Server2017 까지(14.x),클러스터 된 columnstore 인덱스를 다시 작성하는 것은 오프라인 작업입니다. 데이터베이스 엔진은 재구성이 발생하는 동안 테이블 또는 파티션에 대한 독점 잠금을 획득해야합니다. 데이터는 오프라인 사용할 수 없는 동안 다시 사용하는 경우에도NOLOCK,분 스냅샷을 격리(RCSI),또는 스냅샷 격리입니다.SQL Server2019 시작(15.x),클러스터 된 columnstore 인덱스는ONLINE = ON옵션을 사용하여 다시 작성할 수 있습니다.

Azure 냅 분석(이전 Azure 냅 분석)테이블 주문 클러스터 인덱스 테이블,ALTER INDEX REBUILD것이 다시 정렬 데이터를 사용하여 TempDB. 재 구축 작업 중에 TempDB 를 모니터링합니다. 더 많은 TempDB 공간이 필요한 경우 데이터웨어 하우스를 확장하십시오. 인덱스 재구성이 완료되면 다시 축소합니다.

Azure 냅 분석(이전 Azure 냅 분석)테이블 주문 클러스터 인덱스 테이블,ALTER INDEX REORGANIZEALTER INDEX REBUILD.

를 사용하여 인덱스를 다시 복구 하드웨어에서 실패

이전 버전의 SQL 서버,당신은 가끔 다시스템 뷰 인덱스를 올바른 불일치에 의해 발생 하드웨어 실패입니다.SQL Server2008,여전히 수 있습 복구하는 등 간의 불일치 인덱스 및 인덱스로 다시 작성하여 인덱스 오프라인입니다. 그러나,당신을 복구할 수 없 인덱스의 불일치를 다시 작성하여 인덱스를 온라인으로 다시 메커니즘을 사용하여 기존의 인덱스에 대한 기준으로 다시고,따라서 유지의 일관성이 없습니다. 다시 작성 인덱스 오프라인 수 있습니다 때로는 힘 스캔의 인덱스(또는 힙)및 그 제거에 일관성이 없습니다. 클러스터 된 인덱스에서 재구성을 보장하려면 비 클러스터 된 인덱스를 삭제하고 다시 작성하십시오. 이전 버전과 같은,우리는 복구에서 불일치를 복원하여 영향을 받는 데이터 백업에서 그러나,당신이 할 수 있을 복구하는 지수의 불일치를 다시 작성하여 인덱스 오프라인입니다. 자세한 내용은 DBCC CHECKDB(Transact-SQL)를 참조하십시오.

see

  • SQL Server Index 건축과 디자인 가이드
  • 인덱스 작업 수행을 Online
  • ALTER INDEX(Transact-SQL)
  • 적응 인덱스 Defrag
  • 한 통계를 만들(Transact-SQL)
  • 업데이트 통계(Transact-SQL)
  • 인덱스 테이블을 쿼리 성능
  • 시작으로 테이블에 대한 실시간 운영 분석
  • 인덱스 테이블에 대한 데이터 웨어하우징
  • 인덱스 테이블과 병합 정책에 대한 그룹

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다