3. Deterministic 함수 사용 시 주의사항
2010.07.19 09:00
- Deterministic 키워드는, 함수의 입력 값이 같다면 출력 값도 항상 같음을 선언 (10gR2에 새롭게 추가된 캐싱 효과)
- 함수의 일관된 결과를 보장해 주는 역할을 하지 않음
- Deterministic 함수로 선언했는데 실제 내용이 Deterministic이 아닐 시 문제 발생
(컬럼의 값 변경 시 일관성을 해치는 문제 발생)
- Deterministic 함수가 호출 시 캐싱 효과는 Fetch Call 내에서만 유효
(새로운 Fetch Call 시점에서 일관성이 유지되지 않는 문제 발생 가능)
SQL> create or replace function lookup(l_input number) return varchar2
2 DETERMINISTIC
3 as
4 l_output LookupTable.value%TYPE;
5 begin
6 select value into l_output from LookupTable where key = l_input;
7 return l_output;
8 end;
9 /
사용자 정의 함수 사용 시 일관성이 없는 읽기의 쿼리 | 사용자 정의 함수 사용 시 일관성 문제 해결 쿼리 |
select /*+ index(t t_no_idx) */ (select lookup(t.no) from dual)
| select l.value |
select (select value from LookupTable where key = t.no) from big_table t ; |
☞ Join, 스칼라 서브쿼리 사용
→ 스칼라 서브쿼리는 메인 쿼리가 시작되는 시점을 기준으로 블록 읽기 때문에 읽기 일관성 보장
- Deterministic 키워드는 FBI(Function-Based Index)와 함께 태동
- FBI는 인덱스가 처음 생성 또는 엔트리가 추가되는 시점의 함수 출력 값을 저장해 두는 원리
- 오라클은 Deterministic으로 선언하지 않은 함수에 대해서 FBI 생성 거부
☞ FBI 생성 시 Deterministic을 선언하도록 강제함
▼ Deterministic 이 아닌데 Deterministic 선언으로 일관성이 깨지는 사례 (Windows7, Oracle 11g)
Update
전
Update
후
※ FBI 생성 외, update문으로 반정규화 컬럼을 갱신하거나 insert문으로 가공 테이블에 레코드 삽입 시
중간에 값이 변경되면 일관성 없는 상태로 값들이 영구 저장될 수 있음
☞ 캐싱 효과를 얻기 위해 함부로 Deterministic으로 선언하는 것은 위험
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
47 | 2. 트랜잭션 수준 읽기 일관성 | 휘휘 | 2010.06.07 | 19568 |
46 | 3. 비관적 vs. 낙관적 동시성 제어 | 휘휘 | 2010.06.07 | 8210 |
45 | 4. 동시성 구현 사례 | 토시리 | 2010.06.07 | 10932 |
44 | 5. 오라클 Lock | 휘휘 | 2010.06.07 | 26368 |
43 | 7. Response Time Analysis 방법론과 OWI | balto | 2010.06.13 | 8062 |
42 | 8. Statspack / AWR | balto | 2010.06.13 | 12766 |
41 | 9. ASH(Active Session History) | 실천하자 | 2010.06.14 | 15607 |
40 | 11. End-To-End 성능관리 | 휘휘 | 2010.06.14 | 8095 |
39 | 12. 데이터베이스 성능 고도화 정석 해법 | 휘휘 | 2010.06.14 | 7152 |
38 | 5. V$SYSSTAT [1] | 토시리 | 2010.06.14 | 9848 |
37 | 10. V$SQL | 실천하자 | 2010.06.14 | 12675 |
36 | 6. V$SYSTEM_EVENT | 토시리 | 2010.06.14 | 6523 |
35 | 3. 라이브러리 캐시 구조 | balto | 2010.06.28 | 9849 |
34 | 4. 커서 공유 | balto | 2010.06.28 | 9199 |
33 | 1. SQL과 옵티마이저 | 휘휘 | 2010.06.28 | 7218 |
32 | 2. SQL 처리과정 | 휘휘 | 2010.06.28 | 15340 |
31 | 4장. 라이브러리 캐시 최적화 원리 | 휘휘 | 2010.06.28 | 6913 |
30 | 5. 바인드 변수의 중요성 | 실천하자 | 2010.06.28 | 11765 |
29 | 6. 바인드 변수의 부작용과 해법 | 실천하자 | 2010.06.28 | 14666 |
28 | 7. 세션 커서 캐싱 | 토시리 | 2010.06.29 | 10620 |