22
7 부 . 부부부부부부 부부부부부 SQL 부부 (1~8 부 ) 부부부 부부부 부부부 부부 부부부 부부부 부부부 - 부부부

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

Embed Size (px)

Citation preview

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

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

실무로 배우는 시스템 성능 최적화아꿈사 스터디 - 정민철

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

텍스트

기본방향▸ 애플리케이션 최적화 전문가 : 시스템 업무 전반적 최적화▸ 애플리케이션 SQL 튜닝 중점 항목

▸ 중복 수행 제거▸ 불필요한 수행 제거▸ 최적 수행▸ 수행 통합▸ 집합처리▸ 트랜젝션 처리

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

텍스트

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

텍스트

중복수행 SQL 제거▸ CBD(Component Based Development) 개발의 문제점

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

텍스트

중복수행 SQL 제거▸ 중복 수행의 문제점

▸ DB 수행 시간 외의 시간 ( 네트워크 , DB 드라이버 ) 이 쌓여서 늘어남▸ 수 많은 JDBC 객체 생성으로 GC 에 영향을 줌

▸ 해결책은 캐시 사용

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

텍스트

애플리케이션 캐시의 종류 캐시 분류 공유 범위 데이터 생명주기 적용

데이터의 양 캐시 수 적용

블록 함수 사용 함수 내 소량 수행중인 해당 함수의 수 개발자 코드

요청 서비스 서비스 요청 소량 수행중인 스레드 수 프레임워크

세션 사용자 요청 세션 타임아웃 , 로그아웃 극소량 시스템 내 사용자 세션 수 HTTP 세션 , 사용자 세션

프로세스 인스턴스 타임아웃 , 개수 , 기간등 중량 인스턴스당 1 개 프레임워크 ,솔루션 프로세스간공유 시스템 전체 타임아웃 , 개수 , 기간등 대량 시스템당 1 개 이상 솔루션

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

텍스트

요청캐시 동작

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

텍스트

캐시 적용의 예

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

텍스트

불필요한 SQL 수행 제거▸ 공통모듈

▸ 여러 업무정보를 전부 제공해주려는 경향이 있음▸ 따라서 사용 시 필요하지 않은 정보를 추가 조회 하는 경우가 많음

▸ 불필요한 쿼리 개선 시 고려사항▸ 공통기능 수행 모듈 우선 대상▸ 조회결과 단위 분류 ( 쿼리 , 내부 서브모듈 단위로 )▸ 결과값 중 주로 사용하는 값 유형 조사▸ 잘못 사용할 경우 전체 소스 대상으로 패턴 확인▸ 사용값을 패턴과 모듈 구성에 따라 개선하는 방안 도출

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

텍스트

최적수행 : ROWNUM 추가▸ Fetch 크기 : 한번에 보내는 레코드 건수 , 여러건 조회의 경우 값이 클수록 효율 증가▸ Rownum 조건을 where 문에 지정

▸ 1 건만 조회 혹은 사용 : 1 로 지정하여 추가 DB 접근 방지▸ 카운트 쿼리 중 필요 이상 건수를 구하는 경우 : ROWNUM <=

1▸ 우선순위에 따른 선택 수행을 위해 : ROWNUM = 1

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

텍스트

최적수행 : ROWNUM 추가

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

텍스트

최적수행 : 파티션 키 추가▸ 파티션 테이블 사용 목적

▸ 탐색 범위 축소▸ 입력 시 부하분산▸ 장애 시 부분 백업 및 복구

▸ 글로벌 인덱스 : 모든 파티션을 인덱스 함▸ 데이터 변경 시 재 생성 이전에 사용불가 상태가 됨▸ 사용불가 시 해당 인덱스 사용하는 쿼리 급격한 성능저하▸ 가급적 로컬 인덱스 사용 및 예외적인 경우만 글로벌 인덱스 사용

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

텍스트

최적수행 : 파티션 키 추가▸ 파티션 키가 Where 조건에 포함되지 않으면 전체 파티션 탐색

▸ 테이블이 파티션 된 경우 파티션 키가 업무 규칙상 필요 없어도 넣어야 함▸ 파티션 키로 쿼리를 2 개로 분리해 부분 범위탐색 시도

▸ 1 차 쿼리 : 파티션 키를 활용해 검색범위를 좁혀서 탐색▸ 2 차 쿼리 : 전체 탐색

▸ 다른 입력값을 바탕으로 파티션 키값 범위 설정▸ 파티션 키와의 연관관계를 유추해 탐색 범위를 줄임

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

텍스트

조회항목 사용 여부▸ 고성능 쿼리

▸ 반드시 필요한 컬럼만 제공해서 성능 향상▸ 필요없는 컬럼 제거▸ 조인 테이블 최소화 및 제거

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

텍스트

쿼리통합▸ 쿼리통합

▸ SELECT 의 집합처리▸ 여러번 수행할 쿼리를 한번에 수행해 성능 개선

▸ 메인 / 서브 쿼리로 나눠 실행되는 것을 1 개로 통합▸ 병렬쿼리 통합 : 여러개의 개별 조회문으로 구성된 쿼리를 Union

all 이나 1:1 JOIN 형태로 통합

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

텍스트

DB 집합처리▸ 배치에서 입력 / 수정 / 삭제 집합 처리 (Array Batch)▸ 한 트랜젝션 내에서 동일한 테이블에 CUD 를 여러건 처리하는 작업은 집합 처리 적용▸ 집합 처리 시 자바 힙 메모리 부족에 주의 ( 적절하게 건수 조절 )

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

텍스트

트랜잭션 처리▸ 트랜젝션 처리 시 쿼리가 락을 점유하는 시간을 최소화

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

텍스트

복합적인 기능을 수행하는 쿼리 제거▸ 복합 기능 쿼리 : 하나의 쿼리에 1 개 이상의 기능이 담긴 쿼리

▸ 한개의 실행 계획만 가지고 실행 => 다양한 조건의 실행 계획 수립 불가▸ 쿼리 분리 : 적절한 인덱스를 선택 기준▸ Union all 을 이용해 하나의 쿼리에 여러 개의 select 구성▸ 실행 조건문 추가 : 입력값에 따라 테이블 접근 제한▸ NVL, DECODE, 힌트 활용▸ 검색 조건으로 분산도가 좋은 항목이 필수 입력항목이 되도록 업무협의

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

텍스트

스칼라 서브쿼리 사용 시 주의사항▸ 스칼라 서브 쿼리 : SELECT 절에 사용된 쿼리

▸ 서브쿼리에 분산도가 좋은 적절한 인덱스 사용▸ 전체 쿼리결과가 소량인 경우 사용

▸ 조인 처리해서 성능 개선

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

텍스트

페이징 처리▸ 목록 전체 접근 : 전체 건수조회 , 전체 페이지 수 표시

▸ 필요없거나 무의미한 전체 조회 제거▸ 초기에 전체 건수 및 페이지 수 생성 후 재활용 ( 변경이 적은 경우 )▸ 3~4 페이지 캐시 후 대상 목록 변경 시 재 생성

▸ 정렬된 결과를 얻기 위해 Order by 를 사용해서 전체 접근▸ Order by 순서와 일치하는 페이징 인덱스 생성▸ 페이징 인덱스 칼럼 값을 페이지 이동 시 다음 키값으로 사용▸ 동적 정렬은 필수적인 경우에만 제한적으로 제공

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

텍스트

페이징 처리▸ 분산도가 좋은 필수 입력항목이 없어 넓은 범위 접근

▸ 분산도가 좋은 입력 항목을 필수 항목으로 지정 및 자동 초기값 지정▸ 기간 조회는 조회 가능 최대기한 설정 , 기본 기간은 작게 설정

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

텍스트

페이징 인덱스