-- ===================================================================
-- CLUSTERED INDEX의 값이 변경될때~ NONCLUSTERED INDEX의 UNIQUIER 값이 변경 되느냐?
-- Update : 주디아줌마
-- Update Date : 2011.08.02
-- Desc :
--
--
-- ===================================================================
use master
go
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
GO
drop database indextest
go
-- TSQL Script
create database indextest
go
use indextest
go
-- create the index after loading the data
drop table t_ci
go
create table t_ci (c1 int, c2 char (100), c3 int, c4 varchar(1000))
go
-- load the data
declare @i int
select @i = 0
while (@i < 1000)
begin
insert into t_ci values (@i, 'hello', @i+10000, replicate ('a', 100))
set @i = @i + 1
end
-- create the clustered index
create clustered index ci on t_ci(c1)
go
-- nonclustered index
create index ni on t_ci(c3)
go
DBCC SHOW_STATISTICS ('t_ci', ci);
GO
DBCC SHOW_STATISTICS ('t_ci', ni);
GO
-- c1, c3 column 정보들의 데이타 값은 유니크 합니다
------------------------------------------------------------------------------------------------------------------
-- ##. 조각 데이타 확인
--dbcc ind option indid
--0 : 힙상의 데이터
--1 : 클러스터된 인덱스
--2 ~ 251 : 클러스터되지 않은 인덱스 또는 통계
--255 : text, ntext, image형의 데이터
--DBCC PAGE (DB Name, File Number, Page Number, Option) - 페이지 내용 보기
--Option
-- 0 : Header
-- 1 : Row 단위
-- 2 : page 그래도
-- 3 : 행 그리고 컬럼 값
--DBCC TRACEON(3604) -- 한 화면에 출력
------------------------------------------------------------------------------------------------------------------
-- 루트 페이지
DBCC ind ( indextest, t_ci, 2)
GO
--PageFID PagePID IAMFID IAMPID ObjectID IndexID PartitionNumber PartitionID iam_chain_type PageType IndexLevel NextPageFID NextPagePID PrevPageFID PrevPagePID
--1 119 NULL NULL 2121058592 2 1 72057594038976512 In-row data 10 NULL 0 0 0 0
--1 118 1 119 2121058592 2 1 72057594038976512 In-row data 2 0 1 120 0 0
--1 120 1 119 2121058592 2 1 72057594038976512 In-row data 2 0 0 0 1 118
--1 121 1 119 2121058592 2 1 72057594038976512 In-row data 2 1 0 0 0 0
-- 루트 페이지 정보 검색
DBCC TRACEON(3604)
DBCC page(indextest, 1, 121, 3)
go
--FileId PageId Row Level ChildFileId ChildPageId c3 (key) c1 (key) UNIQUIFIER (key) KeyHashValue
--1 121 0 1 1 118 NULL NULL NULL NULL
--1 121 1 1 1 120 10578 578 0 NULL
-- 논 리프 페이지
DBCC page(indextest, 1, 120, 3)
go
--FileId PageId Row Level c3 (key) c1 (key) UNIQUIFIER (key) KeyHashValue
--1 120 0 0 10578 578 0 (386f53916731)
--1 120 1 0 10579 579 0 (e5686b95e8c9)
--1 120 2 0 10580 580 0 (f47fc3894522)
--1 120 3 0 10581 581 0 (2978fb8dcada)
--1 120 4 0 10582 582 0 (4f70b3815bd3)
--1 120 5 0 10583 583 0 (92778b85d42b)
--1 120 6 0 10584 584 0 (6c5ee3b80104)
--1 120 7 0 10585 585 0 (b159dbbc8efc)
--1 120 8 0 10586 586 0 (d75193b01ff5)
--1 120 9 0 10587 587 0 (0a56abb4900d)
--1 120 10 0 10588 588 0 (1b4103a83de6)
--1 120 11 0 10589 589 0 (c6463bacb21e)
--1 120 12 0 10590 590 0 (a04e73a02317)
--1 120 13 0 10591 591 0 (7d494ba4acef)
--1 120 14 0 10592 592 0 (eee518b8dc9a)
--1 120 15 0 10593 593 0 (33e220bc5362)
------------------------------------------
-- c1값이 모두 유니크 함으로 UNIQUIFIER(Key) 값은 모두 0입니다.
-- KeyHashValue Value
UPDATE t_ci
SET
c1 = 9000
WHERE c1 IN ( 578, 579)
GO
-- 논 리프 페이지
DBCC page(indextest, 1, 120, 3)
go
--FileId PageId Row Level c3 (key) c1 (key) UNIQUIFIER (key) KeyHashValue
--1 120 1 0 10578 9000 0 (15af3e99462f)
--1 120 3 0 10579 9000 1 (dfcb6fa8dd0b)
--1 120 4 0 10580 580 0 (f47fc3894522)
-- UNIQUIFIER, KeyHashValue 값이 변경되었죠? 동일한 값을 구분하기 위해 구분자가 있는 것 같습니다.
GO
-- 조각 구성을 다시 해보았습니다.
create clustered index ci on dbo.t_ci( c1)
with drop_existing
go
-- 논 리프 페이지
DBCC page(indextest, 1, 120, 3)
go
--FileId PageId Row Level c3 (key) c1 (key) UNIQUIFIER (key) KeyHashValue
--1 120 0 0 10578 9000 0 (15af3e99462f)
--1 120 1 0 10579 9000 1 (dfcb6fa8dd0b)
--1 120 2 0 10580 580 0 (f47fc3894522)
--1 120 3 0 10581 581 0 (2978fb8dcada)
--1 120 4 0 10582 582 0 (4f70b3815bd3)
변화가 없습니다.^^
결론은 데이타가 변하지 않은 이상 WITH DROP_EXISTING으로 재작성시 변화는 없다는 결론입니다.^^