SQL에서 UPDATE가 의미 하는것은 실제로 데이터를 업데이트 하는것이 아니라
기존의 데이터를 지우고 해당 내용을 변경하여 다시 넣는다는것으로 알고 있습니다
=> 경우에 따라서 in-place update가 일어나기도 하고 기존의 데이터를 지우고 다시 입력하기도 합니다.
in-place update의 경우에는 date page자체만을 update하므로 인덱스에는 전혀 영향을 주지 않습니다.
손님이 질의하신 경우에는 in-place update가 발생하므로 기존데이터를 지우고 다시 입력하는것이 아니라
그냥 name 컬럼 값만을 update 합니다.
그러나, 이경우에도 만약 "으하하" 라는 자료가 "음하하" 로만 변경하는것이 아니고
"음하하하하하" 등과 같이 컬럼길이가 기존길이보다 더 커진다면 이때는 in-place가 아니라
기존 데이터를 지우고 다시입력하는 방식으로 처리되겠지요.
그러나, update를 하게되면 순간적이나마 베타적잠금(Exclusive-Lock)이 발생을 합니다.
동시에 다른 곳에서 select를 한다면 lock으로 인하여 잠시 대기시간이 생기게 됩니다.
그래서, 가급적이면 아주 빈번하게 사용되는 마스트성 테이블의 경우에는
insert위주로 설계 해주시는것이 좋습니다.
update가 빈번하게 발생을한다면 그만큼의 lock이 발생하고 그로인해서 시스템이
느려지게 되겠지요.
저는 update용 테이블을 분리하실것을 권장합니다.
> 손님 님이 쓰신 글
> ----------------------------------------------------------
> OS : Microsoft Windows 2000 Server / Advanced Server
> SQL : Microsoft SQL Server 2000 Standard / Enterprise Edition
>
> 안녕하세요 .
>
> 인덱스에 대해서 몇가지 궁금한 점이 있어서 글을 올립니다.
>
> SQL에서 UPDATE가 의미 하는것은 실제로 데이터를 업데이트 하는것이 아니라
>
> 기존의 데이터를 지우고 해당 내용을 변경하여 다시 넣는다는것으로 알고 있습니다
>
> 궁금한것은요 ..
>
> CREATE TABLE test_table (
> idx INT PRIMARY KEY Not Null IDENTITY(1,1),
> name varchar(200) Not Null,
> test int Not Null
> )
>
> 이런 테이블을 만들고 마지막의 test 필드에 인덱스를 걸었다고 가정을 해봅시다.
>
> idx name test
> 1 메롱 2
> 2 으하하 4
> 3 어쩌구 5
>
> 라는 내용이 해당 테이블에 들어갔을 경우에요.
>
> idx에는 필드가 IDENTITY로 만들었으니 인덱스가 자동으로 생성되있잖아요 ?
>
> (맞는거죠 ㅡㅡ?) 그러면 여기서 제가 idx 가 2번인 "으하하" name 을 "음하하"로 UPDATE 했다면
>
> 여기에 걸려 있는 idx,test 인덱스가 재구성이 되는것이 맞는것인가요?
>
> 재구성이 된다는것은 인덱스를 다시 작성해야한다는것니깐 시간이 오래걸릴거라고 생각이 드는데 ..
>
> 아니면 인덱스가 b-tree 방식을 이용해서 하기땜시 인덱스와 관련 없는 값은 그냥 업데이트가
>
> 되는것인가요 ..
>
> 즉 "으하하" 라는 자료가 "음하하" 로만 변경이 되어서 기존에 구성되어 있는 인덱스에는 아무런
>
> 영향을 안주게 되는것인가요.
>
> 제가 적용하려는 부분은
>
> 쇼핑몰에서 상품 테이블안에 조회수, 판매수를 넣어야 하나 말아야 하나 그거 때문에 고민이거든요 ㅡ.ㅡ ..
>
> 상품 테이블안에는 인덱스가 많이 걸려 있는데... 조회수나 판매수를 넣으면 업데이트가 너무 자주 일어 나게되어서
>
> 따로 테이블을 만들어서 하는게 좋은건지 아니면 그냥 상품 테이블에 넣으면 될련지 ㅡ.ㅡ
>
> 햇갈려서 이렇게 문의 드립니다. 고수님들의 좋은 답변 바랍니다 .^^
>
기존의 데이터를 지우고 해당 내용을 변경하여 다시 넣는다는것으로 알고 있습니다
=> 경우에 따라서 in-place update가 일어나기도 하고 기존의 데이터를 지우고 다시 입력하기도 합니다.
in-place update의 경우에는 date page자체만을 update하므로 인덱스에는 전혀 영향을 주지 않습니다.
손님이 질의하신 경우에는 in-place update가 발생하므로 기존데이터를 지우고 다시 입력하는것이 아니라
그냥 name 컬럼 값만을 update 합니다.
그러나, 이경우에도 만약 "으하하" 라는 자료가 "음하하" 로만 변경하는것이 아니고
"음하하하하하" 등과 같이 컬럼길이가 기존길이보다 더 커진다면 이때는 in-place가 아니라
기존 데이터를 지우고 다시입력하는 방식으로 처리되겠지요.
그러나, update를 하게되면 순간적이나마 베타적잠금(Exclusive-Lock)이 발생을 합니다.
동시에 다른 곳에서 select를 한다면 lock으로 인하여 잠시 대기시간이 생기게 됩니다.
그래서, 가급적이면 아주 빈번하게 사용되는 마스트성 테이블의 경우에는
insert위주로 설계 해주시는것이 좋습니다.
update가 빈번하게 발생을한다면 그만큼의 lock이 발생하고 그로인해서 시스템이
느려지게 되겠지요.
저는 update용 테이블을 분리하실것을 권장합니다.
> 손님 님이 쓰신 글
> ----------------------------------------------------------
> OS : Microsoft Windows 2000 Server / Advanced Server
> SQL : Microsoft SQL Server 2000 Standard / Enterprise Edition
>
> 안녕하세요 .
>
> 인덱스에 대해서 몇가지 궁금한 점이 있어서 글을 올립니다.
>
> SQL에서 UPDATE가 의미 하는것은 실제로 데이터를 업데이트 하는것이 아니라
>
> 기존의 데이터를 지우고 해당 내용을 변경하여 다시 넣는다는것으로 알고 있습니다
>
> 궁금한것은요 ..
>
> CREATE TABLE test_table (
> idx INT PRIMARY KEY Not Null IDENTITY(1,1),
> name varchar(200) Not Null,
> test int Not Null
> )
>
> 이런 테이블을 만들고 마지막의 test 필드에 인덱스를 걸었다고 가정을 해봅시다.
>
> idx name test
> 1 메롱 2
> 2 으하하 4
> 3 어쩌구 5
>
> 라는 내용이 해당 테이블에 들어갔을 경우에요.
>
> idx에는 필드가 IDENTITY로 만들었으니 인덱스가 자동으로 생성되있잖아요 ?
>
> (맞는거죠 ㅡㅡ?) 그러면 여기서 제가 idx 가 2번인 "으하하" name 을 "음하하"로 UPDATE 했다면
>
> 여기에 걸려 있는 idx,test 인덱스가 재구성이 되는것이 맞는것인가요?
>
> 재구성이 된다는것은 인덱스를 다시 작성해야한다는것니깐 시간이 오래걸릴거라고 생각이 드는데 ..
>
> 아니면 인덱스가 b-tree 방식을 이용해서 하기땜시 인덱스와 관련 없는 값은 그냥 업데이트가
>
> 되는것인가요 ..
>
> 즉 "으하하" 라는 자료가 "음하하" 로만 변경이 되어서 기존에 구성되어 있는 인덱스에는 아무런
>
> 영향을 안주게 되는것인가요.
>
> 제가 적용하려는 부분은
>
> 쇼핑몰에서 상품 테이블안에 조회수, 판매수를 넣어야 하나 말아야 하나 그거 때문에 고민이거든요 ㅡ.ㅡ ..
>
> 상품 테이블안에는 인덱스가 많이 걸려 있는데... 조회수나 판매수를 넣으면 업데이트가 너무 자주 일어 나게되어서
>
> 따로 테이블을 만들어서 하는게 좋은건지 아니면 그냥 상품 테이블에 넣으면 될련지 ㅡ.ㅡ
>
> 햇갈려서 이렇게 문의 드립니다. 고수님들의 좋은 답변 바랍니다 .^^
>
'System & Develop > SQL' 카테고리의 다른 글
| SqlServer Sp - 해당월의 마지막일 구하기 (0) | 2003.04.15 |
|---|---|
| SqlServer Sp - Order By 절 이후에 case 사용 (0) | 2003.04.15 |
| Mysql Dump (0) | 2003.02.20 |
| BOOKS ONLINE (0) | 2003.02.20 |
| SqlServer SP - @@identity (0) | 2002.09.29 |
