SQLP Study/Database Call8 08 PL/SQL 함수 호출 부하 해소방안 08 PL/SQL 함수 호출 부하 해소방안 # 함수 사용 적정시기 - 소량의 데이터 조회시 사용 - 대량의 데이서 조회시 부분범위 처리가 가능한 상황에서 제한적으로 사용 - 조인 또는 스칼라 서브쿼리 형태로 변환 - 최후의 방법으로 함수를 쓰되 호출횟수를 최소화 할수 있는 방법 강구 # 함수 호출 부하방안 - 페이지처리(소량의 데이터), 부분범위 처리 활용 - DECODE함수 Case문으로 변환 - 뷰 머지 방지를 통한 함수 호출 최소화 - 스칼라 서브쿼리 캐싱효과를 이용한 함수 호출 최소화 - Deterministic 함수의 캐싱효과 활용 - 복잡한 함수로직을 풀어 SQL로 구현 1) 페이지처리(소량의 데이터), 부분범위 처리 활용 필요한 데이터를 다 만든뒤에 함수를 마지막에 사용. 만약 부분범위처리가.. 2020. 4. 12. 07 PL/SQL 함수의 특징과 성능부하 07 PL/SQL 함수의 특징과 성능부하 1) PL/SQL 함수의 특징 - PL/SQL도 JAVA처럼 인터프리터 언어이기 때문에 Native 코드로 완전 컴파일된 내장함수에 비해 느리다. - 작성한 PL/SQL 함수 실행시 매번 SQL 실행엔진과 PL/SQL 가상머신 사이에 컨텍스트 스위칭이 일어난다. CPU가 여러개 작업을 수행할때 하나의 작업을 마치고 다음작업을 수행하는것이 아니라 여러개의 작업을 동시에 돌아가며 수행하고, 다른 작업을 수행할 때 기존 CPU가 처리하던 프로세스의 수행내용을 백업하기도하고, 다시 CPU가 다른 프로세스를 처리할 때 해당프로세스에서 백업했던 수행내용을 불러오는 작업을 수행하는데 이를 컨텍스트 스위칭이라 한다. 2) Recursive Call을 포함하지 않는 함수의 성능부.. 2020. 4. 12. 06 페이지 처리의 중요성 06 페이지 처리의 중요성 # Database서버에 직접 연결되어 있는 클라이언트 서버(Orange, Toad, Client Tool 등..)에서는 한번 오픈한 커서를 닫지 않고, 사용자 이벤트(스크롤 내려 다음행 보기 같은..)발생시 결과집합을 Array size 만큼 Fetch 할수 있는 기능이 있다. # 웹 어플리케이션 환경에서는 데이터베이스와 연결을 지속적으로 하지 않기 때문에 커서를 계속 열어 놓고 Fetch를 할수 가 없다. 즉, 시용자가 다음 페이지를 요청하거나 스크롤 바를 내릴 때마다 개별적인 SQL문을 수행하는 방식으로 페이지 처리를 구현해야 한다. 그러다보니 페이지 처리구현 방식이 자주 이슈가되곤 한다. # 하기 코드 해설 및 개선 방안 >> 각 로우의 데이터를 계속 Fetch 하다가 .. 2020. 4. 12. 05 Fetch Call 최소화 05 Fetch Call 최소화 1) 부분범위처리 원리 # 1억건의 테이블 조회 - 쿼리툴에서 ( sql developer, Orange, Toad 등등 ) select 명령으로 1억건의 테이블 조회시 엄첨 빠르게 나온다.# 1억건의 테이블 조회가 빠르게 수행되는 이유 - Fetch size 만큼 일단 사용자에게 출력해주고 ( Fetch size가 1000이라면 쿼리툴에 일단 상위 1000 line만 출력됨 ) ,사용자가 Fetch call을 유발하는 행동 ( 마우스 스크롤을 하여, 1000 line 이후 라인을 보려는 행동 )을 하면 다음 Fetch size 만큼 일단 사용자에게 출력해주기 때문에 빠르다. 즉 Fetch size만큼씩만 사용자에게 우선적으로 보여주고 전체 요청내용을 바로 보여주지 않기 .. 2020. 4. 12. 04 Array Processing 활용 04 Array Processing 활용 # Array Processing 기능을 사용하면 한번의 SQL수행으로 다량의 로우를 insert/update/delete 할수 있다. 이를 통해 Network를 통한 데이터베이스 Call을 감소시켜 SQL수행시간과 CPU 사용량을 줄일 수 가 있다. # 예시상황 : "03 데이터베이스 Call이 성능에 미치는 영향"에 있는 예시상황 1) 3만건인 월요금납부실적 테이블에서 각로우를 fetch하여 읽은 다음 조건에 맞게끔 납입방법별_월요금집계 테이블에 중복삽입 2) stmt1.setFetchSize(1000); 구문을 통해 월요금납부실적 테이블을 fetch 할때 1000건씩 fetch 3) select시 fetch call : 30 insert시 execute ca.. 2020. 4. 12. 03 데이터베이스 Call이 성능에 미치는 영향 03 데이터베이스 Call이 성능에 미치는 영향 # 예시상황 세금납부에 대한 서비스중 하기의 테이블이 있다. '월요금납부_실적' 테이블은 고객별로 하나의 례코드로 입력 '납입방법별_월요금집계' - 닙입방법코드별로 하나의 례코드로 입력 기간계(OLTP)와 정보계(DW)서비스에 서는 각각 아래와 같은 방법으로 서비스를 운영한다. 기간계 시스템에서는 주로 고객별로 조회 >> 월요금납부_실적 테이블을 주로 모델링하여 사용 정보계 시스템에서는 주로 납입방법별로 조회 >> 납입방법별_월요금집계 테이블을 주로 모델링하여 사용각서비스의 데이터를 공유하거나, 기간계에 입력된 데이터를 정보계에 데이터 Migration을 할 때 ETL( 추출, 변환, 적제 ) 배치프로그램을 사용하여 서로 다른 테이블 모델링에 데이터를 넘긴.. 2020. 4. 12. 02 User Call VS Recursive Call 02 User Call VS Recursive Call # 정의 1) User Call : OCI(Oracle Call Interface)를 통해 외부로부터 들어오는 Call 2) Recursive Call : 오라클 내부에서 발생하는 Call, - SQL파싱과 최적화 과정에서 발생하는 Data Dictionary 조회, - PL/SQL로 작성된 사용자 정의 함수 , Procedure , Trigger로 인한 SQL수행 # 특징 1) User Call * User Call 발생 빈도를 결정하는 요소들 * 개발자의 기술 * 프레임워크 내에 Array processing을 지원유무 * 설계 표준 가이드 * 사용자 정의 함수/프로시저에 대한 무조건적인 제약 * 모듈이 지나치게 단위로 구성되어 SQL이 건건이 .. 2020. 4. 12. 01 Call 통계, 쿼리별 Parse, Execute, Fetch Call 발생 유형 01 Call 통계 1) Parse Call : 커서를 파싱하는 과정( 실행계획을 생성하거나, 찾는 과정 )을 수행한 횟수 2) Execute Call : 커서를 실행하는 과정을 수행한 횟수 3) Fetch Call : select문에서 실제 레코드를 읽어 사용자가 요구한 결과집합을 출력한 횟수# select 문일 때 Execute Call 단계에서는 커서만 오픈하고, 실제 데이터를 처리하는 과정은 모두 Fetch 단계에서 일어난다. # group by 문장은 Fetch 지점에서 처리가 일어남 # Fetch Call이 발생하지 않는 DML >> insert, update, delete, merge # insert .. select 문장은 클라이언트로부터 받은 명령에 의해 명시적인 Fetch Call이 발.. 2020. 4. 12. 이전 1 다음