h1. 제3절 데이터베이스 Call과 네트워크 부하 1. 데이터베이스 Call 종류 2. 데이터베이스 Call 과 성능 3.Array Processing 활용 4. Fetch Call 최소화 5.페이지 처리 활용 6.분산 쿼리 7.사용자 정의 함수 / 프로시저의 특징과 성능 {panel:title=1. 데이터베이스 Call 종류 | borderColor=#ccc | titleBGColor=#B0C4DE | bgColor=#ffffff} |
1) Parse Call : SQL 파싱을 요청한느 Call
2) Execute Call : SQL 실행을 요청하는 Call
3) Fetch Call : SELECT 문의 결과 데이터 전송을 요청하는 Call
1) User Call
2)Recursive Call
2. 데이터베이스 Call 과 성능
3.Array Processing 활용
4. Fetch Call 최소화
set arraysize 100
call count cpu elapsed disk query current rows
----- ----- ----- ------- ----- ----- ----- ------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.02 2 2 0 0
Fetch 301 0.14 0.18 9 315 0 30000
----- ----- ----- ------- ----- ----- ----- ------
total 303 0.14 0.20 11 317 0 30000
ArraySize | Fetch 횟수 | 블록I/O |
---|---|---|
3 | 10 | 12 |
10 | 3 | 3 |
30 | 1 | 1 |
1) Oracle PL/SQL(커서를 열고 레코드를 Fetch)
-9i : 한번에 한 로우씩만 처리(Single-Row Fetch)
-10g : 자동으로 100개씩 array Fetch가 일어남. (Cursor For Loop 구문을 이용할때만 작동)
for item in cursor
loop
......
end loop;
2) JAVA(FetchSize를 100으로 설정했을때 데이터를 Fetch 해오는 매커니즘)
String sql = "select custid, name from customer";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setFetchSize(100); -- Statement에서 조정
ResultSet rs = stmt.executeQuery();
// rs.setFetchSize(100); -- ResultSet에서 조정할 수도 있다.
while( rs.next() ) {
int empno = rs.getInt(1);
String ename = rs.getString(2);
System.out.println(empno + ":" + ename);
}
rs.close();
stmt.close();
1. 최초 rs.next() 호출 시 한꺼번에 100건을 가져와서 클라이언트 Array 버퍼에 캐싱한다.
2. 이후 rs.next() 호출할 때는 데이터베이스 Call을 발생시키지 않고 Array 버퍼에서 읽는다.
3. 버퍼에 캐싱 돼 있던 데이터를 모두 소진한 후 101번째 rs.next() 호출 시 다시 100건을 가져온다.
4. 모든 결과집합을 다 읽을 때까지 2~3번 과정을 반복한다.
5.페이지 처리 활용
6.분산 쿼리
분산 DB간 테이블 조인
select channel_id, sum(quantity_sold) auantity_cold
from order a, sales@lk_sales b
where a.order_date between :1 and :2
and b.order_no = a.order no
group by channel_id
Rows Row Source Operation
----- ---------------------------------------------
5 SORT GROUP BY
10981 NESTED LOOPS
500000 REMOTE
10981 TABLE ACCESS BY INDEX ROWID ORDER
500000 INDEX UNIQUE SCAN (ORDER_PK)
분산 DB 간의 성능저하 해결방안
select /*+ driving_site(b) */ channel_id, sum(quantity_sold) auantity_cold
from order a, sales@lk_sales b
where a.order_date between :1 and :2
and b.order_no = a.order_no
group by channel_id
Rows Row Source Operation
---- ---------------------------------------------
5 SORT GROUP BY
10981 NESTED LOOPS
939 TABLE ACCESS (BY INDEX ROWID) OF 'ORDER'
939 INDEX (RANGE SCAN) OF 'ORDER_IDX2' (NON-UNIQUE)
10981 REMOTE
분산쿼리의 성능을 높이는 핵심은, 네트워크를 통한 데이터 전송량을 줄이는 데 있다
7.사용자 정의 함수 / 프로시저의 특징과 성능
create or replace function date_to_char(p_dt date) return varchar2 as
begin
return to_char(p_dt, 'yyyy/mm/dd hh24:mi:ss');
end;
/
=> to_char 함수를 바로 호출할때보다 훨씬 느림
|