SlideShare a Scribd company logo
데이터베이스 개론
기초튜닝
NHN NEXT 정호영
나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.
튜닝이란?
쿼리의 성능을 높이기 위한 방법
다양한 방법이 존재
암달의 저주 때문에 한계가 존재함
암달의 저주(법칙)
시스템에서
차지하는 비율이 P인 구성요소의
성능을 S만큼 개선했을 때의 전체 성능 비율을 나타내는 공식
병렬 프로그래밍 분야에서 저주라고 부르는 이유
19.8배의 한계에 부딪힌다!
 꼭 그런 건 아닙니다.
암달의 법칙이 주는 교훈
성능을 높이려면 시스템에서 큰 비중을 차지하는 쪽을 높여라!
Ex)
5% 를 차지하는 A를 500% 성능개선
50%를 차지하는 B를 120% 성능개선?
암달의 법칙이 주는 교훈
성능을 높이려면 시스템에서 큰 비중을 차지하는 쪽을 높여라!
Ex)
1 / ((1-0.05) + 0.05/5) = 1.04 -> 4%개선
1/ ((1-0.7) + 0.7 / 1.2 ) = 1.13 -> 13%개선
암달의 법칙이 주는 교훈
인생에서도
무엇인가를 개선하려면
조금 개선하더라도 비율이 큰 쪽을 개선하라.
데이터베이스 쿼리의 성능을 높이는 방법
1. 더 비싼 하드웨어로 교체
2. 시스템 튜닝
3. 데이터 모델링을 통한 성능 개선
4. 쿼리 튜닝
하드웨어 + OS + 시스템 분야의 해박한 지식과 경험
현업에서 튜닝이 절박한 경우는
1. 성능이 좋은 걸 더 좋게 한다.
2. 알 수 없는 이유로 성능이 나빠졌을 때, 다시 원상복구
어디일까요?
원인을 알아야 합니다.
1. 전문가를 초청한다 : 가장 좋지만 돈이 듭니다.
2. 정적분석 : 안 돌려 보고 원인을 예측하는 방법 DB는 쿼리
플랜을 보는 좋은 툴이 있습니다.
3. 프로파일링 : 실제 실행 후, 실행결과를 분석하는 방법
MySQL에서 쿼리 플랜을 보려면
EXPLAIN명령을 사용합니다.
SELECT 문장에만 사용할 수 있습니다.
‘G’ 를 사용하면 더 보기 좋게 나옵니다.
참고링크:
http://dev.mysql.com/doc/refman/5.5/en/explain-
output.html
mysql> EXPLAIN SELECT … G
결과는 하나 이상의 레코드 입니다.
한 행이 하나의 동작이고
대체로 위에서 아래로 실행됩니다.
ID는 SELECT당 하나씩 부여됩니다.
mysql> EXPLAIN
SELECT * FROM USER;
mysql> EXPLAIN
SELECT * FROM USER JOIN TRADE ON USER.ID = TRADE.SELLER;
mysql> EXPLAIN
SELECT * FROM
(SELECT COUNT(*) FROM USER
UNION
SELECT COUNT(*) FROM TRADE ) AS T;
SELECT_TYPE
SIMPLE, PRIMARY : 가장 바깥 쿼리
SUBQUERY : 일반 서브쿼리
mysql> EXPLAIN
SELECT * FROM USER
WHERE ID IN
(SELECT SELLER FROM TRADE
GROUP BY SELLER
HAVING COUNT(*) > 3);
SELECT_TYPE
DERIVED : FROM절의 서브 쿼리
*가능하면 없애자
m> EXPLAIN
SELECT * FROM
( SELECT * FROM user u) as u2;
SELECT_TYPE
DEPENDANT SUBQUERY : 바깥 테이블과 연관된 서브쿼리
*가능하면 없애자
m> EXPLAIN
SELECT * FROM user u
WHERE money > ANY (
SELECT price FROM trade t WHERE u.id = t.seller );
TABLE
테이블의 이름 또는 종류
<XX2>와 같은 테이블의 숫자는 쿼리 플랜의 ID를 가리킴
TYPE
실제 데이터를 읽는 방법
SYSTEM, CONST, REF, RANGE, INDEX, ALL 등이 있음
SYSTEM이 가장 빠르고 ALL 이 가장 느림
INDEX는 INDEX FULL SCAN, 빠르지 않음
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';
POSSIBLE KEYS
쓸모없는 컬럼, 가볍게 무시하자!
KEY
실제 데이터를 읽기 위해 사용되는 인덱스의 이름
필요에 의해 생성한 인덱스가 잘 사용되는지 확인!
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;
KEY_LEN
인덱스 중 사용할 수 있는 크기를 나타냅니다.
복합 인덱스에서 매우 중요합니다.
ROWS
예상 레코드 개수, 이를 위해 통계정보를 저장합니다.
EXTRA
이름과는 달리 매우 중요한 정보들이 저장되지만, 패스.
요약
1. 쿼리가 원하는 성능이 안 나올 경우 튜닝 실시
2. explain 명령으로 원인분석
3. dependant subquery, derived 와 같은 타입이 안 나오게
4. 되도록 all 이 나오지 않도록
THANK YOU!!!

More Related Content

What's hot

(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
효율적인Sql작성방법 4주차
효율적인Sql작성방법 4주차효율적인Sql작성방법 4주차
효율적인Sql작성방법 4주차
희동 강
 
MySQL JOIN
MySQL JOINMySQL JOIN
MySQL JOIN
Hoyoung Jung
 
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
복수행 서브쿼리
복수행 서브쿼리복수행 서브쿼리
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.update
Hoyoung Jung
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
단일행 서브쿼리
단일행 서브쿼리단일행 서브쿼리
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Any(some),all,exists(2)
Any(some),all,exists(2)Any(some),all,exists(2)
Laravel 로 배우는 서버사이드 #4
Laravel 로 배우는 서버사이드 #4Laravel 로 배우는 서버사이드 #4
Laravel 로 배우는 서버사이드 #4
성일 한
 
Rownum
RownumRownum
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
PgDay.Seoul
 
PostgreSQL로 배우는 SQL 기초
PostgreSQL로 배우는 SQL 기초PostgreSQL로 배우는 SQL 기초
PostgreSQL로 배우는 SQL 기초
Jiho Lee
 
1.9 튜닝의도구 10053 event
1.9 튜닝의도구 10053 event1.9 튜닝의도구 10053 event
JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)
Jeong-gyu Kim
 
[ES6] 4. Spread, Rest parameter
[ES6] 4. Spread, Rest parameter[ES6] 4. Spread, Rest parameter
[ES6] 4. Spread, Rest parameter
Han JaeYeab
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning
PgDay.Seoul
 
BlOOM FILTER의 이해와 활용방법_Wh oracle
BlOOM FILTER의 이해와 활용방법_Wh oracleBlOOM FILTER의 이해와 활용방법_Wh oracle
BlOOM FILTER의 이해와 활용방법_Wh oracle
엑셈
 

What's hot (20)

(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
 
효율적인Sql작성방법 4주차
효율적인Sql작성방법 4주차효율적인Sql작성방법 4주차
효율적인Sql작성방법 4주차
 
MySQL JOIN
MySQL JOINMySQL JOIN
MySQL JOIN
 
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
 
복수행 서브쿼리
복수행 서브쿼리복수행 서브쿼리
복수행 서브쿼리
 
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.update
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
 
단일행 서브쿼리
단일행 서브쿼리단일행 서브쿼리
단일행 서브쿼리
 
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
 
Any(some),all,exists(2)
Any(some),all,exists(2)Any(some),all,exists(2)
Any(some),all,exists(2)
 
Laravel 로 배우는 서버사이드 #4
Laravel 로 배우는 서버사이드 #4Laravel 로 배우는 서버사이드 #4
Laravel 로 배우는 서버사이드 #4
 
Rownum
RownumRownum
Rownum
 
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
 
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
 
PostgreSQL로 배우는 SQL 기초
PostgreSQL로 배우는 SQL 기초PostgreSQL로 배우는 SQL 기초
PostgreSQL로 배우는 SQL 기초
 
1.9 튜닝의도구 10053 event
1.9 튜닝의도구 10053 event1.9 튜닝의도구 10053 event
1.9 튜닝의도구 10053 event
 
JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)
 
[ES6] 4. Spread, Rest parameter
[ES6] 4. Spread, Rest parameter[ES6] 4. Spread, Rest parameter
[ES6] 4. Spread, Rest parameter
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning
 
BlOOM FILTER의 이해와 활용방법_Wh oracle
BlOOM FILTER의 이해와 활용방법_Wh oracleBlOOM FILTER의 이해와 활용방법_Wh oracle
BlOOM FILTER의 이해와 활용방법_Wh oracle
 

Similar to 암달의 법칙과 쿼리튜닝 기초

Fundamentals of Oracle SQL
Fundamentals of Oracle SQLFundamentals of Oracle SQL
Fundamentals of Oracle SQL
JAEGEUN YU
 
Clean code
Clean codeClean code
Clean codebbongcsu
 
Hive begins
Hive beginsHive begins
Hive begins
SungMin OH
 
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Database 튜닝 교육 110124
Database 튜닝 교육 110124Database 튜닝 교육 110124
Database 튜닝 교육 110124
한 경만
 
Presto User & Admin Guide
Presto User & Admin GuidePresto User & Admin Guide
Presto User & Admin Guide
JEONGPHIL HAN
 
Oracle Optimizer presentation
Oracle Optimizer presentationOracle Optimizer presentation
Oracle Optimizer presentation
Jongwon
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraftbbongcsu
 
Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리
Younghan Kim
 
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
Seok-joon Yun
 
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
Seok-joon Yun
 
1.3 dbms stats 패키지사용하기
1.3 dbms stats 패키지사용하기1.3 dbms stats 패키지사용하기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
Kenu, GwangNam Heo
 
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
EXEM
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQL
I Goo Lee
 
1.7 튜닝의도구 sql autorace
1.7 튜닝의도구 sql autorace1.7 튜닝의도구 sql autorace
Java8 람다
Java8 람다Java8 람다
Java8 람다
Jong Woo Rhee
 
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
엑셈
 
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracleTABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
엑셈
 

Similar to 암달의 법칙과 쿼리튜닝 기초 (20)

Fundamentals of Oracle SQL
Fundamentals of Oracle SQLFundamentals of Oracle SQL
Fundamentals of Oracle SQL
 
Clean code
Clean codeClean code
Clean code
 
Hive begins
Hive beginsHive begins
Hive begins
 
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)
 
Database 튜닝 교육 110124
Database 튜닝 교육 110124Database 튜닝 교육 110124
Database 튜닝 교육 110124
 
Presto User & Admin Guide
Presto User & Admin GuidePresto User & Admin Guide
Presto User & Admin Guide
 
Oracle Optimizer presentation
Oracle Optimizer presentationOracle Optimizer presentation
Oracle Optimizer presentation
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraft
 
Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리
 
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
 
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
 
1.3 dbms stats 패키지사용하기
1.3 dbms stats 패키지사용하기1.3 dbms stats 패키지사용하기
1.3 dbms stats 패키지사용하기
 
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
 
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQL
 
1.7 튜닝의도구 sql autorace
1.7 튜닝의도구 sql autorace1.7 튜닝의도구 sql autorace
1.7 튜닝의도구 sql autorace
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
 
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
 
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracleTABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
 

More from Hoyoung Jung

철권 1단에서 벗어나기
철권 1단에서 벗어나기철권 1단에서 벗어나기
철권 1단에서 벗어나기
Hoyoung Jung
 
코딩 공부 시작하기
코딩 공부 시작하기코딩 공부 시작하기
코딩 공부 시작하기
Hoyoung Jung
 
내 질문에는 왜 답변이 달리지 않을까
내 질문에는 왜 답변이 달리지 않을까내 질문에는 왜 답변이 달리지 않을까
내 질문에는 왜 답변이 달리지 않을까
Hoyoung Jung
 
entry를 이용한 코딩 교육1
entry를 이용한 코딩 교육1entry를 이용한 코딩 교육1
entry를 이용한 코딩 교육1
Hoyoung Jung
 
Github Markdown
Github MarkdownGithub Markdown
Github Markdown
Hoyoung Jung
 
stored procedure2 + jdbc
stored procedure2 + jdbcstored procedure2 + jdbc
stored procedure2 + jdbc
Hoyoung Jung
 
mysql stored procedure
mysql stored proceduremysql stored procedure
mysql stored procedure
Hoyoung Jung
 
mysql 서브쿼리
mysql 서브쿼리mysql 서브쿼리
mysql 서브쿼리
Hoyoung Jung
 
GROUP BY, CASE WHEN
GROUP BY, CASE WHENGROUP BY, CASE WHEN
GROUP BY, CASE WHEN
Hoyoung Jung
 
트랜잭션
트랜잭션 트랜잭션
트랜잭션
Hoyoung Jung
 
데이터베이스 정규화
데이터베이스 정규화데이터베이스 정규화
데이터베이스 정규화
Hoyoung Jung
 
tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍
Hoyoung Jung
 
데이터베이스 모델링
데이터베이스 모델링데이터베이스 모델링
데이터베이스 모델링
Hoyoung Jung
 
MySQL Select (1)
MySQL Select (1)MySQL Select (1)
MySQL Select (1)
Hoyoung Jung
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
Hoyoung Jung
 
2. MySQL DataTye Basic
2. MySQL DataTye Basic2. MySQL DataTye Basic
2. MySQL DataTye Basic
Hoyoung Jung
 
MySQL Create Table
MySQL Create TableMySQL Create Table
MySQL Create Table
Hoyoung Jung
 
Mymysql basic sql
Mymysql basic sqlMymysql basic sql
Mymysql basic sql
Hoyoung Jung
 
데이터베이스 베이직 소개
데이터베이스 베이직 소개데이터베이스 베이직 소개
데이터베이스 베이직 소개
Hoyoung Jung
 
Crontab 간단 사용법
Crontab 간단 사용법Crontab 간단 사용법
Crontab 간단 사용법
Hoyoung Jung
 

More from Hoyoung Jung (20)

철권 1단에서 벗어나기
철권 1단에서 벗어나기철권 1단에서 벗어나기
철권 1단에서 벗어나기
 
코딩 공부 시작하기
코딩 공부 시작하기코딩 공부 시작하기
코딩 공부 시작하기
 
내 질문에는 왜 답변이 달리지 않을까
내 질문에는 왜 답변이 달리지 않을까내 질문에는 왜 답변이 달리지 않을까
내 질문에는 왜 답변이 달리지 않을까
 
entry를 이용한 코딩 교육1
entry를 이용한 코딩 교육1entry를 이용한 코딩 교육1
entry를 이용한 코딩 교육1
 
Github Markdown
Github MarkdownGithub Markdown
Github Markdown
 
stored procedure2 + jdbc
stored procedure2 + jdbcstored procedure2 + jdbc
stored procedure2 + jdbc
 
mysql stored procedure
mysql stored proceduremysql stored procedure
mysql stored procedure
 
mysql 서브쿼리
mysql 서브쿼리mysql 서브쿼리
mysql 서브쿼리
 
GROUP BY, CASE WHEN
GROUP BY, CASE WHENGROUP BY, CASE WHEN
GROUP BY, CASE WHEN
 
트랜잭션
트랜잭션 트랜잭션
트랜잭션
 
데이터베이스 정규화
데이터베이스 정규화데이터베이스 정규화
데이터베이스 정규화
 
tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍
 
데이터베이스 모델링
데이터베이스 모델링데이터베이스 모델링
데이터베이스 모델링
 
MySQL Select (1)
MySQL Select (1)MySQL Select (1)
MySQL Select (1)
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
 
2. MySQL DataTye Basic
2. MySQL DataTye Basic2. MySQL DataTye Basic
2. MySQL DataTye Basic
 
MySQL Create Table
MySQL Create TableMySQL Create Table
MySQL Create Table
 
Mymysql basic sql
Mymysql basic sqlMymysql basic sql
Mymysql basic sql
 
데이터베이스 베이직 소개
데이터베이스 베이직 소개데이터베이스 베이직 소개
데이터베이스 베이직 소개
 
Crontab 간단 사용법
Crontab 간단 사용법Crontab 간단 사용법
Crontab 간단 사용법
 

암달의 법칙과 쿼리튜닝 기초

  • 1. 데이터베이스 개론 기초튜닝 NHN NEXT 정호영 나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.
  • 2. 튜닝이란? 쿼리의 성능을 높이기 위한 방법 다양한 방법이 존재 암달의 저주 때문에 한계가 존재함
  • 3. 암달의 저주(법칙) 시스템에서 차지하는 비율이 P인 구성요소의 성능을 S만큼 개선했을 때의 전체 성능 비율을 나타내는 공식
  • 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);
  • 16. SELECT_TYPE DERIVED : FROM절의 서브 쿼리 *가능하면 없애자 m> EXPLAIN SELECT * FROM ( SELECT * FROM user u) as u2;
  • 17. SELECT_TYPE DEPENDANT SUBQUERY : 바깥 테이블과 연관된 서브쿼리 *가능하면 없애자 m> EXPLAIN SELECT * FROM user u WHERE money > ANY ( SELECT price FROM trade t WHERE u.id = t.seller );
  • 18. TABLE 테이블의 이름 또는 종류 <XX2>와 같은 테이블의 숫자는 쿼리 플랜의 ID를 가리킴
  • 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 예상 레코드 개수, 이를 위해 통계정보를 저장합니다.
  • 24. EXTRA 이름과는 달리 매우 중요한 정보들이 저장되지만, 패스.
  • 25. 요약 1. 쿼리가 원하는 성능이 안 나올 경우 튜닝 실시 2. explain 명령으로 원인분석 3. dependant subquery, derived 와 같은 타입이 안 나오게 4. 되도록 all 이 나오지 않도록