7부. 애플리케이션 입장에
서의
SQL 튜닝(1~8장)
실무로 배우는 시스템 성능 최적화
아꿈사 스터디 - 정민철
텍스트
기본방향
▸애플리케이션 최적화 전문가: 시스템 업무 전반적 최적화
▸애플리케이션 SQL 튜닝 중점 항목
▸중복 수행 제거
▸불필요한 수행 제거
▸최적 수행
▸수행 통합
▸집합처리
▸트랜젝션 처리
텍스트
텍스트
중복수행 SQL 제거
▸CBD(Component Based Development) 개발의 문제점
텍스트
중복수행 SQL 제거
▸중복 수행의 문제점
▸DB 수행 시간 외의 시간(네트워크, DB드라이버)이 쌓여서
늘어남
▸수 많은 JDBC 객체 생성으로 GC에 영향을 줌
▸해결책은 캐시 사용
텍스트
애플리케이션 캐시의 종류
캐시 분류 공유 범위 데이터 생명주기
적용 데이터
의 양
캐시 수 적용
블록 함수 사용 함수 내 소량 수행중인 해당 함수의 수 개발자 코드
요청 서비스 서비스 요청 소량 수행중인 스레드 수 프레임워크
세션 사용자 요청
세션 타임아웃, 로그아
웃
극소량 시스템 내 사용자 세션 수
HTTP세션,
사용자 세션
프로세스 인스턴스
타임아웃, 개수, 기간
등
중량 인스턴스당 1개
프레임워크,
솔루션
프로세스간
공유
시스템 전체
타임아웃, 개수, 기간
등
대량 시스템당 1개 이상 솔루션
텍스트
요청캐시 동작
텍스트
캐시 적용의 예
텍스트
불필요한 SQL 수행 제거
▸공통모듈
▸여러 업무정보를 전부 제공해주려는 경향이 있음
▸따라서 사용 시 필요하지 않은 정보를 추가 조회 하는 경우가 많음
▸불필요한 쿼리 개선 시 고려사항
▸공통기능 수행 모듈 우선 대상
▸조회결과 단위 분류(쿼리, 내부 서브모듈 단위로)
▸결과값 중 주로 사용하는 값 유형 조사
▸잘못 사용할 경우 전체 소스 대상으로 패턴 확인
▸사용값을 패턴과 모듈 구성에 따라 개선하는 방안 도출
텍스트
최적수행: ROWNUM 추가
▸Fetch 크기: 한번에 보내는 레코드 건수, 여러건 조회의 경우
값이 클수록 효율 증가
▸Rownum 조건을 where문에 지정
▸1건만 조회 혹은 사용: 1로 지정하여 추가DB접근 방지
▸카운트 쿼리 중 필요 이상 건수를 구하는 경우: ROWNUM
<= 1
▸우선순위에 따른 선택 수행을 위해: ROWNUM = 1
텍스트
최적수행: ROWNUM 추가
텍스트
최적수행: 파티션 키 추가
▸파티션 테이블 사용 목적
▸탐색 범위 축소
▸입력 시 부하분산
▸장애 시 부분 백업 및 복구
▸글로벌 인덱스: 모든 파티션을 인덱스 함
▸데이터 변경 시 재 생성 이전에 사용불가 상태가 됨
▸사용불가 시 해당 인덱스 사용하는 쿼리 급격한 성능저하
▸가급적 로컬 인덱스 사용 및 예외적인 경우만 글로벌 인덱스 사용
텍스트
최적수행: 파티션 키 추가
▸파티션 키가 Where조건에 포함되지 않으면 전체 파티션 탐색
▸테이블이 파티션 된 경우 파티션 키가 업무 규칙상 필요 없어도
넣어야 함
▸파티션 키로 쿼리를 2개로 분리해 부분 범위탐색 시도
▸1차 쿼리: 파티션 키를 활용해 검색범위를 좁혀서 탐색
▸2차 쿼리: 전체 탐색
▸다른 입력값을 바탕으로 파티션 키값 범위 설정
▸파티션 키와의 연관관계를 유추해 탐색 범위를 줄임
텍스트
조회항목 사용 여부
▸고성능 쿼리
▸반드시 필요한 컬럼만 제공해서 성능 향상
▸필요없는 컬럼 제거
▸조인 테이블 최소화 및 제거
텍스트
쿼리통합
▸쿼리통합
▸SELECT의 집합처리
▸여러번 수행할 쿼리를 한번에 수행해 성능 개선
▸메인/서브 쿼리로 나눠 실행되는 것을 1개로 통합
▸병렬쿼리 통합: 여러개의 개별 조회문으로 구성된 쿼리를
Union all이나 1:1 JOIN형태로 통합
텍스트
DB 집합처리
▸배치에서 입력/수정/삭제 집합 처리(Array Batch)
▸한 트랜젝션 내에서 동일한 테이블에 CUD를 여러건 처리하
는 작업은 집합 처리 적용
▸집합 처리 시 자바 힙 메모리 부족에 주의(적절하게 건수 조절
)
텍스트
트랜잭션 처리
▸트랜젝션 처리 시 쿼리가 락을 점유하는 시간을 최소화
텍스트
복합적인 기능을 수행하는 쿼리 제거
▸복합 기능 쿼리: 하나의 쿼리에 1개 이상의 기능이 담긴 쿼리
▸한개의 실행 계획만 가지고 실행 => 다양한 조건의 실행 계획
수립 불가
▸쿼리 분리: 적절한 인덱스를 선택 기준
▸Union all을 이용해 하나의 쿼리에 여러 개의 select 구성
▸실행 조건문 추가: 입력값에 따라 테이블 접근 제한
▸NVL, DECODE, 힌트 활용
▸검색 조건으로 분산도가 좋은 항목이 필수 입력항목이 되도록 업
무협의
텍스트
스칼라 서브쿼리 사용 시 주의사항
▸스칼라 서브 쿼리: SELECT절에 사용된 쿼리
▸서브쿼리에 분산도가 좋은 적절한 인덱스 사용
▸전체 쿼리결과가 소량인 경우 사용
▸조인 처리해서 성능 개선
텍스트
페이징 처리
▸목록 전체 접근: 전체 건수조회, 전체 페이지 수 표시
▸필요없거나 무의미한 전체 조회 제거
▸초기에 전체 건수 및 페이지 수 생성 후 재활용(변경이 적은 경우)
▸3~4 페이지 캐시 후 대상 목록 변경 시 재 생성
▸정렬된 결과를 얻기 위해 Order by를 사용해서 전체 접근
▸Order by 순서와 일치하는 페이징 인덱스 생성
▸페이징 인덱스 칼럼 값을 페이지 이동 시 다음 키값으로 사용
▸동적 정렬은 필수적인 경우에만 제한적으로 제공
텍스트
페이징 처리
▸분산도가 좋은 필수 입력항목이 없어 넓은 범위 접근
▸분산도가 좋은 입력 항목을 필수 항목으로 지정 및 자동 초
기값 지정
▸기간 조회는 조회 가능 최대기한 설정, 기본 기간은 작게 설
정
텍스트
페이징 인덱스

7부. 애플리케이션 입장에서의 성능 튜닝 (1~8장)

  • 1.
    7부. 애플리케이션 입장에 서의 SQL튜닝(1~8장) 실무로 배우는 시스템 성능 최적화 아꿈사 스터디 - 정민철
  • 2.
    텍스트 기본방향 ▸애플리케이션 최적화 전문가:시스템 업무 전반적 최적화 ▸애플리케이션 SQL 튜닝 중점 항목 ▸중복 수행 제거 ▸불필요한 수행 제거 ▸최적 수행 ▸수행 통합 ▸집합처리 ▸트랜젝션 처리
  • 3.
  • 4.
    텍스트 중복수행 SQL 제거 ▸CBD(ComponentBased Development) 개발의 문제점
  • 5.
    텍스트 중복수행 SQL 제거 ▸중복수행의 문제점 ▸DB 수행 시간 외의 시간(네트워크, DB드라이버)이 쌓여서 늘어남 ▸수 많은 JDBC 객체 생성으로 GC에 영향을 줌 ▸해결책은 캐시 사용
  • 6.
    텍스트 애플리케이션 캐시의 종류 캐시분류 공유 범위 데이터 생명주기 적용 데이터 의 양 캐시 수 적용 블록 함수 사용 함수 내 소량 수행중인 해당 함수의 수 개발자 코드 요청 서비스 서비스 요청 소량 수행중인 스레드 수 프레임워크 세션 사용자 요청 세션 타임아웃, 로그아 웃 극소량 시스템 내 사용자 세션 수 HTTP세션, 사용자 세션 프로세스 인스턴스 타임아웃, 개수, 기간 등 중량 인스턴스당 1개 프레임워크, 솔루션 프로세스간 공유 시스템 전체 타임아웃, 개수, 기간 등 대량 시스템당 1개 이상 솔루션
  • 7.
  • 8.
  • 9.
    텍스트 불필요한 SQL 수행제거 ▸공통모듈 ▸여러 업무정보를 전부 제공해주려는 경향이 있음 ▸따라서 사용 시 필요하지 않은 정보를 추가 조회 하는 경우가 많음 ▸불필요한 쿼리 개선 시 고려사항 ▸공통기능 수행 모듈 우선 대상 ▸조회결과 단위 분류(쿼리, 내부 서브모듈 단위로) ▸결과값 중 주로 사용하는 값 유형 조사 ▸잘못 사용할 경우 전체 소스 대상으로 패턴 확인 ▸사용값을 패턴과 모듈 구성에 따라 개선하는 방안 도출
  • 10.
    텍스트 최적수행: ROWNUM 추가 ▸Fetch크기: 한번에 보내는 레코드 건수, 여러건 조회의 경우 값이 클수록 효율 증가 ▸Rownum 조건을 where문에 지정 ▸1건만 조회 혹은 사용: 1로 지정하여 추가DB접근 방지 ▸카운트 쿼리 중 필요 이상 건수를 구하는 경우: ROWNUM <= 1 ▸우선순위에 따른 선택 수행을 위해: ROWNUM = 1
  • 11.
  • 12.
    텍스트 최적수행: 파티션 키추가 ▸파티션 테이블 사용 목적 ▸탐색 범위 축소 ▸입력 시 부하분산 ▸장애 시 부분 백업 및 복구 ▸글로벌 인덱스: 모든 파티션을 인덱스 함 ▸데이터 변경 시 재 생성 이전에 사용불가 상태가 됨 ▸사용불가 시 해당 인덱스 사용하는 쿼리 급격한 성능저하 ▸가급적 로컬 인덱스 사용 및 예외적인 경우만 글로벌 인덱스 사용
  • 13.
    텍스트 최적수행: 파티션 키추가 ▸파티션 키가 Where조건에 포함되지 않으면 전체 파티션 탐색 ▸테이블이 파티션 된 경우 파티션 키가 업무 규칙상 필요 없어도 넣어야 함 ▸파티션 키로 쿼리를 2개로 분리해 부분 범위탐색 시도 ▸1차 쿼리: 파티션 키를 활용해 검색범위를 좁혀서 탐색 ▸2차 쿼리: 전체 탐색 ▸다른 입력값을 바탕으로 파티션 키값 범위 설정 ▸파티션 키와의 연관관계를 유추해 탐색 범위를 줄임
  • 14.
    텍스트 조회항목 사용 여부 ▸고성능쿼리 ▸반드시 필요한 컬럼만 제공해서 성능 향상 ▸필요없는 컬럼 제거 ▸조인 테이블 최소화 및 제거
  • 15.
    텍스트 쿼리통합 ▸쿼리통합 ▸SELECT의 집합처리 ▸여러번 수행할쿼리를 한번에 수행해 성능 개선 ▸메인/서브 쿼리로 나눠 실행되는 것을 1개로 통합 ▸병렬쿼리 통합: 여러개의 개별 조회문으로 구성된 쿼리를 Union all이나 1:1 JOIN형태로 통합
  • 16.
    텍스트 DB 집합처리 ▸배치에서 입력/수정/삭제집합 처리(Array Batch) ▸한 트랜젝션 내에서 동일한 테이블에 CUD를 여러건 처리하 는 작업은 집합 처리 적용 ▸집합 처리 시 자바 힙 메모리 부족에 주의(적절하게 건수 조절 )
  • 17.
    텍스트 트랜잭션 처리 ▸트랜젝션 처리시 쿼리가 락을 점유하는 시간을 최소화
  • 18.
    텍스트 복합적인 기능을 수행하는쿼리 제거 ▸복합 기능 쿼리: 하나의 쿼리에 1개 이상의 기능이 담긴 쿼리 ▸한개의 실행 계획만 가지고 실행 => 다양한 조건의 실행 계획 수립 불가 ▸쿼리 분리: 적절한 인덱스를 선택 기준 ▸Union all을 이용해 하나의 쿼리에 여러 개의 select 구성 ▸실행 조건문 추가: 입력값에 따라 테이블 접근 제한 ▸NVL, DECODE, 힌트 활용 ▸검색 조건으로 분산도가 좋은 항목이 필수 입력항목이 되도록 업 무협의
  • 19.
    텍스트 스칼라 서브쿼리 사용시 주의사항 ▸스칼라 서브 쿼리: SELECT절에 사용된 쿼리 ▸서브쿼리에 분산도가 좋은 적절한 인덱스 사용 ▸전체 쿼리결과가 소량인 경우 사용 ▸조인 처리해서 성능 개선
  • 20.
    텍스트 페이징 처리 ▸목록 전체접근: 전체 건수조회, 전체 페이지 수 표시 ▸필요없거나 무의미한 전체 조회 제거 ▸초기에 전체 건수 및 페이지 수 생성 후 재활용(변경이 적은 경우) ▸3~4 페이지 캐시 후 대상 목록 변경 시 재 생성 ▸정렬된 결과를 얻기 위해 Order by를 사용해서 전체 접근 ▸Order by 순서와 일치하는 페이징 인덱스 생성 ▸페이징 인덱스 칼럼 값을 페이지 이동 시 다음 키값으로 사용 ▸동적 정렬은 필수적인 경우에만 제한적으로 제공
  • 21.
    텍스트 페이징 처리 ▸분산도가 좋은필수 입력항목이 없어 넓은 범위 접근 ▸분산도가 좋은 입력 항목을 필수 항목으로 지정 및 자동 초 기값 지정 ▸기간 조회는 조회 가능 최대기한 설정, 기본 기간은 작게 설 정
  • 22.