반응형
반응형

인덱스 비활성화는 사용자가 인덱스를 사용할 없도록 하며, 제약 조건을 포함한 모든 인덱스에 사용 가능합니다. , 비활성화된 인덱스는 유지 관리 되지 않고, 쿼리 옵티마이저에 의해 고려 되지도 않습니다. 비클러스터형 인덱스 또는 클러스터형 인덱스를 비활성화하면 인덱스의 메타 데이터는 시스템 카탈로그에 남기지만, 물리적으로 인덱스 데이터를 삭제합니다. 그러므로, 비활성화된 인덱스와 동일한 이름으로 인덱스를 생성할 없습니다. 클러스터형 인덱스의 경우는 비활성화하면 데이터는 삭제되지 않고 남아 있지만, 해당 테이블의 데이터에 접근할 없어, 데이터의 수정은 물론 조회도 불가능합니다.

인덱스의 비활성화 여부는 sys.indexes 카탈로그 뷰의 is_disabled 열을 확인합니다. 인덱스의 비활성화는 ALTER INDEX DISABLE 사용하고, 비활성화된 인덱스를 다시 활성화 시키기 위해서는 ALTER INDEX REBUILD 또는 CREATE INDEX WITH DROP_EXISTING 구문을 사용합니다. 비활성화된 클러스터형 인덱스를 재작성할 때에는 ONLINE 옵션을 ON으로 설정할 없으며, 비활성화된 비클러스터형 인덱스를 재작성할 때에는 ONLINE 옵션을 ON으로 설정할 있습니다.

 

비클러스터형 인덱스 비활성화한 , 다시 활성화하기

USE AdventureWorks;

GO

-- 비클러스터형 인덱스 비활성화

ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee

DISABLE ;

GO

-- 비활성화된 인덱스 확인

SELECT is_disabled FROM sys.indexes

WHERE object_id=object_id('HumanResources.Employee')

AND name='IX_Employee_ManagerID';

/* 1 */

-- 온라인으로 인덱스 재작성

ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee

REBUILD WITH (ONLINE=ON);

GO

-- 재작성된 인덱스의 비활성화 여부 확인

SELECT is_disabled FROM sys.indexes

WHERE object_id=object_id('HumanResources.Employee')

AND name='IX_Employee_ManagerID';

GO

 

클러스터형 인덱스 비활성화한 , 다시 활성화하기

USE AdventureWorks;

GO

ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee

DISABLE ;

GO

SELECT * FROM HumanResources.Employee;

GO

/*

메시지 8655, 수준 16, 상태 1, 1

테이블 또는 Employee' 인덱스 'PK_Employee_EmployeeID'() 비활성화되었으므로 쿼리 프로세서에서 계획을 생성할 없습니다.

*/

ALTER INDEX ALL ON HumanResources.Employee

REBUILD;

GO

 

 

FOREIGN KEY 제약 조건이 있는 클러스터형 인덱스 비활성화한 , 활성화하기

USE Sample;

GO

-- 테스트 테이블 생성

CREATE TABLE STATES (STATE CHAR(2) NOT NULL);

GO

CREATE TABLE CITIES (

                            CITY VARCHAR(30) NOT NULL,

                            STATE CHAR(2) ,

                  ZIP INT);

GO

-- PK 제약 조건과 FK 제약 조건 생성

ALTER TABLE STATES

ADD CONSTRAINT PK_STATES PRIMARY KEY CLUSTERED (STATE);

GO

ALTER TABLE CITIES

ADD CONSTRAINT PK_CITIES PRIMARY KEY CLUSTERED (CITY);

GO

ALTER TABLE CITIES

ADD CONSTRAINT FK_CITIES_STATES_STATE FOREIGN KEY (STATE)

REFERENCES STATES (STATE);

GO

 

-- CITIES 테이블에 데이터 INSERT

-- STATES 테이블에 없는 PR 값은 CITIES INSERT 없다

INSERT INTO STATES SELECT 'CA';

GO

INSERT INTO CITIES SELECT 'Los Angles', 'CA',111;

GO

INSERT INTO CITIES SELECT 'San Juan', 'PR' ,222;

GO

/*

메시지 547, 수준 16, 상태 0, 1

INSERT 문이 FOREIGN KEY 제약 조건 "FK_CITIES_STATES_STATE"() 충돌했습니다. 데이터베이스 "sample", 테이블 "dbo.STATES", column 'STATE'에서 충돌이 발생했습니다.

문이 종료되었습니다.

*/

 

-- STATES 테이블의 클러스터형 인덱스 비활성화

-- FOREIGN KEY 제약 조건도 동시에 비활성화된다

ALTER INDEX PK_STATES ON STATES

DISABLE;

GO

/*

경고: 인덱스 'PK_STATES'() 비활성화한 결과 테이블 'STATES'() 참조하는 테이블 'CITIES' 외래 'FK_CITIES_STATES_STATE'() 비활성화되었습니다.

*/

 

-- CITIES 테이블에 데이터 INSERT

-- (FOREIGN KEY 제약 조건이 비활성화되었으므로 STATES 테이블에 없는 PR 값을 INSERT 있다)

INSERT INTO CITIES SELECT 'San Juan', 'PR' ,222;

GO

 

-- STATES 테이블의 클러스터형 인덱스 재작성

ALTER INDEX PK_STATES ON STATES

REBUILD;

GO

-- CITIES 테이블에 데이터 INSERT

-- (FOREIGN KEY 제약 조건은 여전히 비활성화 상태이므로 STATES 테이블에 없는 PR 값을 INSERT 있다)

INSERT INTO CITIES SELECT 'Detroit', 'PR' ,333;

GO

 

-- FOREIGN KEY 제약 조건 재생성하기

ALTER TABLE  CITIES

CHECK CONSTRAINT FK_CITIES_STATES_STATE;

-- CITIES 테이블에 데이터 INSERT

-- (FOREIGN KEY 제약 조건이 재생성되었으므로 STATES 테이블에 없는 PR 값을 INSERT 없다)

INSERT INTO CITIES SELECT 'Kenmore', 'PR' ,444;

GO

/*

메시지 547, 수준 16, 상태 0, 1

INSERT 문이 FOREIGN KEY 제약 조건 "FK_CITIES_STATES_STATE"() 충돌했습니다. 데이터베이스 "sample", 테이블 "dbo.STATES", column 'STATE'에서 충돌이 발생했습니다.

문이 종료되었습니다.

*/

 

 

[참고]

PRIMARY KEY 제약 조건을 FOREIGN KEY 제약 조건이 참조하고 있는 경우, 인덱스가 비활성화되면 FOREIGN KEY 제약 조건도 동시에 비활성화됩니다. 그러나, PRIMARY KEY 제약 조건을 재구성했다고 하더라도 FOREIGN KEY 제약 조건은 재구성되지 않으므로, PRIMARY KEY 제약 조건을 재구성한 수동으로 FOREIGN KEY 제약 조건을 재생성해야 합니다.

반응형

+ Recent posts

반응형