데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

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

 

힙테이블(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
1613 extended events 를 이용한 wait 분석 minsouk 2014.07.25 6264
1612 동일기준에대해 복수컬럼 PIVOT 사용하기 열이 2014.06.27 21372
1611 SELECT / UPDATE / INSERT 쿼리를 쉽게 만들자... [1] Hisory 2014.05.12 10870
1610 ssms 자동 언어 변경이 되면, 이렇게 설정하세요 minsouk 2014.04.27 9566
1609 [QUERY] 그룹 번호 만들기 이스트럭(강동운) 2014.04.11 8688
1608 [QUERY]연승을 구해보자! [2] 이스트럭(강동운) 2014.04.11 9485
1607 VLF 이스트럭(강동운) 2014.04.11 8078
1606 extended events 용 excel view 공개 버전 minsouk 2014.04.07 6400
1605 [TIP] 한 라인에서 여러 테이블 삭제 하기. [3] 엘리엘1 2014.01.03 8616
1604 GhostRecord(인덱스에서 행 삭제시발생) jevida(강성욱) 2013.11.25 13561
1603 프로시저, 함수, 트리거 생성 정보 보기. jevida(강성욱) 2013.11.25 10632
» 힙테이블에서 행을 삭제하면어떻게 처리 될까? [1] jevida(강성욱) 2013.11.25 9379
1601 SSMS의 디자이너에서 테이블 수정 시 발생하는 영향 [1] jevida(강성욱) 2013.11.25 10526
1600 SQL Server를 활용한 Perfmon 로그 저장 [1] jevida(강성욱) 2013.11.21 14751
1599 VLF 환경과 성능 jevida(강성욱) 2013.11.21 10063
1598 Block 모니터링 jevida(강성욱) 2013.11.21 8074
1597 추적파일을 테이블로 로드하기. jevida(강성욱) 2013.11.21 8895
1596 LOGON 트리거 jevida(강성욱) 2013.11.18 6562
1595 DeadLock(교착상태) 모니터 하기 [2] jevida(강성욱) 2013.11.18 11356
1594 Tempdb 경합(동시성 강화) jevida(강성욱) 2013.11.18 7566





XE Login