본문 바로가기

스터디/오라클 성능고도화 원리와 해법141

05.데이터베이스 Call 최소화 원리 - 08.PL/SQL 함수 호출 부하 해소 방안 [해당 챕터는 예제가 많아서 1차정리 후 추후에 다시 정리하겠습니다] 사용자 정의 함수는 소량의 데이터 조회시에만 사용하는 것이 좋습니다. 대용량 데이터를 조회할 때는 부분범위처리가 가능한 상황에서 제한적으로 사용해야 하며, 될 수 있으면 조인 또는 스칼라 서브쿼리 형태로 변환하려는 노력이 필요합니다. 어쩔수 없이 함수를 쓸때는 호출 횟수를 최소화 할 수 있는 방법을 강구해야 합니다. 호출횟수를 최소화 할 수 있는 방법 (1)페이지 처리 또는 부분범위처리 활용 (2)Decode 함수 또는 Case문으로 변환 (3)뷰 머지(View Merge)방지를 통한 함수 호출 최소화 힌트에 NO_MERGE 사용하기, ROWNUM을 사용하기 (4)스칼라 서브쿼리의 캐싱효과를 이용한 함수 호출 최소화 스칼라 서브쿼리를 .. 2020. 2. 5.
05.데이터베이스 Call 최소화 원리 - 07.PL/SQL 함수의 특징과 성능부하 (1) PL/SQL함수의 특징 오라클은 PL/SQL로 작성된 함수/프로시저의 이식성을 고려해 오라클 서버가 아닌 Oracle Forms, Oracle Reports 같은 제품에서도 수행될 수 있도록 설계하였습니다. 그래서 PL/SQL로 작성한 함수와 프로시저를 컴파일하면 JAVA언어처럼 바이트코드가 생성되며, 이를 해석하고 실행할 수 있는 PL/SQL엔진만 있다면 어디서든 실행될 수 있습니다. 바이트코드는 데이터 딕셔너리에 저장되었다가 런타임 시 해석됩니다. 지금은 가장 인기 있는 개발언어가 된 JAVA가 초기에 고전했던 이유는 바로 속도 때문이었는데, PL/SQL도 JAVA처럼 인터프리터 언어기 때문에 Native 코드로 완전 컴파일된 내장 함수에 비해 많이 느립니다. 이 문제를 극복하려고 오라클 9i.. 2020. 2. 3.
05.데이터베이스 Call 최소화 원리 - 06. 페이지 처리의 중요성 클라이언트/서버 환경에서 대용량 데이터를 조회할 때는 커서를 닫지 않은 채 사용자 이벤트(스크롤 바를 내리거나 ‘다음’버튼을 클릭 하는 행위 등)가 발생할 때마다 결과 집합을 Fetch하도록 구현할 수 있었습니다. 웹 애플리케이션 환경에서는 커서를 계속 오픈한 채로 결과집합을 핸들링할 수 없습니다. 즉, 데이터베이스와의 연결을 지속하지 않는 웹 환경이기 때문에 사용자가 다음 페이지를 요청하거나 스크롤 바를 내릴때 마다 개벼럭인 SQL문을 수행하는 방식으로 페이지 처리를 구현해야 합니다. 그러다 보니 페이지 처리 구현 방식이 자주 이슈가 되곤 합니다. i := 0; loop fetch c into l_record; exit when (c%notfound or (i = pageNo * pageSize)); .. 2020. 2. 2.
05.데이터베이스 Call 최소화 원리 - 05. Fetch Call 최소화 (1)부분범위처리 원리 공사장에서 시멘트를 이용해 벽돌을 쌓는 동안 운반공이 벽돌을 실어 나르는 상황을 상상해봅니다. 벽돌은 많이 있어서 한번에 다 옮길 수 없으며 한 수레(array size)씩 운반해야 합니다. 운반공은 미장공이 벽돌을 더 가져오라는 요청(Fetch Call)이 있을때만 벽돌을 운반합니다. 추가요청이 없으면 더 이상 운반하지 않습니다. DBMS도 이와 마찬가지로 데이터를 클라이언트에게 전송할 때 일정량씩 나누어 전송하며, 오라클의 경우 Array Size(또는 Fetch Size)설정을 통해 운반단위를 조절합니다. 전체 결과집합 중 아직 전송하지 않은 분량이 많이 남아있어도 클라이언트로부터 추가 Fetch Call을 받기 전까지는 그대로 멈춰 서서 기다립니다. 이게 OLTP성 환경에서.. 2020. 1. 30.