데이터베이스5 [Database] SORT MERGE JOIN 최적화 1. SORT MERGE JOIN이란? Sort Merge는 결합 대상 테이블들을 각각 결합키로 정렬하고, 일치하는 결합키를 찾으면 결합한다. Nested Loop의 중첩 for문과 유사하다고도 볼 수 있음. 1. 각 테이블에 대해 동시에 독립적으로 데이터를 먼저 읽어 들인다. 2. 읽혀진 각 테이블의 데이터를 조인을 위한 연결고리에 대하여 정렬을 수행한다. 3. 정렬이 모두 끝난 후에 조인 작업이 수행한다. 2. SORT MERGE JOIN 특징 대상 테이블을 모두 정렬해야 하므로 메모리를 많이 소비. Hash는 한쪽 테이블에 대해서만 해시 테이블을 만들므로 Hash보다 많은 메모리를 사용한다. Hash와 다르게 부등호를 사용한 결합에도 사용할 수 있다. 단, 부정조건 결합에서는 사용할 수 없다. 테이.. 2021. 11. 14. [Database] 데이터베이스 I/O 원리 및 최적화 1. Database Read Database는 데이터를 블록(Block) 단위로 읽고 저장한다. 오라클의 경우는 기본 블록 사이즈가 8kb이다. 즉, database가 아주 작은 데이터를 가져온다고 하더라도 최소한 8kb의 블록을 읽는다. Database의 튜닝에서 가장 중요한 것은 바로 이 블록 단위 I/O를 줄이는 것이다. 2. 메모리 I/O vs 디스크 I/O 디스크 I/O : 디스크의 액세스 암이 움직이면서 헤드를 통해 데이터를 읽고 쓴다. 메모리 I/O : 전기적 신호 디스크 I/O를 통한 입출력은 메모리를 통한 입출력보다 평균적으로 10,000배 이상 느리다. 메모리는 물리적으로 한정된 자원이므로, 디스크 I/O를 최소화하고 버퍼 캐시 효율을 높이는 것이 데이터베이스 I/O 튜닝의 목표가 된.. 2021. 11. 14. [Database] Nested Loop 최적화 1. Driving Table 모수 고려 Nested Loop 최적화를 할 때 "Driving Table(Outer Table)을 대상건수가 적은 테이블로 선정하라는 원칙"을 지키고 조인을 하였는데 하나 의문점이 생겼다. Driving table이 100건이고 Driven-to table(Inner Table)이 1000건일 경우 조인 횟수는 100 X 1000이고, 반대의 경우에도 어차피 1000 X 100으로 똑같지 않나라는 의문이 들었다. 하지만 이거는 INDEX가 없을 때나 해당된다. 다른 블로그 글을 찾아보니 Driving Table의 대상 건수를 줄이는 이유는 "드라이빙 테이블의 추출 건수가 곧 드리븐 테이블의 액세스 반복 횟수가 되므로 건수가 더 적은 테이블이 드라이빙 테이블로 선정되어야 한.. 2021. 11. 14. [Database] 정규화 정리 1. 정규화의 목표 정규화의 목표는 테이블 간에 중복된 데이터를 허용하지 않는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있으며, 데이터 베이스의 저장 용량도 줄 일 수 있다. 2. 제 1 정규화 제 1 정규화란 테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는 것 이다. 다음과 같은 상품 테이블이 있다고 할 때 현재 카테고리 컬럼에 여러개의 값이 들어가고 있다. 즉, 제 1 정규형을 만족하지 못하고 있다. [상품 테이블] 상품명 카테고리 새우깡 과자,간식 감자칩 과자 왕뚜껑 라면,식품 위의 테이블을 정규화하면 아래와 같다. [상품 테이블] 이름 카테고리 새우깡 과자 새우깡 간식 감자칩 과자 왕뚜껑 라면 왕뚜껑 식품 3. 제2 정규화 제2 정규화란 제 1정규화를 진행한 테이블에 대해.. 2021. 10. 24. Statement와 PreparedStatement 1. PreparedStatement 데이터베이스 관리 시스템(DBMS)에서 동일하거나 비슷한 데이터베이스 문을 높은 효율성으로 반복적으로 실행하기 위해 사용되는 기능을 말한다. 2. PreparedStatement 동작 방식 PreparedStatement는 위와 같이 4단계로 나누어져있다. 이중 parse 부분을 컴파일한채로 캐시에 저장하고 데이터가 bind 될 때 마다 patch까지 실행이 완료되고 sql을 재사용할 때 캐시에 저장되어 있는 부분을 가져다 나머지 3단계만 실행한다. 또한 바인딩 된 데이터는 SQL 문법이 아닌 내부의 인터프리터나 컴파일 언어로 처리하므로 문법적인 의미를 가질 수 없다. 즉, parse부분에서 이미 쿼리의 문법적인 처리 부분이 수행되어 있고 바인딩 단계에서 입력된 부분.. 2021. 10. 17. 이전 1 다음