MariaDB/SQL Tuning 10

[MariaDB][성능] 멀티 레인지 리드(multi range read) 최적화

[테스트 환경] OS : CentOS7 DB : MariaDB 10.1.12 멀티 레인지 리드란 ?Multi Range Read(MRR)는 Random I/O를 Sequential I/O로 처리할 수 있도록 도와주는 기능으로, Non-Clustered Index를 통해 Range Scan을 하는 경우, 바로 데이터를 조회하지 않고 어느 정도 rowid(primary key) 값들을 Random 버퍼(mrr_buffer_size)에 채운 다음, 버퍼 내용을 정렬하여 최대한 rowid(primary key) 순서대로 데이터를 접근할 수 있도록 해주는 것이다. 1. rowid 기준 정렬 (Rowid-odered scan) /*파라미터 설정*/ --멀티 레인지 스캔 최적화를 하기 위해서 아래와 같은 파라미터를 ..

MariaDB/SQL Tuning 2016.09.25

[MariaDB][성능] 서브쿼리 최적화

[테스트 환경] OS : CentOS7 DB : MariaDB 10.1.12 # optimizer_switch 파라미터로 optimizer의 최적화를 제어할 수 있다. MariaDB [(none)]> show variables like '%optimizer_switch%' \G *************************** 1. row *************************** Variable_name: optimizer_switch Value: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition..

MariaDB/SQL Tuning 2016.09.25

[MariaDB][성능] LEFT OUTER JOIN과 스칼라 서브쿼리 실행계획 비교2

[테스트 환경] OS : CentOS7 DB : MariaDB 10.1.12 1. 스칼라 서브쿼리 & LEFT OUTER JOIN - 메인쿼리의 데이터마다 다른 데이터를 리턴하도록 데이터 수정을 한 후 스칼라 서브쿼리와 LEFT OUTER JOIN의 성능을 비교한다. - 메인쿼리의 데이터마다 다른 데이터를 호출하는 쿼리를 작성했을 경우, 서브쿼리는 캐싱효과를 사용할 수 없기 때문에 LEFT OUTER JOIN이 성능이 좋다. - 스칼라 서브쿼리일 때 캐싱할 수 있는 데이터의 개수가 200개가 넘어가면 더이상 캐싱을 하지 않고 상태가 disabled로 바뀐다. -- MGR 업데이트 UPDATE EMP A SET A.MGR = CASE WHEN A.EMPNO = 1600000 THEN 1 ELSE A.EMP..

MariaDB/SQL Tuning 2016.08.28

[MariaDB][성능] LEFT OUTER JOIN과 스칼라 서브쿼리 실행계획 비교1

[테스트 환경] OS : CentOS7 DB : MariaDB 10.1.12 1. 테이블 데이터 건수 - EMP 테이블의 건수를 10만 건으로 했을 때, LFET OUTER JOIN과 스칼라 서브쿼리의 소요 시간이 차이가 없어서 160만 건으로 진행한다.MariaDB [DA_DB]> SELECT COUNT(*) FROM DEPT; +----------+ | COUNT(*) | +----------+ | 204 | +----------+ 1 row in set (0.01 sec) MariaDB [DA_DB]> SELECT COUNT(*) FROM EMP; +----------+ | COUNT(*) | +----------+ | 1600000 | +----------+ 1 row in set (0.31 se..

MariaDB/SQL Tuning 2016.08.24

[MariaDB][성능] 스칼라 서브쿼리 실행계획2

[테스트 환경] OS : CentOS7 DB : MariaDB 10.1.12 1. 스칼라 서브쿼리 실행계획 분석 - 스칼라 서브쿼리에서 사용되는 인덱스를 삭제하면 스토리지 엔진이 DEPT 테이블의 데이터를 MariaDB 엔진으로 전달하고 조인 조건에 맞는 데이터만 필터링한다.-- PK 삭제 ALTER TABLE DEPT DROP PRIMARY KEY; ANALYZE FORMAT=JSON SELECT A.EMPNO ,A.ENAME ,(SELECT S1.DNAME FROM DEPT S1 WHERE S1.DEPTNO = A.DEPTNO) AS DNAME FROM EMP A; { "query_block": { "select_id": 1, "r_loops": 1, "r_total_time_ms": 0.3681, ..

MariaDB/SQL Tuning 2016.08.17

[MariaDB][성능]인라인뷰 처리 방식 분석

[테스트 환경] - OS : CentOS7 - DB : MariaDB 10.1.12 - 테이블 : EMP 10만건, DEPT 4건 1. 인라인 뷰의 최적화 - 오라클과 마찬가지로 인라인뷰로 쿼리를 작성하면 View Merge가 발생하여 조인 조건으로 최적화 한다. 1.1 인라인뷰에서 조회 조건 없고, 조인 컬럼의 인덱스 미존재 - 건수가 작은 DEPT 테이블을 DRIVING 테이블로 TABLE FULL SCAN 하고, DRIVEN 테이블인 EMP 테이블과 block-nl-join방식으로 조인 한다. - EMP테이블에 DEPT컬럼으로 인덱스가 미존재 하기 때문에 DEPT의 데이터를 JOIN BUFFER에 올려서 EMP 테이블의 데이터와 매칭 되는지 하나씩 체크하고, 매칭 되는 결과를 리턴 한다. [SQL1..

MariaDB/SQL Tuning 2016.08.17

[MariaDB][성능] 스칼라 서브쿼리 실행계획

[테스트 환경] OS : CentOS7 DB : MariaDB 10.1.12 EXPLAIN FORMAT = JSON은 MariaDB 10.1.2 버전이상 부터 지원되며, output에 대한 포맷은 정확하게 나와있지 않기 때문에 아래 파악한 내용이 확실하지 않다. ANALYZE FORMAT = JSON 은 EXPLAIN FORMAT = JSON과 ANALYZE 구문의 혼합형으로 EXPLAIN FORMAT = JSON 포맷형식에 쿼리를 실행시킨 데이터(r_loops, r_total_time_ms, r_filtered)가 추가되어 출력된다. ANALYZE FORMAT=JSON SELECT A.EMPNO ,A.ENAME ,(SELECT S1.DNAME FROM DEPT S1 WHERE S1.DEPTNO = A...

MariaDB/SQL Tuning 2016.08.15

[MariaDB][성능] 실행계획 분석2

[테스트 환경]서버: CentOs7DB : MariaDB 10.1.12 DB엔진 : INNODB 1.TYPE컬럼 의미 - Type컬럼은 각 테이블의 레코드를 인덱스로 읽었는지 풀 테이블 스캔으로 읽었는지를 의미--테스트에서 사용하게 될 테이블 스크립트 정보 MariaDB [DA]> DESC EMP; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | EMPNO | int(4) | NO | PRI | NULL | | | ENAME | varchar(10) | YES..

MariaDB/SQL Tuning 2016.08.08

[MariaDB][성능] 실행계획 분석[정리필요]

#ERD (ERD 출처: https://www.ntu.edu.sg/home/ehchua/programming/sql/SampleDatabases.html 소스 출처: https://code.google.com/archive/p/northwindextended/downloads) 1. 단일 쿼리 explain select a.customerid ,b.OrderDate ,d.ProductName from Customers a inner join Orders b on(b.customerid = a.customerid) inner join `Order Details` c on(c.OrderID = b.OrderID) inner join Products d on(d.ProductID = c.ProductID) w..

MariaDB/SQL Tuning 2016.08.07