본문으로 바로가기

데이터베이스 Call과 네트워크 부하

1. 데이터베이스 Call 종류

가. SQL 커서에 대한 작업 요청에 따른 구분

Call 종류작업 요청
Parse CallSQL 파싱을 요청하는 Call
Excute CallSQL 실행을 요청하는 Call
Fetch CallSELECT 문의 결과 데이터 전송을 요청하는 Call

나. Call 발생 위치에 따른 구분

1) User Call
  • DBMS 외부로부터 요청되는 Call

  • User Call이 많으면 성능이 좋을 수 없으므로, DBMS 확장성을 높이려면 User Call을 최소화 하려는 노력이 중요함 (Loop 쿼리 해소, Array 단위 Fetch 등)

2) Recursive Call
  • DBMS 내부에서 발생하는 Call

  • SQL 파싱과 최적화 과정에서 발생하는 딕셔너리 조회, 프로시저 내의 SQL수행이 해당

  • Recursive Call을 최소화하려면, 바인드 변수를 사용해 하드파싱 발생횟수를 줄여야 한다.

2. 데이터베이스 Call과 성능

가. One SQL 구현의 중요성

  • 데이터베이스 Call 횟수 1번과 10만번의 차이는 엄청남. One SQL로 구현했을 때 성능 개선 효과↑

  • 서버 내의 일량은 미미하나 대부분 네트워크 구간에서의 소비 또는 데이터베이스 Call이 발생할 때마다 OS로 부터 CPU와 메모리 리소스를 할당 받기 위해 시간 소비

나. 데이터베이스 Call과 시스템 확장성

데이터베이스 Call은 개별 프로그램 수행속도 뿐 아니라 궁극적으로 시스템 전체의 확장성에도 영향을 미친다.

3. Array Processing 활용

Array Processing 기능을 활용하면 한번의 SQL(INSERT/UPDATE/DELETE) 수행으로 다량의 레코드를 동시 처리 (SQL수행시간 감소, CPU사용량 감소) 
예) Insert 할 데이터를 배열에 담기만 하다가 1000건 마다 executeBatch 수행

4. Fetch Call 최소화

가. 부분범위처리 원리

쿼리 결과 집합을 전송할때, 전체 데이터를 연속적으로 전송하지 않고 사용자로부터 Fetch Call이 있을때마다 일정량씩 나누어서 전송하는 것

나. Array Size 조정에 의한 Fetch Call 감소 및 블록 I/O 감소 효과

  • 대량의 데이터 파일을 전송한다면 Array Size 크게하여 Fetch Call 횟수 줄여주는 것이 유리

  • 반대로 적은량의 데이터만 Fetch 하다가 멈추는 프로그램이라면 Array Size를 작게 설정하는 것이 유리

  • Array Size를 증가시키면 네트워크 부하감소 및 서브 프로세스가 읽어야할 블록 갯수 감소 효과

  • Array Size를 무작정 크게 설정한다고 좋은것이 아니며, 일정크기 이상이면 리소스만 낭비하는 결과를 초래할 수 있음

Array Sizefetch 횟수블록I/O
31012
1033
3011

5. 페이지 처리 활용

  • 페이지 단위로, 화면에서 필요한 만큼만 Fetch Call

  • 페이지 단위로, 화면에서 필요한 만큼만 네트워크를 통해 결과 전송

  • 인덱스와 부분 범위 처리 원리를 이용해 각 페이지에 필요한 최소량만 I/O

  • 데이터를 소량씩 나누어 전송하므로 AP웹 서버 리소스 사용량 최소화

6. 분산 쿼리

분산쿼리의 성능을 높이는 핵심은, 힌트 등을 사용하여 데이터 전송량을 줄이는 데 있다.

7. 사용자 정의 함수 / 프로시저의 특징과 성능

가. 프로시저의 특징

  • 실행될 때마다 컨텍스트 스위칭(Context Switching)이 일어남

  • 함수에 내장된 쿼리를 수행할 때마다 Execute Call, Fetch Call이 재귀적으로 일어남

나. 프로시저에 의한 성능 저하 해소 방안

  • 사용자 정의 함수는 소량의 데이터를 조회할 때 또는 부분 범위 처리가 가능한 상황에서 사용

  • 사용자 정의 함수를 풀어 조인 또는 스칼라 서브쿼리로 해결