(오라클 SQL튜닝을 위한 쿼리문 작성법 강좌)오라클 SQL/쿼리 튜닝은 간단한 SQL구문 최적화 부터 시작을 하게되죠, SQL을 처음 사용할 때 부터 최적화 하는 방법에 주의해서 공부하시면 저절로 튜닝 됩니다. 본 PPT 강좌는 탑크리에듀(www.topcredu.co.kr), 오라클자바커뮤니티(ojc.asia)에서 제공하는 교육강좌 입니다.
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...탑크리에듀(구로디지털단지역3번출구 2분거리)
(개발시 SQL튜닝은 기본 입니다.)서브쿼리튜닝, 쿼리 변환(Query Transformation)에 대한 이해는 SQL튜닝의 핵심입니다. 서브쿼리 푸시 및 서브쿼리의 드라이빙을 제어할 수 있는 push_subq, no_push_subq 힌트에 대해 알아보고 실행방법에 따른 서브쿼리의 종류도 설명한 영상 입니다. SQL튜닝 교육은 탑크리에듀(www.topcredu.co.kr)에서 해결해 드리겠습니다.
(오라클 SQL튜닝을 위한 쿼리문 작성법 강좌)오라클 SQL/쿼리 튜닝은 간단한 SQL구문 최적화 부터 시작을 하게되죠, SQL을 처음 사용할 때 부터 최적화 하는 방법에 주의해서 공부하시면 저절로 튜닝 됩니다. 본 PPT 강좌는 탑크리에듀(www.topcredu.co.kr), 오라클자바커뮤니티(ojc.asia)에서 제공하는 교육강좌 입니다.
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...탑크리에듀(구로디지털단지역3번출구 2분거리)
(개발시 SQL튜닝은 기본 입니다.)서브쿼리튜닝, 쿼리 변환(Query Transformation)에 대한 이해는 SQL튜닝의 핵심입니다. 서브쿼리 푸시 및 서브쿼리의 드라이빙을 제어할 수 있는 push_subq, no_push_subq 힌트에 대해 알아보고 실행방법에 따른 서브쿼리의 종류도 설명한 영상 입니다. SQL튜닝 교육은 탑크리에듀(www.topcredu.co.kr)에서 해결해 드리겠습니다.
SQL튜닝을 위한 도구중 하나인 "오라클의 10053 이벤트" 간단히 소개하고 오라클 함수를 만들어 간단히 테스트 후 옵티마이저의 Query Transformation, Optimization 과정(조인방법 결정, 드라이빙테이블 선정), 실행계획 생성등을 Trace 파일을 만들어 확인하는 PPT 강좌 입니다.
탑크리에듀(http://www.topcredu.co.kr) 제공 SQL튜닝, 오라클힌트 강좌 입니다. Subquery Factoring은 WITH구문을 이용하여 복잡한 쿼리문을 임시테이블에 저장하여 이를 이용하는 방법으로 반복되는 SELECT구문을 WITH구문에 한번만 정의하여 사용하여 쿼리 성능을 향상 시킬 수 있는 방법 입니다.
With구문은 SQL-99 표준이며 오라클에서는 9.2에 도입되었으며 복잡한 인라인뷰등을 WITH구문을 이용하여 한곳으로 몰아 가독성 또한 좋습니다.
오라클 옵티마이저는 WITH구문의 내용이 복잡할 경우 서브쿼리를 Global Temporary Table에 넣어 WITH구 블록이 여러곳에서 참조되는 경우 효율적으로 구성할 수도 있으며 Materialize 힌트는 서브쿼리 블록을 Global Temporary Table로 만들어서 사용하라는 힌트이며 Inline 힌트는 반대로 해당 WITH 쿼리블럭을 메인 쿼리블럭에 넣어 그대로 실행하라는 힌트 입니다.
본원에서는 SQL튜닝 온라인 화상강의도 무료로 진행하고 있으니홈페이지에서 확인 바랍니다. 감사합니다.
서브 쿼리에서 여러 건의 결과가 반환되는 구조 이다. 이와 같은 구조에서 사용되는 연산자는 IN, ANY, SOME(ANY와 동일), ALL, EXISTS 등과 같은 복수 행 연산자 이다. 이 연산자들은 이전의 SQL 연산자 부분에 자세히 나와 있으니 참조하길 바라며 아래의 예문을 따라 하면서 이해해 보자.
서브 쿼리는 SELECT한 결과를 조건 비교시 사용하거나 UPDATE, INSERT등에 사용되는 내장된 SELECT 문장이며 메인 쿼리 이전에 한번만 실행 된다. 테이블 자체의 데이터에 의존하는 조건으로 테이블의 행을 검색할 필요가 있을 때 서브쿼리는 아주 유용하게 이용될 수 있다
탑크리에듀에서 제공하는 SQL기초강좌(상관서브쿼리) 입니다.
서브 쿼리와 메인쿼리간에 서로 상관 참조 작용하는 쿼리로 Inner Query에서 Outer Query의 어떤 컬럼을 이용하는 경우다. 일반적인 Query의 경우 서브 쿼리의 결과를 메인에서는 단순히 이용만 하지만 상관 서브 쿼리에서는 서브 쿼리가 메인 쿼리의 값을 이용하여 값을 구하면 그 값을 다시 메인 쿼리에서 이용하는 구조이므로 서브쿼리는 값을 확인하는 확인자 역할을 하게된다. 예를 들어 서브 쿼리 에서 10번 부서에서 가장 많은 급여를 받는 사람, 20번 부서에서 가장 많은 급여를 받는 사람, 30번 부서에서 같은 결과를 구하고자 한다면 부서만 다르고 같은 내용을 입력 시켜야 하므로 이 경우 상관 쿼리로 만들어 처리하면 편리 하다.
ROWNUM은 의사 칼럼으로 참조만 될 뿐 데이터베이스에 저장되지 않는다. (DESC 명령으로 보이지 않는 의사 칼럼). SELECT절에 의해 추출되는 데이터(ROW)에 붙는 순번이다. 다시 말해 WHERE절까지 만족 시킨 자료에 1부터 붙는 순번이다. WHERE절에 ROWNUM을 이용하여 조건을 주면 다른 조건을 만족시킨 결과에 대해 조건이 반영된다. SELECT 리스트에 ROWNUM을 이용하는 것도 물론 가능하다. ORDER BY를 사용한다면 WHERE절까지 만족 시킨 결과에 ROWNUM이 붙은 상태로 ORDER BY가 반영된다. 즉 ROWNUM은 ORDER BY전에 부여되며, ORDER BY는 맨 나중에 실행된다.
Explain Plan, GATHER_PLAN_STATISTICS 힌트, DBMS_XPLAN 패키지를 이용해서 CBO의 SQL 실행계획을 확인할 수 있지만 10053 이벤트를 이용하면 보다 구체적으로 CBO의 쿼리변환, 최적화 과정을 시간순으로 모니터링 할 수 있다.
점점 발전하는 CBO의 쿼리실행을 위한 전과정을 확인 가능한데 Query Transformation, Query Optimization을 과정을 Trace 파일로 제공한다. Trace 파일의 위치는 show parameter user_dump_dest로 확인 가능하다.
SQL튜닝을 위한 도구중 하나인 "오라클의 10053 이벤트" 간단히 소개하고 오라클 함수를 만들어 간단히 테스트 후 옵티마이저의 Query Transformation, Optimization 과정(조인방법 결정, 드라이빙테이블 선정), 실행계획 생성등을 Trace 파일을 만들어 확인하는 PPT 강좌 입니다.
탑크리에듀(http://www.topcredu.co.kr) 제공 SQL튜닝, 오라클힌트 강좌 입니다. Subquery Factoring은 WITH구문을 이용하여 복잡한 쿼리문을 임시테이블에 저장하여 이를 이용하는 방법으로 반복되는 SELECT구문을 WITH구문에 한번만 정의하여 사용하여 쿼리 성능을 향상 시킬 수 있는 방법 입니다.
With구문은 SQL-99 표준이며 오라클에서는 9.2에 도입되었으며 복잡한 인라인뷰등을 WITH구문을 이용하여 한곳으로 몰아 가독성 또한 좋습니다.
오라클 옵티마이저는 WITH구문의 내용이 복잡할 경우 서브쿼리를 Global Temporary Table에 넣어 WITH구 블록이 여러곳에서 참조되는 경우 효율적으로 구성할 수도 있으며 Materialize 힌트는 서브쿼리 블록을 Global Temporary Table로 만들어서 사용하라는 힌트이며 Inline 힌트는 반대로 해당 WITH 쿼리블럭을 메인 쿼리블럭에 넣어 그대로 실행하라는 힌트 입니다.
본원에서는 SQL튜닝 온라인 화상강의도 무료로 진행하고 있으니홈페이지에서 확인 바랍니다. 감사합니다.
서브 쿼리에서 여러 건의 결과가 반환되는 구조 이다. 이와 같은 구조에서 사용되는 연산자는 IN, ANY, SOME(ANY와 동일), ALL, EXISTS 등과 같은 복수 행 연산자 이다. 이 연산자들은 이전의 SQL 연산자 부분에 자세히 나와 있으니 참조하길 바라며 아래의 예문을 따라 하면서 이해해 보자.
서브 쿼리는 SELECT한 결과를 조건 비교시 사용하거나 UPDATE, INSERT등에 사용되는 내장된 SELECT 문장이며 메인 쿼리 이전에 한번만 실행 된다. 테이블 자체의 데이터에 의존하는 조건으로 테이블의 행을 검색할 필요가 있을 때 서브쿼리는 아주 유용하게 이용될 수 있다
탑크리에듀에서 제공하는 SQL기초강좌(상관서브쿼리) 입니다.
서브 쿼리와 메인쿼리간에 서로 상관 참조 작용하는 쿼리로 Inner Query에서 Outer Query의 어떤 컬럼을 이용하는 경우다. 일반적인 Query의 경우 서브 쿼리의 결과를 메인에서는 단순히 이용만 하지만 상관 서브 쿼리에서는 서브 쿼리가 메인 쿼리의 값을 이용하여 값을 구하면 그 값을 다시 메인 쿼리에서 이용하는 구조이므로 서브쿼리는 값을 확인하는 확인자 역할을 하게된다. 예를 들어 서브 쿼리 에서 10번 부서에서 가장 많은 급여를 받는 사람, 20번 부서에서 가장 많은 급여를 받는 사람, 30번 부서에서 같은 결과를 구하고자 한다면 부서만 다르고 같은 내용을 입력 시켜야 하므로 이 경우 상관 쿼리로 만들어 처리하면 편리 하다.
ROWNUM은 의사 칼럼으로 참조만 될 뿐 데이터베이스에 저장되지 않는다. (DESC 명령으로 보이지 않는 의사 칼럼). SELECT절에 의해 추출되는 데이터(ROW)에 붙는 순번이다. 다시 말해 WHERE절까지 만족 시킨 자료에 1부터 붙는 순번이다. WHERE절에 ROWNUM을 이용하여 조건을 주면 다른 조건을 만족시킨 결과에 대해 조건이 반영된다. SELECT 리스트에 ROWNUM을 이용하는 것도 물론 가능하다. ORDER BY를 사용한다면 WHERE절까지 만족 시킨 결과에 ROWNUM이 붙은 상태로 ORDER BY가 반영된다. 즉 ROWNUM은 ORDER BY전에 부여되며, ORDER BY는 맨 나중에 실행된다.
Explain Plan, GATHER_PLAN_STATISTICS 힌트, DBMS_XPLAN 패키지를 이용해서 CBO의 SQL 실행계획을 확인할 수 있지만 10053 이벤트를 이용하면 보다 구체적으로 CBO의 쿼리변환, 최적화 과정을 시간순으로 모니터링 할 수 있다.
점점 발전하는 CBO의 쿼리실행을 위한 전과정을 확인 가능한데 Query Transformation, Query Optimization을 과정을 Trace 파일로 제공한다. Trace 파일의 위치는 show parameter user_dump_dest로 확인 가능하다.
FILTER 연산은 데이터 추출 시 필터링이 일어나고 있음을 알려주는 SQL ROW 연산인데 WHERE 조건 절에서 인덱스를 사용하지 못할 때 발생한다. NESTED LOOP 방식으로 해석할 수 있는데 서브쿼리라면 메인쿼리 로우를 하나씩 읽을때 마다 서브쿼리를 한 번씩 실행하는 형태이다.
FILTER OPERATION은 IN, NOT IN, EXISTS, NOT EXISTS 를 사용하는 경우 발견할 수 있는 OPERATION이며 중첩 루프조인(Nedted Loop Join)과 유사하게 움직인다. 메인쿼리의 결과에 대해 서브쿼리의 결과값을 버퍼에 임시저장해 같거나 다른 것을 찾아 나가는 방식이다. 이러한 과정이 드라이빙되는 테이블의 각 로우에 대해 일어나기 때문에 NESTED LOOP JOIN과 유사하다고 볼 수있다.
DBMS_STATS 패키지에는 몇 개의 유용한 프러시저가 있는데 아래와 같다.
gather_database_ stats: 데이터베이스의 모든 Object에 대한 통계 정보 생성.
gather_schema_ stats: 해당 스키마의 모든 Object에 대한 통계 정보 생성.
gather_table_stats : 테이블과 그 테이블과 연관된 인덱스에 대한 통계 정보 생성.
gather_index_stats : 인덱스에 대해 통계 정보를 생성.
SQL*Plus에서 사용자는 자동으로 Optimizer가 만드는 실행계획과 통계정보를 얻을 수 있다. 이런 경우 AUTOTRACE를 사용하며 DML문을 성공적으로 수행 시 실행계획과 통계정보가 만들어지며 DML문의 성능 튜닝을 위한 방법으로 자주 이용된다.
SET AUTOTRACE를 사용하기 위해선 실행 계획용 테이블(PLAN_TABLE)이 존재해야 하며 구문을 활성화하기 위해 SET AUTOTRACE ON, 비활성화 하기 위해 SET AUTOTRACE OFF하면 된다. 참고로 SET AUTOTRACE에서 사용할 수 있는 옵션은 다음과 같다.
4. 병렬 프로그래밍 분야에서 저주라고 부르는 이유
19.8배의 한계에 부딪힌다!
꼭 그런 건 아닙니다.
5. 암달의 법칙이 주는 교훈
성능을 높이려면 시스템에서 큰 비중을 차지하는 쪽을 높여라!
Ex)
5% 를 차지하는 A를 500% 성능개선
50%를 차지하는 B를 120% 성능개선?
6. 암달의 법칙이 주는 교훈
성능을 높이려면 시스템에서 큰 비중을 차지하는 쪽을 높여라!
Ex)
1 / ((1-0.05) + 0.05/5) = 1.04 -> 4%개선
1/ ((1-0.7) + 0.7 / 1.2 ) = 1.13 -> 13%개선
7. 암달의 법칙이 주는 교훈
인생에서도
무엇인가를 개선하려면
조금 개선하더라도 비율이 큰 쪽을 개선하라.
8. 데이터베이스 쿼리의 성능을 높이는 방법
1. 더 비싼 하드웨어로 교체
2. 시스템 튜닝
3. 데이터 모델링을 통한 성능 개선
4. 쿼리 튜닝
하드웨어 + OS + 시스템 분야의 해박한 지식과 경험
9. 현업에서 튜닝이 절박한 경우는
1. 성능이 좋은 걸 더 좋게 한다.
2. 알 수 없는 이유로 성능이 나빠졌을 때, 다시 원상복구
어디일까요?
10. 원인을 알아야 합니다.
1. 전문가를 초청한다 : 가장 좋지만 돈이 듭니다.
2. 정적분석 : 안 돌려 보고 원인을 예측하는 방법 DB는 쿼리
플랜을 보는 좋은 툴이 있습니다.
3. 프로파일링 : 실제 실행 후, 실행결과를 분석하는 방법
11. MySQL에서 쿼리 플랜을 보려면
EXPLAIN명령을 사용합니다.
SELECT 문장에만 사용할 수 있습니다.
‘G’ 를 사용하면 더 보기 좋게 나옵니다.
참고링크:
http://dev.mysql.com/doc/refman/5.5/en/explain-
output.html
mysql> EXPLAIN SELECT … G
12. 결과는 하나 이상의 레코드 입니다.
한 행이 하나의 동작이고
대체로 위에서 아래로 실행됩니다.
13. ID는 SELECT당 하나씩 부여됩니다.
mysql> EXPLAIN
SELECT * FROM USER;
mysql> EXPLAIN
SELECT * FROM USER JOIN TRADE ON USER.ID = TRADE.SELLER;
14. mysql> EXPLAIN
SELECT * FROM
(SELECT COUNT(*) FROM USER
UNION
SELECT COUNT(*) FROM TRADE ) AS T;
15. SELECT_TYPE
SIMPLE, PRIMARY : 가장 바깥 쿼리
SUBQUERY : 일반 서브쿼리
mysql> EXPLAIN
SELECT * FROM USER
WHERE ID IN
(SELECT SELLER FROM TRADE
GROUP BY SELLER
HAVING COUNT(*) > 3);
17. SELECT_TYPE
DEPENDANT SUBQUERY : 바깥 테이블과 연관된 서브쿼리
*가능하면 없애자
m> EXPLAIN
SELECT * FROM user u
WHERE money > ANY (
SELECT price FROM trade t WHERE u.id = t.seller );
19. TYPE
실제 데이터를 읽는 방법
SYSTEM, CONST, REF, RANGE, INDEX, ALL 등이 있음
SYSTEM이 가장 빠르고 ALL 이 가장 느림
INDEX는 INDEX FULL SCAN, 빠르지 않음
20. mysql> EXPLAIN SELECT * FROM USER
WHERE LAST_VISIT > '2014-06-10';
mysql> CREATE INDEX TEST_IDX ON USER(LAST_VISIT);
mysql> EXPLAIN SELECT * FROM
USER WHERE LAST_VISIT > '2014-06-1';
21. POSSIBLE KEYS
쓸모없는 컬럼, 가볍게 무시하자!
KEY
실제 데이터를 읽기 위해 사용되는 인덱스의 이름
필요에 의해 생성한 인덱스가 잘 사용되는지 확인!
22. mysql> DROP INDEX TEST_IDX ON USER;
mysql> CREATE INDEX POPI ON USER(LAST_VISIT,MONEY);
mysql> EXPLAIN SELECT * FROM USER WHERE LAST_VISIT > '2014-06-01';
mysqL> EXPLAIN SELECT * FROM USER
WHERE LAST_VISIT = '2014-06-01' AND MONEY > 1000;
mysql> EXPLAIN SELECT * FROM USER WHERE MONEY < 5000;
23. KEY_LEN
인덱스 중 사용할 수 있는 크기를 나타냅니다.
복합 인덱스에서 매우 중요합니다.
ROWS
예상 레코드 개수, 이를 위해 통계정보를 저장합니다.