컴퓨터 과학 79

[programmers] JOIN

5월 식품들의 총매출 조회하기 출처 - https://school.programmers.co.kr/learn/courses/30/lessons/131117 생산일자가 2022년 5월에 해당하는 식품의 ID, NAME, 총매출을 조회하는 SQL문을 작성 정렬: 총매출 내림차순 정렬, 식품 ID 오름차순 정렬 MySol) SELECT PRODUCT_ID, PRODUCT_NAME, SUM(PRICE * AMOUNT) TOTAL_SALES FROM FOOD_PRODUCT JOIN FOOD_ORDER USING (PRODUCT_ID) WHERE YEAR(PRODUCE_DATE) = 2022 AND MONTH(PRODUCE_DATE) = 5 GROUP BY PRODUCT_ID ORDER BY 3 DESC, 1 주문..

[programmers] String, Date

조건에 부합하는 중고거래 상태 조회하기- level 2 출처 - https://school.programmers.co.kr/learn/courses/30/lessons/164672 Sol) SELECT BOARD_ID,WRITER_ID,TITLE,PRICE, CASE STATUS WHEN 'RESERVED' THEN '예약중' WHEN 'DONE' THEN '거래완료' WHEN 'SALE' THEN '판매중' END STATUS FROM USED_GOODS_BOARD WHERE CREATED_DATE = "2022-10-05" ORDER BY 1 DESC CASE 문 이용 대여 기록이 존재하는 자동차 리스트 구하기 - level 3 출처 - https://school.programmers.co.kr/le..

[programmers] SUM, MAX, MIN

가격이 제일 비싼 식품의 정보 출력하기 - level 2 출처 - https://school.programmers.co.kr/learn/courses/30/lessons/131115 Sol) SELECT * FROM FOOD_PRODUCT WHERE PRICE = ( SELECT MAX(PRICE) FROM FOOD_PRODUCT ) where 절 서브 쿼리 가장 비싼 상품 구하기- level 1 출처 - https://school.programmers.co.kr/learn/courses/30/lessons/131697 Sol) SELECT PRICE MAX_PRICE FROM PRODUCT WHERE PRICE = ( SELECT MAX(PRICE) FROM PRODUCT ) 집합 함수 max() 최댓..

[programmers] IS NULL

이름이 없는 동물의 아이디 - level 1 출처 https://school.programmers.co.kr/learn/courses/30/lessons/59039 Sol) SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NULL 필드명 IS NULL: 필드명의 데이터가 NULL인 로우만 찾아온다. 경기도에 위치한 식품 창고 목록 출력하기 - level 1 출처 https://school.programmers.co.kr/learn/courses/30/lessons/131114 Sol) SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, COALESCE(FREEZER_YN, 'N') FROM FOOD_WAREHOUSE WHERE ADDRES..

Chapter 10.01 실행 계획

대이터베이스의 주 목적: 많은 데이터를 안전하게 보관하고 빠르게 조회한다. 이러한 목적을 위해 옵티마이저가 사용자 쿼리가 최적으로 처리되도록 실행 계획을 수립할 수 있어야한다. EXPLAIN 명령으로 옵티마이저가 수립한 실행 계획을 확인할 수 있다. 10.1 통계 정보 MySQL 5.7 버전까지는 테이블과 인덱스에 대한 개괄적인 정보를 가지고 실행 계획을 수립했다. 그런데 이는 테이블 칼럼의 값이 어떻게 분포되는지 정보가 없으모로 실행 계획의 정확도가 떨어지는 경우가 많았다. 그래서 8.0 버전부터는 인덱스되지 않은 칼럼들에 대해서도 데이터 분포도를 수진해서 저장하는 히스토그램(Histogram) 정보가 도입됐다. 10.1.1 테이블 및 인덱스 통계 정보 비용 기반 최적화에서 가장 중요한 것은 통계 정보..

Chapter 09.04 쿼리 힌트

MySQL 서버는 인간이 원하는 서비스를 100%이해하지는 못한다. 따라서 서비스 개발자 또는 DBA보다 MySQL서버가 부족한 실행 계획을 수립할 때가 있다. RDBMS에서는 이러한 목적으로 힌트라는 기능이 제공된다. MySQL서버에서 가능한 쿼리 힌트는? 인덱스 힌트: 예전 버전에서 사용되던 힌트들 ex) USE INDEX, STRAIGHT_JOIN 옵티마이저 힌트 ex) MySQL 5.6 부터 새롭게 추가되기 시작한 힌트들을 뜻한다. STRAIGHT_JOIN 도 포함한다. 9.4.1 인덱스 힌트 USE INDEX, STRAIGHT_JOIN 등을 포함한 인덱스 힌트들은 모두 MySQL 서버에 옵티마이저 힌트가 도입되기 전에 사용되던 기능들이다. 이들은 모두 SQL 문법에 맞게 사용해야되므로 사용하게 ..

Chapter 09.03 고급 최적화

9.3 고급 최적화 옵티마이저는 통계 정보와 옵티마이저 옵션을 결합해서 최적의 계획을 수립한다. 옵티마이저 옵션 조인 관련 옵티마이저 옵션 옵티마이저 스위치 옵티마이저 스위치: MySQL 서버의 고급 최적화 기능들을 활성화할지를 제어하는 용도이다. 9.3.1 옵티마이저 스위치 옵션 변수 optimizer_switch를 이용한다. 옵티마이저 스위치 이름 batched_key_access (기본값 off) block_nested_loop engine_condition_pushdown index_condition_pushdown use_index_extensions index_merge index_merge_intersection index_merge_sort_union index_merge_union mrr..

Chapter 09.02 기본 데이터 처리

9.2 기본 데이터 처리 모든 RDBMS는 데이터 가공 결과물이 동일하나 처리 과정은 벤더별로 차이가 있다. 기본적인 데이터 가공을 위해서 MySQL 서버가 어떤 알고리즘을 사용하는지 알아본다. 9.2.1 풀 테이블 스캔과 풀 인덱스 스캔 Def) 풀 테이블 스캔 인덱스를 이용하지 않고 테이블의 데이터를 처음부터 끝까지 읽어서 요청된 작업을 처리하는 작업이다. 상당히 많은 디스크 읽기가 필요하다. 대부분의 DBMS는 한꺼번에 여러 개의 블록이나 페이지를 읽어오는 기능을 내장한다. 그러나 MySQL은 한꺼번에 몇 개씩 페이지를 읽어올지 설정하는 시스템 변수는 없다. 풀 테이블 스캔을 실행할 때 MyISAM 스토리지 엔진: 디스크로부터 페이지를 하나씩 읽어온다. InnoDB 스토리지 엔진: 특정 테이블의 연..

Chapter 09.01 옵티마이저(Optimizer)와 힌트

9.1 개요 실행 계획을 이해해야 실행 계획의 불합리한 부분을 찾아내고 더 최적화된 방법으로 실행 계획을 수립하도록 유도 가능하다. Def) 옵티마이저(Optimizer): MySQL은 쿼리를 최적으로 실행하기 위해 데이터가 어떤 분포로 저장돼있는지 통계 정보를 참조한다. 기본 데이터를 비교해서 최적의 실행 계획을 수립하는 작업을 말한다. MySQL 서버를 포함한 대부분의 DBMS에서 이러한 기능을 담당한다. 명령어 EXPLAIN으로 쿼리 실행 계획을 확인할 수 있다. 9.1.1 쿼리 실행 절차 SQL 파싱(parsing): 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리 (파스 트리)한다. SQL 파서라는 모듈로 처리한다. SQL 문법 검사 SQL 파스 트..

Chapter 08.08 클러스터링 인덱스(Clustering Index)

8.8 클러스터링 인덱스(Clustering Index) 클러스터링: 여러 개를 하나로 묶는다는 의미로 사용한다. Def) 클러스터링: MySQL에서 클러스터링은 테이블의 레코드를 비슷한 것들끼리 묶어서 저장하는 형태로 구현된다. 클러스터링 인덱스는 InnoDB 엔진에서만 지원한다. 8.8.1 클러스터링 인덱스(Clustering Index) Def) 클러스터링 인덱스는 테이블의 프라이머리 키에 대해서만 적용된다. PK가 비슷한 레코들끼리 묶어서 저장하는 것을 말한다. PK 값에 의해서 레코드의 저장 위치가 결정된다. PK값이 변경된다면 레코드의 저장위치가 바뀌어야한다는 뜻이다. PK 값으로 클러스터링된 테이블은 프라이머리 키 값 자체에 대한 의존도가 상당히 크기 때문에 PK를 신중하게 결정한다. 클러스..