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

 

힙테이블(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




No. Subject Author Date Views
Notice 2023년 1월 - SQLER의 업데이트 강좌 리스트 코난(김대우) 2023.01.02 1264
1606 extended events 용 excel view 공개 버전 minsouk 2014.04.07 6422
1605 [TIP] 한 라인에서 여러 테이블 삭제 하기. [3] 엘리엘1 2014.01.03 8644
1604 GhostRecord(인덱스에서 행 삭제시발생) jevida(강성욱) 2013.11.25 13579
1603 프로시저, 함수, 트리거 생성 정보 보기. jevida(강성욱) 2013.11.25 10653
» 힙테이블에서 행을 삭제하면어떻게 처리 될까? [1] jevida(강성욱) 2013.11.25 9393
1601 SSMS의 디자이너에서 테이블 수정 시 발생하는 영향 [1] jevida(강성욱) 2013.11.25 10546
1600 SQL Server를 활용한 Perfmon 로그 저장 [1] jevida(강성욱) 2013.11.21 14775
1599 VLF 환경과 성능 jevida(강성욱) 2013.11.21 10093
1598 Block 모니터링 jevida(강성욱) 2013.11.21 8086
1597 추적파일을 테이블로 로드하기. jevida(강성욱) 2013.11.21 8912
1596 LOGON 트리거 jevida(강성욱) 2013.11.18 6583
1595 DeadLock(교착상태) 모니터 하기 [2] jevida(강성욱) 2013.11.18 11402
1594 Tempdb 경합(동시성 강화) jevida(강성욱) 2013.11.18 7579
1593 SSAS Backup 자동화 하기 jevida(강성욱) 2013.11.18 8189
1592 SSAS - MDX 스크립트 jevida(강성욱) 2013.11.18 7284
1591 SSAS - MDX 쿼리 jevida(강성욱) 2013.11.18 8165
1590 SSAS - MDX 활용 jevida(강성욱) 2013.11.12 7198
1589 SSAS - 집계 최적화 jevida(강성욱) 2013.11.12 7420
1588 SSAS - 사용자 계층 설계 jevida(강성욱) 2013.11.12 6617
1587 SSAS - 집계 설계 이해 - (3)집계 마법사에 특성 추가 jevida(강성욱) 2013.11.06 6982





XE Login