SQL Server/SQL Server Tip

힙테이블에서 행을 삭제하면 어떻게 처리 될까?

SungWookKang 2015. 7. 17. 09:29
반응형

힙테이블에서 행을 삭제하면 어떻게 처리 될까?

 

힙테이블(Heap Table)에서 행을 삭제하면 실제로 데이터가 삭제 될까?

사실은 실제 데이터가 삭제되지 않고 삭제 된 것처럼 오프셋의 값만 초기화 시킵니다.

 

테이블을 생성하여 데이터를 입력하고 삭제함으로써 데이터 페이지에는 어떤 변화가 일어나는지 살펴봅니다.

 

[전체 코드]

CREATE TABLE TBL_X (COL1 CHAR(5), COL2 CHAR(5))

GO

 

INSERT INTO TBL_X VALUES ('A', 'B')

INSERT INTO TBL_X VALUES ('C', 'D')

GO

 

SELECT * FROM TBL_X

GO

 

SELECT * FROM SYS.SYSINDEXES WHERE ID = OBJECT_ID('TBL_X')

 

DBCC TRACEON (3604)

 

DBCC IND(SW_TEST, TBL_X, 0)

DBCC PAGE (SW_TEST, 1, 1319, 1) WITH TABLERESULTS

DBCC PAGE (SW_TEST, 1, 1319, 3) WITH TABLERESULTS

 

 

DELETE TBL_X WHERE COL2 = 'D'

 

SELECT * FROM TBL_X

 

DBCC PAGE (SW_TEST, 1, 1319, 1) WITH TABLERESULTS

DBCC PAGE (SW_TEST, 1, 1319, 3) WITH TABLERESULTS

DBCC PAGE (SW_TEST, 1, 1319, 2) WITH TABLERESULTS

 

 

 

테이블을 생성하고 데이터를 입력 합니다.

CREATE TABLE TBL_X (COL1 CHAR(5), COL2 CHAR(5))

GO

 

INSERT INTO TBL_X VALUES ('A', 'B')

INSERT INTO TBL_X VALUES ('C', 'D')

GO

 

SELECT * FROM TBL_X

GO

 

 

DBCC 명령어를 이용하여 할당 정보를 확인 합니다.

DBCC IND(SW_TEST, TBL_X, 0)

 

 

페이지 정보를 확인 할 수 있도록 플래그 3604를 ON하고 페이지를 조회 합니다. 2개의 행이 있는 것을 확인 할 수 있습니다.

DBCC TRACEON (3604)

DBCC PAGE (SW_TEST, 1, 1319, 1) WITH TABLERESULTS

 

DBCC PAGE (SW_TEST, 1, 1319, 3) WITH TABLERESULTS

 

 

COL2의 값이 'D'인 행을 삭제 합니다. 그리고 페이지를 조회 합니다. Slot1의 데이터가 표시되지 않고 오프셋이 0으로 바뀐 것을 확인 할 수 있습니다.

DELETE TBL_X WHERE COL2 = 'D'

 

DBCC PAGE (SW_TEST, 1, 1319, 1) WITH TABLERESULTS

 

DBCC PAGE (SW_TEST, 1, 1319, 3) WITH TABLERESULTS

 

DBCC PAGE의 3번째 값을 2 옵션으로 실행하여 메모리 내용을 DUMP 합니다. 삭제할 행의 오프셋 위치 값을 확인해 보면 삭제되지 않고 그대로 데이터가 존재 함을 확인 할 수 있습니다.

DBCC PAGE (SW_TEST, 1, 1319, 2) WITH TABLERESULTS

 

즉 실제로는 데이터가 삭제되지 않고 삭제된 것처럼 오프셋의 값을 초기화 함으로써 삭제의 기능을 구현한 것을 확인 할 수 있습니다. 만약 실수로 인하여 데이터를 삭제하였다면 다른 데이터로 덮어 쓰기 전까지는 이전 데이터 값이 그대로 유지되므로 복구는 가능하리라 생각됩니다.

 

참고 자료 : SQL Server 튜닝 2000/2005 (정원혁 / 대림출판사)

 

2012-08-01 / 강성욱 / http://SQLMVP.KR

 

반응형