insert나 update시 테이블에 인덱스를 타지 않고 log cans를 합니다.
log scan이 insert이런 작업을 할때 발생하는것으로 알고 있는데 이것이 성능에 많은 영향을 줄까요?
update나 insert 하는 테이블은 600만건이 좀 넘는 큰 테이블 입니다.
제가 알기론 log scan이 최신에 변경 된 내용을 log에서 뒤져서 가져오는 것으로 알고 있는데요
이런 작업이 많이 발생 하면 성능에 어떤 영향을 줄수 있을까요?
단순 insert만으로는 log scan이 발생하지는 않습니다. log scan은 해당 테이블에 trigger가 있는 경우 deleted, inserted table을 조회하는 경우에 발생합니다 이는 정상적인 것이겠지요 이럴경우는 plan을 보면
STEP 1 The type of query is SELECT.
1 operator(s) under root
|ROOT:EMIT Operator (VA = 1) | | |SCAN Operator (VA = 0) | | FROM TABLE | | p1 | | Log Scan. | | Forward Scan. | | Positioning at start of table. | | Using I/O Size 4 Kbytes for data pages. | | With MRU Buffer Replacement Strategy for data pages.
처럼 나타납니다. insert trigger가 있으면 트리거를 row 별로 수행하기 때문에 많은 부하가 발생합니다ㅣ (insert ... select 는 좀 다르지만요 : row 별로 trigger 되지 않고 한번만 trigger 됨) 로직상 문제가 없다면 trigger를 disable 하고 insert 작업을 하면 많이 빠르겠지요. 그러나 update 시 deffered update 발생하는 경우가 있는데(이는 plan에 log scan이라 나타나지 않음) - deffered update 뭐 이렇게 나타납니다 이때는 내부적으로 row의 내용을 log에 저장하였다가 다시 읽어 처리 하는 경우가 발생하기 때문에 성능에 많은 영향을 줍니다. deffered update는 성능에 많은 영향을 주기때문에 튜닝이 필요할수 있습니다 여러가지 원인이 있겠지만 한가지 예는 key column을 update 하면서 발생하는 문제 입니다. data 가 c1 --- 1 2 3 4 5 index는 c1 컬럼에 대해 unique index(primary key) 인 경우 update tab set c1 = c1+1을 하는 경우... deffered update가 발생