오라클은 DB link와 synonym을 통해서 remote oracle database에 있는 table을 local database 서버에 있는 것처럼 query가 가능합니다. 하지만 내부적으로는 remote database로 관련 query를 수행해 return 되는 데이터를 이용해 결과 값을 출력해줍니다. (당연하죠..ㅎㅎ) 그러나 remote database의 table에 대한 정보가 없기 때문에 일반적인 role을 이용해 query를 생성, 수행 요청하게 됩니다.
아래 box 안의 role은 remote database로 query를 수행하는 일반적인 규칙입니다. 참조한 문서가 오래전꺼긴 한데, 큰 차이는 없으리라.. 생각되는 군요.
간단히 보자면 ..
MAX() 같은 group 함수는 전달 되지 않으니, 테이블의 범위에 따라서는 엄청난 데이터가 local로 전송된 후 MAX() 값 등을 구할 수도 있겠군요.
또 상수 조건이 있는 table은 remote로 해당 조건이 전달 되겠지만, 그렇지 않은 경우는 FULL TABLE SCAN을 할 수 도 있겠고요..
ORDER BY도 local에서 수행된다니, 대상이 많으면 이것도 성능에 영향을 줄 수 있겠네요.
- Aggregate functions like MAX(), COUNT() are NOT passed across the net but rather are performed on the local node.
- Expressions in the SELECT list are decomposed into columns and evaluated when the data is retrieved.
- Only a relevant subset of columns are fetched across the net.
- An expression in a WHERE clause is passed across to the remote database if it compares the remote column to a literal (eg ename = 'KING').
- Expressions in a WHERE clause are passed to the remote database if all columns are in the expression are located in the same remote table the remote database (eg emp.sal * 0.20 > emp.bonus)
- Datatype conversion functions like TO_CHAR() in a WHERE clause are subject to the conditions in #4 and #5.
- The optimizer only has knowledge of local indexes when making decisions about how to execute a query.
- Remote indexes can be still be used to resolve the decomposed query sent to the remote database.
- GROUP BY is not sent to the remote database.
- ORDER BY is not sent to the remote database.
이 내용은 oracle metalink "Note 1004553.6 DISTRIBUTED QUERY ANALYSIS"를 참조했습니다.
써놓고 보니 DB link를 이용하지 말라는 이야기가 된 것 같아 몇줄 더 씁니다.
물론 group 함수, order by 등의 처리가 local database에서 처리가 되지만 이러한 것들을 피해가는 방법들은 다 있기 마련이죠. view를 만들어 remote에서 group 함수 처리를 한다든지, join의 경우 아예 한 곳에서 처리하게 한다든지, temporary table을 만들어 처리하거나.. 뭐 이런
요는 network을 통한 전달되는 데이터의 양을 얼마나 많이 줄이느냐 겠죠.
위의 metalink note 보시면 몇몇 예제가 있으니 참조하세요.
물론 group 함수, order by 등의 처리가 local database에서 처리가 되지만 이러한 것들을 피해가는 방법들은 다 있기 마련이죠. view를 만들어 remote에서 group 함수 처리를 한다든지, join의 경우 아예 한 곳에서 처리하게 한다든지, temporary table을 만들어 처리하거나.. 뭐 이런
요는 network을 통한 전달되는 데이터의 양을 얼마나 많이 줄이느냐 겠죠.
위의 metalink note 보시면 몇몇 예제가 있으니 참조하세요.
'Oracle Database' 카테고리의 다른 글
오라클의 모든 소프트웨어는 무료로 다운로드 가능합니다 (2) | 2009.10.27 |
---|---|
Oracle Data Block Prefetching (0) | 2009.10.26 |
oracle pre complier의 그 유명한 hold_cursor/release_cursor option (0) | 2009.10.22 |
oracle partition name 변경하기 (0) | 2009.10.22 |
oracle partition table 중간에 partition 추가하기 (split partition) (0) | 2009.10.22 |