분류 전체보기
-
SQL BOOSTER - 단일 인덱스DataBase/SQL 2024. 6. 12. 11:31
단일 인덱스의 컬럼 정하기 인덱스는 조건에 맞는 데이터를 빠르게 찾기 위한 객체이다. WHERE 조건절에 사용된 컬럼에 인덱스를 구성하는 것이 기본 원리다. SELECT /*+ GATHER_PLAN_STATISTICS*/TO_CHAR(T1.ORD_DT,'YYYYMM'), COUNT(*)FROM T_ORD_BIG T1WHERE T1.CUS_ID = 'CUS_0064'AND T1.PAY_TP = 'BANK'AND T1.RNO = 2GROUP BY TO_CHAR(T1.ORD_DT,'YYYYMM'); 이제 성능 개선을 위해 단 하나의 단일 인덱스를 고려해보자 후버 컬럼은 WHERE 조건절에 사용된 CUS_ID, PAY_TP, RNO컬럼이다. SELECT 'CUS_ID' COL, COUNT(*) CNT FRO..
-
SQL BOOSTER - INDEXDataBase/SQL 2024. 6. 12. 00:16
인덱스는 SQL 성능 개선을 위한 가장 기본적이면서 치명적인 무기이다. SQL 성능을 최대로 끌어올리기 위해서는 최적의 인덱스가 필요하며, 이를 위해 다음 능력이 필요하다.인덱스의 물리적인 구조를 이해복잡한 SQL을 분해해서 이해할 수 있는 능력만들어진 인덱스가 어떻게 사용될지 예측 가능한 능력테이블 내의 데이터 속성을 파악할 수 있는 능력JOIN의 내부적인 처리 방법(NESTED LOOPS, MERGE, HASH)의 이해 인덱스란? '테이블 내의 데이터를 찾을 수 있게 일부 데이터를 모아서 구성한 데이터 구조' 인덱스를 사용해서, 테이블 내의 데이터를 빠르게 찾아낼 수 있다. CREATE TABLE T_ORD_BIG ASSELECT T1.*, T2.RNO, TO_CHAR(T1.ORD_DT,'YYYYMM..
-
이펙티브 자바 Item 38 - 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라언어/Effective Java 2024. 6. 11. 09:31
열거 타입은 보통은 확장에 적합하지 않다. 확장할 수 있는 열거타입이 필요할 떄도 있는데, 연산 코드가 그 예시이다. 사용자 확장 연산을 추가할 수 있도록 열어주는 것이다. 열거 타입이 임의의 인터페이스를 구현하여 확장하면 된다. 인터페이스를 이용해 확장 가능 열거 타입처럼 만들어보기 public interface Operation{ double apply(double x, double y);} PLUS("+") { public double apply(double x, double y) { return x + y; } }, MINUS("-") { public double apply(double x, double y) { return x - y; } }, T..
-
이펙티브 자바 Item 37 - ordinal 인덱싱 대신 EnumMap을 사용하라언어/Effective Java 2024. 6. 7. 17:43
열거 타입의 ordinal을 배열의 인덱스로 사용하는 경우가 있다. 식물의 생애주기를 열거 타입으로 표현한 LifeCycle타입을 예로 들어보자 public class Plant { final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; }}public enum LifeCycle { ANNUAL, PERNNIAL, BIENNIAL} - Pl..
-
이펙티브 자바 Item 36- 비트 필드 대신 EnumSet을 사용하라언어/Effective Java 2024. 6. 7. 11:08
열거한 값들이 주로 집합으로 사용될 경우, 예전에는 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴을 사용해 왔다. public class StyleWithBitField { public static final int STYLE_BOLD = 1 위와 같이 비트별 OR를 사용해 여러 상수르 ㄹ하나의 집합으로 모을 수 있으며, 이 집합을 비트 필드라한다.하지만, 비트 필드 또한 정수 열거 상수이므로, 정수 열거 상수의 단점을 그대로 지니며, 추가로 다른 문제도 가진다.비트 필드 값이 그대로 출력되면, 단순한 정수 열거 상수를 출력할 때보다 해석하기 더 어렵다비트 필드 하나에 녹아 있는 모든 원소를 순회하기 까다롭다.최대 몇 비트가 필요한지 처음부터 예상하고 적절한 타입을 선택해야한다.E..
-
이펙티브 자바 Item 35 : ordinal 메서드 대신 인스턴스 필드를 사용하라언어/Effective Java 2024. 6. 7. 10:14
열거 타입 상수는 하나의 정수값에 대응되며, 모든 열거 타입은 해당 상수가 몇 번째 위치인지 반환하는 ordinal()메서드를 제공한다. ordinal()의 잘못 사용한 예 해당 코드는 상수 선언 순서를 바꾸는 순간 오작동하며, 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다. 동작은 하지만 유지보수의 어려움이 있다! public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTER, OCTET, DOUBLE_QUARTET, NONET, DECTET, TRIPLE_QUARTET; public int numberOfMusicians() { return ordinal() + 1; } 열거 타입 상수에..
-
성능 개선을 위한 기본 지식 - 옵티마이저, 소프트 파싱,하드 파싱DataBase/SQL 2024. 6. 6. 17:44
1. 옵티마이저 옵티마이저는 성능 최적화기라고 할 수 있다. SQL 실행 계획을 만드는 역할으 수행한다. 옵티마이저에는 두 가지 방식이 있는데, 비용 기반 옵티마이저(CBO),와 규칙 기반 옵티마이저(RBO)이다. 비용 기반 옵티마이저는 최소 비용으로 목표로 실행 계획을 만들고, 규칙 기반은 일정한 규칙에 따라 실행 계획을 만든다. 대부분의 RDMS가 비용 기반 옵티마이저이다. 1.2 비용이란? 비용 기반 옵티마이저에서 비용은 IO횟수, CPU Time, 메모리 사용량을 의미한다. 이와 같은 비용을 산출할 때 가장 중요한 것은 테이블의 통계 정보다. 통계 정보가 제대로 수집되지 않으면, 옵티마이저는 엉뚱한 실행계획을 만든다. 통계가 제대로 구성되었더라도 완벽한 실행 계획은 나오지 않는다. 이런 경우 실..
-
성능 개선을 위한 기본 지식 - 실행 계획DataBase/SQL 2024. 6. 6. 17:12
1. 들어가며, SQL 성능 관련해서 '좌변은 절대 가공하지 말라'라는 말이 있다. WHERE를 사용하며, 왼쪽 컬럼을 가공하면 인덱스를 사용하지 못하기 때문이다. 이러한 사실을 망각하고, 무조건 좌변을 가공하지 않기 위해 WHERE '201701' = SUBSTR(T1.ORD_TMD,1,6)같은 SQL을 작성하거나, INNER JOIN 순서를 바꾼다고 성능이 좋아질 것이란 결론에 도달하기도한다. 결론적으로 SQL 성능 개선을 위한 방법들은 절대 암기할 것이 아니라, 원리를 잘 파헤치고 고민하는 과정이 중요하다 항상 실행계획을 확인하고, 문제점이 무엇인지 찾아보는 것이 좋다. 2. 실행 계획 이란 오라클과 같은 DBMS에서 데이터를 조회하거나 변경하려면, SQL을 사용해야한다. SELECT,UP..