전체 글

초보 개발자의 지식 공유의 장
개발자라면 옵티마이저가 실행계획을 생성할 때, 최대한도로 성능을 발휘할 수 있도록 불필요한 로직을 타지 않게 쿼리를 작성해야 한다. 같은 결과를 산출하는 쿼리는 여러 가지 형태로 작성될 수 있으므로, 개발자는 SQL 문장 단에서 최대한 효율적인 문장을 작성해야 한다. "쿼리를 이렇게 작성하면 좋은 성능을 발휘한다"라는 일반적인 가이드 라인을 알아보자! 가급적 WHERE 조건에서는 인덱스 컬럼을 모두 사용한다. 인덱스를 만들어 놓더라도 WHERE 조건을 어떻게 명시하느냐에 따라 옵티마이저가 인덱스를 사용할 수도 있고 사용하지 않을 수도 있다. 예를 들어 A와 B라는 컬럼의 인덱스를 만들었는데, WHERE 조건에서 A 컬럼만 사용한다면 인덱스를 타지 않게 된다. 예) CONTRACT 테이블에서 CONTRAC..
조인 방법쿼리에 조인이 포함되어 있을 경우에는 옵티마이저 또한 테이블 간에 조인 작업을 수행하게 된다.옵티마이저는 Nested Loop Join, Sort Merge Join, Hash Join 등 세 가지 조인 방법(Join Method)을 사용하여 조인 작업을 수행하게 된다. 중첩 루프 조인(NLJ)WHERE 절에 있는 조건에 따라 두 테이블에서 하나의 테이블을 기준으로 삼아 다른 하나의 테이블에 있는 데이터를 읽는 방식이다.기준이 되는 테이블 => 드라이빙 테이블(Driving Table) 혹은 Outer Table나머지하나의 테이블 => Inner Table SELECT EMP.EMPLOYEE_ID, EMP.DEPARTMENT_ID, DEP.DEPARTMENT_NAMEFROM EMPLOYEES E..
옵티마이저가 각각의 실행계획에 따른 비용을 산정하는데 있어서 테이블이나 뷰의 데이터를 읽어오는 방식을 접근 경로(Acces Path)라 하는데, 이러한 접근 경로에는 다음과 같은 것들이 있다. Full Table Scan일반적으로 Full Table Scan은 인덱스를 사용한 검색에 비해 비효율적인 접근 방식으로 알려져 있고 많은 경우에 있어서 비효율적이다.테이블에 데이터가 적은 경우에는 성능차이가 미미하게 느껴질 수 있지만, 수십 혹은 수백만 건의 데이터를 가진 테이블에서 100건 정도의 데이터를 검색하기 위해 테이블 전체를 검색하는 것은 비효율적일 수 밖에없다.하지만 Full Table Scan방식이 항상 좋지 않은 것은 아니다.인덱스를 사용한 방법은 일단 인덱스 정보를 먼저 검색해서 실제 데이터를 ..
조인수행원리조인이란 두 개 이상의 테이블을 하나의 집합으로 만드는 연산조인 연산은 두 테이블 사이에서 수행된다.FROM절에 A, B, C라는 세 개의 테이블이 존재하더라도 세 개의 테이블이 동시에 조인이 수행되는 것이 아니라, 세 개의 테이블 중에서 먼저 두개의 테이블에 대해 조인이 수행되고 그 수행된 조인 결과와 나머지 테이블 사이에서 조인이 수행된다. 이러한 작업은 FROM 절에 나열된 모든 테이블을 조인할 때까지 반복 수행된다.A->B->C , A->C->B 이런 순서로 조인이 실행될 수 있음테이블 또는 조인 결과를 이용하여 조인을 수행할 때 조인 단계별로 다른 조인 기법을 사용할 수 있다. NL JoinNL Join은 프로그래밍에서 사용하는 반복문과 유사한 방식으로 조인을 수행한다.반복문 외부에 ..
인덱스 기본1. 인덱스 특징과 종류인덱스는 원하는 데이터를 쉽게 찾을 수 있도록 돕는 책의 색인과 유사한 개념이다.인덱스의 기본적인 목적은 검색 성능의 최적화이다. Insert, Update, Delete 등과 같은 DML 작업은 테이블과 인덱스를 함께 변경해야 하기 때문에 오히려 느려질 수 있는 단점이 존재한다. 트리 기반 인덱스DBMS에서 가장 일반적인 인덱스는 B-트리 인덱스이다.B-트리 인덱스는 브랜치 블록(Branch Block)과 리프 블록(Laef Block)으로 구성브랜치 블록 중에서 가장 상위에서 있는 블록을 루트 블록(Root Block)이라 한다.브랜치 블록은 분기를 목적으로 하는 블록이다. 다음 단계의 블록을 가리키는 포인터를 가지고 있다.리프 블록은 트리의 가장 아래 단계에 존재한..
실행계획(Execution Plan)실행계획(Execution Plan)이란 SQL에서 요구한 사항을 처리하기 위한 절차와 방법을 의미한다.동일한 SQL에 대해 결과를 낼 수 있는 다양한 처리 방법(실행계획)이 존재할 수 있지만 각 처리 방법마다 실행 시간(성능)은 서로 다를 수 있다.옵티마이저는 다양한 처리 방법들 중에서 가장 효율적인 방법을 찾아준다.(최적의 실행계획을 생성) 실행계획의 구성요소에는조인 순서(Join Order)조인 기법(Join Method)액세스 기법(Access Method)최적화 정보(Optimization Information)연산(Operation) 등이 있다. 조인순서(Join Order)수행할 때 참조하는 테이블의 순서FROM AINNER JOIN B일 때, 조인 작업을..
옵티마이저옵티마이저(Optimizer)는 사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하는 역할을 수행이러한 최적의 실행방법을 실행계획(Execution Plan)이라고 한다.다양한 실행 방법들 중에서 최적의 실행방법을 결정하는 것이 바로 옵티마이저의 역할이다. 옵티마이저가 최적의 실행 방법을 결정하는 방식에 따라 규칙기반 옵티마이저(RBO, Rule Based Optimizer)와 비용기반 옵티마이저(CBO, Cost Based Optimizer)로 구분된다.(현재 대부분의 데이터베이스는 비용기반 옵티마이저만을 제공) 규칙기반 옵티마이저=> 규칙(우선순위)을 가지고 실행계획을 생성한다.규칙기반 옵티마이저가 조인 순서를 결정할 때는 조인 컬럼 인덱스의 존재 유무가 중요한 판단의 기준이된다.Si..
List 구현체 Vector 와 ArrayListList 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 공통적인 특징을 갖는다. 공통점 차이점 List 인터페이스를 구현한다. 저장순서가 유지되고 중복을 허용한다.데이터의 저장 공간으로 배열을 사용한다. Vector는 멀티쓰레드에 대한 동기화가 되어 있으나 ArrayList는 그렇지 않다. => Vector는 동기화처리 때문에, 성능이 좋지않으므로 사용할때 주의해야 한다. LinkedList배열은 가장 기본적인 형태의 자료구조로 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간(access time)이 가장 빠르다는 장점을 가지고 있다.하지만 !! 아래와 같은 단점이 존재한다.1. 크기를 변경할 수 없다. 크기가 넘으면 새로운 배열..
IoC컨테이너 계층구조빈의 개수가 많아져서 설정파일이 커지는게 문제라면 파일을 여러개로 쪼개서 만들고 하나의 애플리케이션 컨텍스트가 여러 개의 설정파일을 사용하게하면 그만이다. 하지만 한 개 이상의 IoC컨테이너를 만들어두고 사용해야 할 경우가 있다. 바로 트리 모양의 계층구조를 만들때다. 부모컨텍스트를 이용한 계층구조 효과모든 애플리케이션 컨텍스트는 부모 애플리케이션 컨텍스트를 가질 수 있다.모든 컨텍스트는 각자 독립적인 설정정보를 이용해 빈 오브젝트를 만들고 관리독립적으로 자신이 관리하는 빈을 갖고 있지만, DI를 위해 빈을 찾을 때는 부모 애플리케이션 컨텍스트의 빈까지 모두 검색(필요한 빈을 찾고 없으면 부모 컨텍스트에게 빈을 찾아달라고 요청. 없으면 부모의 부모.. 루트 컨텍스트까지 전달) 중요한..
IoC 컨테이너컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있다고 해서 IoC라고 부른다.(IoC 컨테이너)실제로 스프링 컨테이너 또는 IoC컨테이너라고 말하는 것은 바로 이 ApplicationContext 인터페이스를 구현한 클래스의 오브젝트이다. (BeanFactory 인퍼에스 상속)IoC 컨테이너가 사용하는 빈(bean) 메타정보는 대략 다음과 같다.빈 아이디, 이름, 별칭 : 빈 오브젝트를 구분할 수 있는 식별자클래스 또는 클래스 이름 : 빈으로 만들 POJO 클래스 또는 서비스 클래스 정보스코프 : 싱글톤, 프로토타입과 같은 빈의 생성 방식과 존재 범위프로퍼티 값 또는 참조 : DI에 사용할 프로퍼티 이름과 값 또는 참조하는 빈의 이름생성자 파라미터 값 또는 참조 : DI에 사용할 생성..
깡냉쓰
평범한 개발자 노트