힙테이블에서 행을 삭제하면 어떻게 처리 될까?
힙테이블(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 |
즉 실제로는 데이터가 삭제되지 않고 삭제된 것처럼 오프셋의 값을 초기화 함으로써 삭제의 기능을 구현한 것을 확인 할 수 있습니다. 만약 실수로 인하여 데이터를 삭제하였다면 다른 데이터로 덮어 쓰기 전까지는 이전 데이터 값이 그대로 유지되므로 복구는 가능하리라 생각됩니다.
강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

Comment 1
-
엘리엘1
2013.12.27 14:45
잘 봤습니다. 가끔씩 블로그와 올려주신글을 보고 새로운것도 배우고 알고 있던 내용들 잊을만 하면 다시 지식을 채우고 있습니다.
감사합니다.
여담으로
TEST 면 모르겠지만 현업에서 힙테이블로 생성해서 사용하는 경우가 있나요?