1. 인덱스 레인지 스캔 쿼리 : SELECT * FROM emp WHERE FIRST_NAME BETWEEN 'EBBE' AND 'GAD'; 인덱스 레인지 스캔은 루트 노드로부터 비교를 시작해 리프노드에 도달하여, 리프노드의 시작위치부터 순차적으로 읽는 방식이다. 그리고 범위에 마지막에 해당하는 데이터의 주소를 찾을 때까지 스캔하는 방식이다. 최종적인 데이터까지 스캔을 하면 데이터를 사용자에게 반환하고 쿼리를 종료한다. 리프노드에서 최종 데이터의 주소를 발견하면주소를 통해 데이터 파일을 읽어온다. 그리고 데이터를 파일에서 데이터를 읽는 것은 랜덤 I/O 이다. 만약 최종적으로 찾는 데이터가 5개라면, 5번의 랜덤I/O가 발생하는 것이다.인덱스를 통해 해당 데이터의 주소를 찾는 것이 비용이 많이 들지는 ..
1. 인덱스 키 값의 크기 디스크에 데이터를 저장하는 기본 단위를 페이지 또는 블록이라 하며, 디스크의 모든 읽기 및 쓰기 작업의 최소 단위가 된다. 인덱스는 페이지 단위로 관리된다. 인덱스의 B-Tree는 자식 노드의 개수가 가변적인 구조이다. 그리고 자식 노드의 개수가 페이지의 크기와 값에 의해결정된다. 인덱스의 키값을 16바이트, 자식 노드의 주소를 12바이트, 하나의 인덱스 페이지를 16KB 라고 한다면, 16 * 1024 / (16 + 12) = 585개의 인덱스를저장할 수 있다. 그렇다면 인덱스 키의 값을 두배로 늘린다고 하면, 16 * 1024 / (32 + 12) = 372개 저장할 수 있게 된다.만약에 SELECT 쿼리가 500개의 데이터를 읽는다고 한다면, 페이지의 크기가 16KB일 때..
1. 데이터를 저장하는 매체의 종류 CPU, 메모리와 같으 전기적 특성을 가지고 있는 장치의 성능은 빠른 속도로 발전했지만, 디스크와 기계식 장치의 성능은 제한적으로 발전했다.그렇기 때문에 데이터베이스 성능 튜닝은 기계식 장치인 디스크의 I/O를 줄이는 것이 가장 중요한 포인트이다. 데이터를 저장할 수 있는 매체는 내장 디스크, DAS, NAS, SAN이 존재한다. - 내장 디스크 : PC내부 공간에 장착할 수 있는 갯수가 제하적이며, 용량이 부족한 경우 많이 존재 - DAS : 내장 디스크의 용량의 문제를 해결, SATA, SAS와 같은 케이블로 하나의 PC에만 연결이 가능. 최대 200개 까지 연결하여 사용가능하지만 여러 PC 공유 불가 - NAS : 케이블이 아닌, TCP/IP를 통해 연결이 되며,..
1. 다대일 양방향 연관관계 양방향 연관관계에서는 외래키가 있는 객체가 연관관계의 주인역할을 수행한다. 여기서 주인은 외래키를 생성, 삭제, 수정할 수 있는 외래키 관리자를 의미한다.그리고 다대일 양방향 연관관계에서는 항상 '다(N)' 가 주인의 역할이다. 그리고 하인의 역할을 맡는 객체는 mappedBy라는 속성이 부여되고, 이 mappedBy에는주인의 참조키를 설정해주어야 한다. 아래 코드를 보면 하인의 역할을 수행하는 Team의 mappedBy에는 주인의 참조키의 필드명이 저장되어 있다.그리고 양방향 연관관계에서 중요한 것은 항상 서로를 참조해야 한다는 것이다. 아래 코드를 보면 Member는 Team을 등록할 때, Team에 Member 추가하고,Team이 Member를 등록할 때, Member에..
1. 단방향 연관관계 - 회원은 하나의 팀에만 소속될 수 있다. - 팀에는 여러 회원을 가지고 있다. 먼저 위의 경우는 N (회원) : 1 (팀) 의 관계이다. 서로의 연관관계를 결정할 때, 항상 헷갈리고 어렵다. 이럴때 가장 좋은 방법은 역지사지의 방법이다.반대편의 입장을 결정하는 방법이다. 예를들어, 회원의 입장에서는 하나의 팀에만 소속될 수 있기 때문에 팀은 1이고, 팀의 입장에서는 여러 회원을 가질 수 있기 때문에 회원은 N 이다. 결론적으로 N : 1 의 관계이다. 이렇게 생각하면 어렵지 않다! 나는 항상 헷갈렸다! 위와 같은 경우에는 객체의 연관관계와 테이블의 연관관계가 서로 다르다. 객체의 연관관계에서는 회원 객체는 Member.team 필드로 팀과 연관관계를 가진다.회원은 Memeber.t..
엔티티를 조회할 때, 연관된 데이터들이 항상 사용되는 것은 아니다. 예를들어 Question 엔티티가 아래와 같이 List를 가지고 있다고 하자! 물론 질문 상세보기에서 해당 답변 목록을 보여줄때는 List는 필요하다. 하지만 질문 상세 보기 이전에 질문들의 목록을 나타내는 게시판에서Answer의 갯수만 필요하다고 한다면, 굳이 List의 목록이 필요없다. 오히려 List를 모두 가져와야 한다는 것에서 굉장히 효율적이지 못한다.이럴때는 Answer의 갯수를 관리하는 필드가 있고, Answer의 내용이 필요할때만 Answer를 가져오고 그러지 않을 때는 Question의 필드값만 불러오면가장 베스트이지 않을까? 위와 같이 엔티티가 실제 사용될 때까지 데이터베이스의 데이터를 조회하는 것을 지연하는 방법을 지..
1. Entity Manager Factory & Entity Manager 애플리케이션이 실행될 때, xml 또는 properties 파일에 있는 정보를 바탕으로 Entity Manager Factory 를 생성한다. Entity Manager Factory를 이용해서Entity Manager 생성이 가능하다. Entity Manager Factory 는 비용이 많이 소요되기 때문에 하나의 애플리케이션에서 공유해서 사용이 가능하고,멀티스레드에서도 동기화 처리를 통해 안전하게 사용이 가능하다. 하지만 Entity Manager는 여러 스레드에서 공유해서 사용되서는 안되기 때문에스레드마다 Entity Manager를 생성할 필요가 있다. 아래는 SPRING BOOT에서 JPA Database 설정을 위한 ..