튜닝대상 sql 추출하면 sql이 포맷되지 않은 상태로 나오는 경우가 있어 불편하다.
위 사이트를 이용하면 예쁘게 만들어준다.
튜닝대상 sql 추출하면 sql이 포맷되지 않은 상태로 나오는 경우가 있어 불편하다.
위 사이트를 이용하면 예쁘게 만들어준다.
select * from city ;
select * from country;
explain format = 'json'
-- explain
select * from city c join country cy
on c.country_id = cy.country_id
where city_id between 1 and 10
;
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "5.76"
},
"nested_loop": [
{
"table": {
"table_name": "c",
"access_type": "range",
"possible_keys": [
"PRIMARY",
"idx_fk_country_id"
],
"key": "PRIMARY",
"used_key_parts": [
"city_id"
],
"key_length": "2",
"rows_examined_per_scan": 10,
"rows_produced_per_join": 10,
"filtered": "100.00",
"cost_info": {
"read_cost": "1.26",
"eval_cost": "1.00",
"prefix_cost": "2.26",
"data_read_per_join": "2K"
},
"used_columns": [
"city_id",
"city",
"country_id",
"last_update"
],
"attached_condition": "(`c`.`city_id` between 1 and 10)"
}
},
{
"table": {
"table_name": "cy",
"access_type": "eq_ref",
"possible_keys": [
"PRIMARY"
],
"key": "PRIMARY",
"used_key_parts": [
"country_id"
],
"key_length": "2",
"ref": [
"sakila.c.country_id"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 10,
"filtered": "100.00",
"cost_info": {
"read_cost": "2.50",
"eval_cost": "1.00",
"prefix_cost": "5.76",
"data_read_per_join": "2K"
},
"used_columns": [
"country_id",
"country",
"last_update"
]
}
}
]
}
}
MySQL 트랜잭션과 잠금 (0) | 2021.10.09 |
---|---|
MYSQL LOCK 확인및 KILL (0) | 2021.04.16 |
mysql hint (0) | 2021.02.23 |
오로라 #1 (0) | 2021.02.19 |
Aurora MySQL에서 해시 조인 작업 (0) | 2021.02.16 |
-- 아래는 실기2번과 비슷한 유형으로 중요하다고 생각되는 부분만 재현한 쿼리임
/*
SALES_P -> 월별 파티션테이블
ORDER_DATE VARCHAR(8)
*/
CREATE TABLE SALES_P(
ORDER_DATE VARCHAR2(8),
ORDER_MODE VARCHAR2(6),
CUSTOMER_ID VARCHAR2(21),
EMPLOYEE_ID VARCHAR2(13),
PRODUCT_ID VARCHAR2(13),
ORDER_QTY NUMBER,
ORDER_AMT NUMBER
)
PARTITION BY RANGE(ORDER_DATE) (
PARTITION P1 VALUES LESS THAN (DATE '2012-02-01') ,
PARTITION P2 VALUES LESS THAN (DATE '2012-03-01') ,
PARTITION P3 VALUES LESS THAN (DATE '2012-04-01') ,
PARTITION P4 VALUES LESS THAN (DATE '2012-05-01') ,
PARTITION P5 VALUES LESS THAN (DATE '2012-06-01') ,
PARTITION P6 VALUES LESS THAN (DATE '2012-07-01') ,
PARTITION P7 VALUES LESS THAN (DATE '2012-08-01') ,
PARTITION P8 VALUES LESS THAN (DATE '2012-09-01') ,
PARTITION P9 VALUES LESS THAN (DATE '2012-10-01') ,
PARTITION P10 VALUES LESS THAN (DATE '2012-11-01') ,
PARTITION P11 VALUES LESS THAN (DATE '2012-12-01') ,
PARTITION PMAX VALUES LESS THAN (MAXVALUE)
) ;
SELECT '일별' 구분
, ORDER_DATE ORDATE
, SUM(ORDER_AMT) ORAMT
FROM SALES_P
WHERE ORDER_DATE BETWEEN 20120301 AND 20120331
GROUP BY ORDER_DATE
UNION ALL
SELECT '월별' 구분
, SUBSTR(ORDER_DATE, 1, 6) ORDATE
, SUM(ORDER_AMT) ORAMT
FROM SALES_P
WHERE ORDER_DATE BETWEEN 20120301 AND 20120331
GROUP BY SUBSTR(ORDER_DATE, 1, 6)
ORDER BY 1, 2
; -- 32
SQL_ID 21ndvm228700r, child number 1
-------------------------------------
Plan hash value: 230622046
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | Pstart| Pstop | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 4392 (100)| | | | 32 |00:00:00.30 | 15652 | | | |
| 1 | SORT ORDER BY | | 1 | 32 | 608 | 4391 (1)| 00:00:01 | | | 32 |00:00:00.30 | 15652 | 2048 | 2048 | 2048 (0)|
| 2 | UNION-ALL | | 1 | | | | | | | 32 |00:00:00.30 | 15652 | | | |
| 3 | PARTITION RANGE ALL | | 1 | 31 | 589 | 2196 (1)| 00:00:01 | 1 | 12 | 31 |00:00:00.15 | 7826 | | | |
| 4 | HASH GROUP BY | | 12 | 31 | 589 | 2196 (1)| 00:00:01 | | | 31 |00:00:00.15 | 7826 | 1214K| 1214K| 1374K (0)|
|* 5 | TABLE ACCESS FULL | SALES_P | 12 | 104K| 1936K| 2191 (1)| 00:00:01 | 1 | 12 | 104K|00:00:00.14 | 7826 | | | |
| 6 | HASH GROUP BY | | 1 | 1 | 19 | 2196 (1)| 00:00:01 | | | 1 |00:00:00.15 | 7826 | 1160K| 1160K| 504K (0)|
| 7 | PARTITION RANGE ALL| | 1 | 104K| 1936K| 2191 (1)| 00:00:01 | 1 | 12 | 104K|00:00:00.14 | 7826 | | | |
|* 8 | TABLE ACCESS FULL | SALES_P | 12 | 104K| 1936K| 2191 (1)| 00:00:01 | 1 | 12 | 104K|00:00:00.14 | 7826 | | | |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter((TO_NUMBER("ORDER_DATE")>=20120301 AND TO_NUMBER("ORDER_DATE")<=20120331))
8 - filter((TO_NUMBER("ORDER_DATE")>=20120301 AND TO_NUMBER("ORDER_DATE")<=20120331))
SELECT DECODE(B.NO, 1 ,'일별', 2, '월별') 구분
, DECODE(B.NO, 1, ORDER_DATE, 2, SUBSTR(ORDER_DATE, 1, 6) ) ORDATE
, SUM(ORDER_AMT) ORDER_AMT
FROM (
SELECT /*+ FULL(S)*/ORDER_DATE
, ORDER_AMT
FROM SALES_P S
WHERE ORDER_DATE BETWEEN '20120301' AND '20120331' --> 형변환되지 않게 문자열처리 (날짜가 varchar2 타입이므로) -> 파티션푸루닝 유도
) A , ( SELECT ROWNUM NO FROM DUAL CONNECT BY LEVEL <= 2) B --> 같은테이블을 반복으로 읽지않기 위해 복제이용)
GROUP BY DECODE(B.NO, 1 ,'일별', 2, '월별')
, DECODE(B.NO, 1, ORDER_DATE, 2, SUBSTR(ORDER_DATE, 1, 6) )
ORDER BY 1, 2
; -- 32
SQL_ID 21ndvm228700r, child number 1
-------------------------------------
Plan hash value: 230622046
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | Pstart| Pstop | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 4392 (100)| | | | 32 |00:00:00.30 | 15652 | | | |
| 1 | SORT ORDER BY | | 1 | 32 | 608 | 4391 (1)| 00:00:01 | | | 32 |00:00:00.30 | 15652 | 2048 | 2048 | 2048 (0)|
| 2 | UNION-ALL | | 1 | | | | | | | 32 |00:00:00.30 | 15652 | | | |
| 3 | PARTITION RANGE ALL | | 1 | 31 | 589 | 2196 (1)| 00:00:01 | 1 | 12 | 31 |00:00:00.15 | 7826 | | | |
| 4 | HASH GROUP BY | | 12 | 31 | 589 | 2196 (1)| 00:00:01 | | | 31 |00:00:00.15 | 7826 | 1214K| 1214K| 1374K (0)|
|* 5 | TABLE ACCESS FULL | SALES_P | 12 | 104K| 1936K| 2191 (1)| 00:00:01 | 1 | 12 | 104K|00:00:00.14 | 7826 | | | |
| 6 | HASH GROUP BY | | 1 | 1 | 19 | 2196 (1)| 00:00:01 | | | 1 |00:00:00.15 | 7826 | 1160K| 1160K| 504K (0)|
| 7 | PARTITION RANGE ALL| | 1 | 104K| 1936K| 2191 (1)| 00:00:01 | 1 | 12 | 104K|00:00:00.14 | 7826 | | | |
|* 8 | TABLE ACCESS FULL | SALES_P | 12 | 104K| 1936K| 2191 (1)| 00:00:01 | 1 | 12 | 104K|00:00:00.14 | 7826 | | | |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
ITL Wait 재현 (0) | 2021.05.16 |
---|---|
SQLD, SQLP 자격 접수 시작 (0) | 2021.05.04 |
SQLD 자격검정 핵심노트 (0) | 2020.12.29 |
SQL 선택적 조인으로 튜닝하기 (0) | 2020.12.28 |
oracle-base > index-monitoring (0) | 2020.12.04 |
5.7
SELECT /*+ NO_SEMIJOIN(@subq1 FIRSTMATCH, LOOSESCAN) */ * FROM t2
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ a FROM t3);
SELECT /*+ SEMIJOIN(@subq1 MATERIALIZATION, DUPSWEEDOUT) */ * FROM t2
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ a FROM t3);
SELECT id, a IN (SELECT /*+ SUBQUERY(MATERIALIZATION) */ a FROM t1) FROM t2;
SELECT * FROM t2 WHERE t2.a IN (SELECT /*+ SUBQUERY(INTOEXISTS) */ a FROM t1);
SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 WHERE ...
SELECT /*+ QB_NAME(qb1) MRR(@qb1 t1) BKA(@qb2) NO_MRR(@qb3t1 idx1, id2) */ ...
FROM (SELECT /*+ QB_NAME(qb2) */ ... FROM (SELECT /*+ QB_NAME(qb3) */ ... FROM ...)) ...
SELECT /*+ BKA(@`my hint name`) */ ... FROM (SELECT /*+ QB_NAME(`my hint name`) */ ...) ...
SELECT /*+ BKA(@"my hint name") */ ... FROM (SELECT /*+ QB_NAME("my hint name") */ ...) ...
MYSQL LOCK 확인및 KILL (0) | 2021.04.16 |
---|---|
explain format = 'json' (0) | 2021.04.09 |
오로라 #1 (0) | 2021.02.19 |
Aurora MySQL에서 해시 조인 작업 (0) | 2021.02.16 |
Aurora MySql 에서 적용할 수 없는 파라미터 및 상태 변수(오로라 사용 설명서 ) (0) | 2021.02.09 |
explain format = 'json' (0) | 2021.04.09 |
---|---|
mysql hint (0) | 2021.02.23 |
Aurora MySQL에서 해시 조인 작업 (0) | 2021.02.16 |
Aurora MySql 에서 적용할 수 없는 파라미터 및 상태 변수(오로라 사용 설명서 ) (0) | 2021.02.09 |
percona tookit downloads (0) | 2021.01.24 |
mysql hint (0) | 2021.02.23 |
---|---|
오로라 #1 (0) | 2021.02.19 |
Aurora MySql 에서 적용할 수 없는 파라미터 및 상태 변수(오로라 사용 설명서 ) (0) | 2021.02.09 |
percona tookit downloads (0) | 2021.01.24 |
pt-query-digest를 사용하여 Amazon Aurora 느린 로그 분석 (0) | 2021.01.23 |
Aurora MySQL과 MySQL 간의 아키텍처 차이 때문에 일부 MySQL 파라미터와 상태 변수는 Aurora MySQL에 적용되지 않습니다.
다음 MySQL 파라미터는 Aurora MySQL에 적용되지 않습니다.
innodb_adaptive_flushing
innodb_adaptive_flushing_lwm
innodb_change_buffering
innodb_checksum_algorithm
innodb_doublewrite
innodb_flush_method
innodb_flush_neighbors
innodb_io_capacity
innodb_io_capacity_max
innodb_log_buffer_size
innodb_log_file_size
innodb_log_files_in_group
innodb_max_dirty_pages_pct
innodb_use_native_aio
innodb_write_io_threads
thread_cache_size
다음 MySQL 상태 변수는 Aurora MySQL에 적용되지 않습니다.
innodb_buffer_pool_bytes_dirty
innodb_buffer_pool_pages_dirty
innodb_buffer_pool_pages_flushed
오로라 사용 설명서
오로라 #1 (0) | 2021.02.19 |
---|---|
Aurora MySQL에서 해시 조인 작업 (0) | 2021.02.16 |
percona tookit downloads (0) | 2021.01.24 |
pt-query-digest를 사용하여 Amazon Aurora 느린 로그 분석 (0) | 2021.01.23 |
Max Connections 고려사항 (0) | 2020.12.30 |
Aurora MySQL에서 해시 조인 작업 (0) | 2021.02.16 |
---|---|
Aurora MySql 에서 적용할 수 없는 파라미터 및 상태 변수(오로라 사용 설명서 ) (0) | 2021.02.09 |
pt-query-digest를 사용하여 Amazon Aurora 느린 로그 분석 (0) | 2021.01.23 |
Max Connections 고려사항 (0) | 2020.12.30 |
Using Index Condition 설명 (0) | 2020.11.28 |
Aurora MySql 에서 적용할 수 없는 파라미터 및 상태 변수(오로라 사용 설명서 ) (0) | 2021.02.09 |
---|---|
percona tookit downloads (0) | 2021.01.24 |
Max Connections 고려사항 (0) | 2020.12.30 |
Using Index Condition 설명 (0) | 2020.11.28 |
Percona Toolkit 사용 (0) | 2020.11.27 |
MySQL 서버의 Max Connection 고려사항
1. Connection Usage(%)
= Threads_connected / max_connection *100
2.오전 /오후 , 주중/주말 비교 확인
, was 커넥션풀 최대동시커넥션 개수보다 크게
max connections 설정 이후 필수 모니터링
연결취소율(%) = Aborted_clients * 100 / Connections
0% 에 가까울 수록 좋음
percona tookit downloads (0) | 2021.01.24 |
---|---|
pt-query-digest를 사용하여 Amazon Aurora 느린 로그 분석 (0) | 2021.01.23 |
Using Index Condition 설명 (0) | 2020.11.28 |
Percona Toolkit 사용 (0) | 2020.11.27 |
User CPU 사용률 100% 원인 - 동일한쿼리 동시다발적으로 실행 (0) | 2020.11.25 |