온라인으로 인덱스 작업 수행
적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
이 문서에서는 SQL Server Management Studio 또는 Transact-SQL을 사용하여 SQL Server에서 온라인으로 인덱스를 만들거나 다시 빌드하거나 삭제하는 방법을 설명합니다. 이 ONLINE
옵션을 사용하면 이러한 인덱스 작업 중에 기본 테이블 또는 클러스터형 인덱스 데이터 및 연결된 비클러스터형 인덱스에 대한 동시 사용자 액세스를 허용합니다. 예를 들어 한 사용자가 클러스터형 인덱스를 다시 빌드하는 동안 해당 사용자와 다른 사용자가 기본 데이터를 계속 업데이트하고 쿼리할 수 있습니다.
클러스터형 인덱스 빌드 또는 다시 작성과 같이 오프라인으로 DDL(데이터 정의 언어) 작업을 수행하는 경우 이러한 작업은 기본 데이터 및 관련 인덱스에 대해 배타적(X) 잠금을 유지합니다. 이렇게 하면 인덱스 작업이 완료될 때까지 기본 데이터에 대한 수정 및 쿼리가 방지됩니다.
참고 항목
인덱스 다시 작성 명령은 온라인에서 수행되는 경우에도 큰 개체 열을 테이블에서 삭제한 후 클러스터형 인덱스에 대한 배타적 잠금을 보유할 수 있습니다.
지원되는 플랫폼
온라인 인덱스 작업은 SQL Server의 모든 버전에서 사용할 수 없습니다. 자세한 내용은 SQL Server 2022의 버전 및 지원되는 기능을 참조 하세요.
온라인 인덱스 작업은 Azure SQL Database 및 Azure SQL Managed Instance에서 사용할 수 있습니다.
제한 사항
온라인 인덱스 작업은 인덱스 작업 동안 동시 사용자 작업이 필수적인 1년 365일, 하루 24시간 운영되는 비즈니스 환경에 적합합니다.
이 ONLINE
옵션은 다음 Transact-SQL 문에서 사용할 수 있습니다.
- CREATE INDEX
- ALTER INDEX
- DROP INDEX
- ALTER TABLE(인덱스 옵션을 사용하여 제약 조건을
CLUSTERED
추가 또는 삭제UNIQUE
하려면PRIMARY KEY
)
온라인으로 인덱스를 만들거나 다시 빌드하거나 삭제하는 방법에 대한 제한 사항 및 제한 사항은 온라인 인덱스 작업에 대한 지침을 참조 하세요.
사용 권한
테이블 또는 보기에 대한 ALTER
권한이 필요합니다.
SQL Server Management Studio 사용
개체 탐색기 더하기 기호를 선택하여 온라인으로 인덱스를 다시 작성하려는 테이블이 포함된 데이터베이스를 확장합니다.
테이블 폴더를 확장합니다 .
더하기 기호를 선택하여 온라인으로 인덱스 다시 작성하려는 테이블을 확장합니다.
인덱스 폴더를 확장합니다 .
온라인으로 다시 작성할 인덱스를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
페이지 선택아래에서 옵션을 선택합니다.
온라인 DML 처리 허용을 선택한 다음 목록에서 True를 선택합니다.
확인을 선택합니다.
온라인으로 다시 작성할 인덱스를 마우스 오른쪽 단추로 클릭하고 다시 작성을 선택합니다.
인덱스 다시 작성 대화 상자에서 올바른 인덱스가 인덱스에 있는지 확인하여 그리드를 다시 빌드하고 확인을 선택합니다.
Transact-SQL 사용
다음 예제에서는 AdventureWorks 데이터베이스에서 기존 온라인 인덱스를 다시 작성합니다.
ALTER INDEX AK_Employee_NationalIDNumber
ON HumanResources.Employee
REBUILD WITH (ONLINE = ON);
다음 예에서는 NewGroup
절을 사용하여 온라인으로 클러스터형 인덱스를 삭제하고 결과 테이블을 MOVE TO
파일 그룹으로 옮깁니다. 테이블을 이동하기 전과 이동한 후에 파일 그룹에서의 인덱스 및 테이블 배치를 확인하기 위해 sys.indexes
, sys.tables
및 sys.filegroups
카탈로그 뷰를 쿼리합니다.
-- Create a clustered index on the PRIMARY filegroup if the index does not exist.
IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name =
N'AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate')
CREATE UNIQUE CLUSTERED INDEX
AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate
ON Production.BillOfMaterials (ProductAssemblyID, ComponentID,
StartDate)
ON 'PRIMARY';
GO
-- Verify filegroup location of the clustered index.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
JOIN sys.tables as t ON i.object_id = t.object_id
AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U')
GO
-- Create filegroup NewGroup if it does not exist.
IF NOT EXISTS (SELECT name FROM sys.filegroups
WHERE name = N'NewGroup')
BEGIN
ALTER DATABASE AdventureWorks2022
ADD FILEGROUP NewGroup;
ALTER DATABASE AdventureWorks2022
ADD FILE (NAME = File1,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\File1.ndf')
TO FILEGROUP NewGroup;
END
GO
-- Verify new filegroup
SELECT * from sys.filegroups;
GO
-- Drop the clustered index and move the BillOfMaterials table to
-- the Newgroup filegroup.
-- Set ONLINE = OFF to execute this example on editions other than Enterprise Edition.
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate
ON Production.BillOfMaterials
WITH (ONLINE = ON, MOVE TO NewGroup);
GO
-- Verify filegroup location of the moved table.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
JOIN sys.tables as t ON i.object_id = t.object_id
AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U');
자세한 내용은 ALTER INDEX(Transact-SQL)를 참조하세요.
관련 콘텐츠
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기