DB 13

[Oracle] 병렬처리

병렬처리 2개 이상의 프로세스로 SQL을 처리하는 것 병렬처리의 실행 병렬처리 실행 유도 힌트 : PARALLEL SELECT * /*+ PARALLEL(A 2) */ FROM TABLE A * PARALLEL(테이블_alias 병렬_프로세스_갯수) * PARALLEL은 FULL 힌트와 함께 사용하는 것이 좋음. 옵티마이저의 판단으로 인덱스 스캔이 동작하면 PARALLEL이 적용되지 않음. 오라클 병렬처리 실행 과정 지정된 갯수의 프로세스들이 테이블 풀스캔 (Producer) 지정된 갯수의 프로세스들이 데이터를 전달받아 Group by, Order by, Join 등을 처리 (Consumer) 이 때, 각 프로세스가 담당하는 데이터는 서로 배타적 (연관 없음) 데이터를 하나로 합침 (Query Coord..

DB/SQL 2022.06.14

[Oracle] I/O

인덱스란? 인덱스란, 데이터를 찾기 위한 "목차"입니다. 인덱스 구성 칼럼의 순서에 따라 정렬된 데이터를 가지고 있습니다. 인덱스가 생성되는 경우 기본 키인 경우 기본키 구성 칼럼의 순서에 따라 인덱스가 생성됩니다. 추가로 unique/ununique 인덱스를 생성해줄 수 있습니다. 인덱스를 사용하면 좋은 이유 소량의 데이터를 찾을 때 빠릅니다. 인덱스를 이용해 데이터를 찾으면 인덱스 칼럼 순서에 따라 이미 정렬된 데이터를 조회할 수 있습니다. (정렬 부하 ↓) 인덱스가 빠른 이유 인덱스는 정렬된, 이진트리 자료구조로 저장됩니다. 때문에 데이터를 탐색할 때 이진탐색 방법을 사용하게 됩니다. 1~100 중에 10을 찾아야 된다고 가정합니다. 그러면, 1~100을 절반으로 나눕니다. 그리고 10이 포함되어 ..

DB/SQL 2022.04.05

MYSQL Partition 파티션 키와 테이블

파티션 partition 파티션이란, 하나의 테이블에 데이터가 많을 때, 특정 칼럼을 기준으로 분할하는 것을 말합니다. row을 그룹핑하여 분할하는 것을 수평적 분할(horizontal partitioning)이라고 합니다. 파티션 종류 범위(Range) 파티셔닝 칼럼 1개를 기준으로 범위조건 (less than)을 이용해 파티셔닝 하는 것을 의미합니다. 예를 들어 날짜가 2021.01.01~2021.01.31인 데이터와 2021.02.01~2021.02.28 데이터로 분리하는 것을 의미합니다. 범위조건 칼럼으로는 INT만 사용 가능합니다. DATE, DATETIME 등을 사용하려면 INTEGER로 변환하여 사용하여야 합니다. (ex) YEAR(date) CREATE TABLE employees ( id..

DB/SQL 2021.12.08

MySQL 튜닝 : 대량 데이터 수정/삽입 시 인덱스 제거

인덱스가 있는 테이블에 대량의 데이터를 수정하거나 삽입하게 되면 인덱스도 모두 수정 및 생성하게 되어 속도가 느려집니다. 다음은 인덱스가 있는 테이블에 2만건의 샘플 데이터를 넣는 쿼리문입니다. DROP TABLE IF EXISTS t; -- 테이블 생성 CREATE TABLE T ( ID INT PRIMARY KEY, A INT, B INT, C INT, TYPE CHAR(2) ); -- 인덱스 생성 CREATE INDEX IDX_1 ON T(TYPE, B,A); DROP PROCEDURE IF EXISTS INSERTDATA; -- 프로시저 생성 DELIMITER $$ CREATE PROCEDURE INSERTDATA() BEGIN DECLARE id INT; DECLARE type CHAR; SET..

DB/SQL 2021.10.11

MySQL 튜닝 : 적합한 인덱스 생성하기

Case 1 : 적합한 인덱스가 없을 때 다음은 이름이 Badri 인 사원을 검색하는 쿼리입니다. 먼저 적합한 인덱스가 없어 테이블 전체 299335건을 탐색했습니다(type : ALL). 그리고 나서 where 조건을 이용해10%만 걸러내었습니다. ( filtered : 10.00, Extra Using where) SELECT E.EMP_NO FROM employees E WHERE E.FIRST_NAME = 'Badri'; 실제 저 쿼리 결과로 검색되는 데이터의 건수는 227건입니다. 전체 중 227건을 추출하기 위해 테이블 전체를 스캔하는 것은 비효율적입니다. 그래서 first_name을 구성 칼럼으로 가지는 인덱스를 추가해주었습니다. alter table employees add index id..

DB/SQL 2021.10.11

MySQL 튜닝 : 인라인 뷰 데이터 줄이기

다음의 쿼리는 직원번호가 10000이상 20000사이인 직원의 최대, 최소, 평균 봉급을 가져오는 쿼리문입니다. 인라인 뷰 SS는 모든 직원의 최소, 최대, 평균 봉급을 구한 값을 저장한 임시 테이블입니다. 그리고 임시테이블과 EMPLOYEES 테이블을 조인하면서 직원번호가 10000이상 20000사이인 직원을 골라내고 있습니다. SELECT E.EMP_NO, SS.MAX_SAL, SS.MIN_SAL, SS.AVG_SAL FROM EMPLOYEES E, ( SELECT S.EMP_NO, MAX(S.SALARY) AS MAX_SAL, MIN(S.SALARY) AS MIN_SAL, AVG(S.SALARY) AS AVG_SAL FROM salaries S GROUP BY S.EMP_NO) SS WHERE E...

DB/SQL 2021.10.10

MySQL 조인 JOIN 튜닝 : 불필요한 조인을 EXISTS로 바꾸기

다음의 쿼리는 TITLE이 ENGINEER인 적이 있었던 직원을 가져오기 위한 쿼리입니다. TITLE이 ENGINEER라고 되어있는 기록과 직원 테이블을 JOIN하여 구하고 있습니다. [튜닝 전] SELECT DISTINCT E.EMP_NO, E.FIRST_NAME, E.LAST_NAME FROM EMPLOYEES E, (SELECT T.EMP_NO FROM TITLES T WHERE TITLE = 'Engineer') T WHERE E.EMP_NO = T.EMP_NO; 수행시간 : 1.344 sec / 0.063 sec COST : 'Last_query_cost', '82168.779876' [ 튜닝 후] JOIN을 수행할 필요없이 ENGINEER 였던 적이 존재하는 지 여부만 구하면 되기 때문에 JO..

DB/SQL 2021.10.10

MySQL 쿼리 정리

테스트 데이터 만들기 테이블 생성 CREATE TABLE CREATE TABLE T ( ID INT PRIMARY KEY, A INT, B INT, C INT, TYPE CHAR(2) ); 인덱스 생성 CREATE INDEX CREATE INDEX IDX_1 ON T(B,A); PL/SQL로 데이터 만들기 DELIMITER $$ -- 프로시저 INSERTDATA 선언 시작 CREATE PROCEDURE INSERTDATA() BEGIN DECLARE id INT; -- 증가 변수 ID 선언 SET id = 1;-- 변수 ID의 초기값 선언 WHILE id < 100 DO -- 변수 ID의 값이 100보다 작은 경우 루프 실행 INSERT T VALUES( id, id/10, id/100, id/1000,..

DB/SQL 2021.10.10

MYSQL SELECT 튜닝

인데스 칼럼의 변형 제거하기 다음처럼 WHERE 조건에서 인덱스 칼럼 값에 변형이 가해진 경우는 인덱스를 사용하지 못해 비효율적입니다. 인덱스 칼럼에 변형을 제거해주어야 합니다. [튜닝 전] SELECT A, B, C FROM T WHERE PK1/100 = 1; [튜닝 후] SELECT A, B, C WHERE PK1 BETWEEN 100 AND 199; 다음은 WHERE 조건에서 인덱스 칼럼 2개를 합쳐서 사용한 경우입니다. 이도 마찬가지로 인덱스 칼럼에 변형이 가해졌기 때문에 인덱스를 사용하지 못해 비효율적입니다. [튜닝 전] SELECT A, B, C FROM TABLE WHERE CONCAT(A,B) = '202107'; [튜닝 후] SELECT A, B, C FROM TABLE A = '202..

DB/SQL 2021.10.10

MySQL 데이터 타입 Data Types

숫자 Numeric Data Types DataType 범위 BIT 1 to 64 2^6 TINYINT -128 to 127. 2^7 BOOL, BOOLEAN 0 은 true, 0이 아니면 false SMALLINT -32768 to 32767. 2^16 MEDIUMINT -8388608 to 8388607. 2^24 INT -2147483648 to 2147483647. 2^32 BIGINT -9223372036854775808 to 9223372036854775807. 2^64 DECIMAL(M,D) M인 자연수, D는 소숫점 표현으로 M은 65자리, D는 30자리까지 표현 가능 FLOAT(M,D) -3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E..

DB/SQL 2021.10.10