pining이 되는지 되는지 알고 싶습니다. 0 4 626

by 운석 [Oracle 기초] 파이닝 pining [2017.09.17 16:18:09]


제목 없음.png (1,089,573Bytes)

블록에 접근할때 같은 블럭을 접근하게 되면 

파이닝을 걸고 그블럭에 있는 데이터를 가져오잖아요

일종의 락 기법으로 알고 있는데. 밑에 그림의 경우 

 

밑에 보시면 EMP 테이블이 14000개의 로우로 조회를 했는데

cr은 94 정도로 파이닝이 걸린것을 확인 할수 있는데요

그런데 emp 테이블이 랜덤으로 오더바이로 걸구서 테이블을 만들었는데

도 불구 하고 파이닝이 걸렸습니다. 데이터가 랜덤한 숫자로 만들어져도

같은 블럭안에 랜덤한 데이터로 저장됬다고 보는게 맞나요? 그래서 파이닝이 걸린건가요?

제가 생각한게 맞는지 알수 있을까요?

by jkson [2017.09.18 09:22:53]

처음에 질문을 잘못이해했네요.

EMP 테이블 FULLSCAN의 경우 버퍼피닝 효과보다도

94블럭 안에 14000 row가 전부 존재했다고 보는 게 맞지 않을까요?

인덱스의 경우는 정렬된 형태로 저장되지만 테이블의 경우 정렬과 상관없이 저장되잖아요.

여기서는 버퍼피닝이 거의 안 일어난 것을 알 수 있는 게

dept 인덱스에 접근한 걸 보면 14000row를 접근하는데  14004 블럭을 접근했죠.

sort가 안 되어있는 테이블(emp)을 접근해서 인덱스(dept_pk)로 다시 접근했을 때 이전 row에 있던 deptno

와 불일치했기에 계속 새로운 인덱스 블록에 접근한 거죠.

만약 테이블(emp)이 deptno순으로 정렬되어있었다면 dept_pk 인덱스 접근시 버퍼피닝이 일어나면서

cr이 많이 줄었겠죠.


by 운석 [2017.09.18 17:33:36]

답변 감사 드립니다..ㅎㅎ ^^

아 제가 잘못 알고 있는지 모르겠는데요 버퍼피닝은 연속적으로 같은 블럭에 접근을 하면 자동으로

락이 걸리는 형태로 알고있는데. 이엠피 테이블 94 블럭 안에서 14000로우를 가져오는데 

1블럭에 있는데이터를 여러번 접근 하지 않고 한번에 꺼내 왔다면 버퍼피닝은 발생하지 않았을 것이고

1블럭에 있는 데이터를 연속적으로 여러번 접근해서 데이터를 가져왔다면 버퍼피닝은 발생 했을것 이라고 추정을 했는

데요

아웃터 테이블일 경우에 블럭에 있는데이터를 한번에 꺼내오나요?

인어 테이블일 경우 아웃터 데이터의 한로우씩 가져와서 맞는데이터인지 확인해야 하기때문에

연속적으로 접근하는 방식 일것같은데.. 제 생각이 맞는지 ^^ 지나가는길에 보시면 답변 부탁드려요 ㅎㅎ 


by jkson [2017.09.18 19:02:13]

제가 말씀드린 건 inner/outer 차이가 아니라

emp 한 줄을 읽고 하나의 블럭에 접근하는 dept_pk의 경우 이전에 읽었던 블럭을 다시 읽을 때 버퍼피닝이 발생하는데

emp 테이블은 table full scan이잖아요. 이 경우에는 버퍼피닝의 효과는 거의 없을 것 같다는 말씀이예요.

어차피 블럭을 순차적으로 읽어들일 것이기 때문에 읽었던 블럭을 또 읽을 일이 있나? 하는 것이죠.

select count(distinct block_no) from
(
select DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) block_no 
from emp
)

이렇게 전체 데이블 데이터가 얼마나 많은 블럭에 산재해 있는지 찾아보면

거의 94 근처에서 왔다갔다하지 않을까 하는 말씀을 드린 거예요.

저도 전문가가 아니라 정확히 어떠할 것이다 확언 드릴 수는 없습니다만

테이블풀스캔의 경우에는 버퍼피닝 효과는 많지 않을 것이라(혹은 전혀 없을 수도?) 생각합니다.


by 운석 [2017.09.20 19:51:05]

네 잘 알았습니다 답변 해 주셔서  감사드립니다 ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입