본문 바로가기

DB관련

(37)
Bulk Insert - Insert 쿼리 최적화 oracle 이나 MySql과 같은 개발환경을 사용하여 개발을 했을때 다량의 데이터를 생성해야 될 때가 있다. Bulk Insert는 편하고 빠르게 다수의 건의 데이터를 넣을때 사용된다. 예시와 함께 MySql을 기준으로 설명을 해보겠다. 1. 테이블 생성 CREATE TABLE BULK_INSERT_SAMPLE (A int, B int, C int); insert 구문을 한건씩 사용하게 된다면 생성이 필요한 개수만큼 쿼리를 실행하게 된다. 하지만 쿼리를 반복하는 만큼 실행하는 것은 자원을 많이 소모하는 작업이며, 작업시간도 조금 더 소요될 수도 있다. 또 도중 Connection에 문제가 생긴다면 그에 따른 문제가 생길 수도 있다. insert into BULK_INSERT_SAMPLE VALUES(1..
[DB] 테이블의 스캔방식 db에서 db오브젝트를 스캔하는 방식에 따라 속도가 차이가 난다는 걸 최근에 알게 되었다. 때문에 정리를 해보고자 한다. 디스크의 접근 방식 1.시퀸셜 액세스 - 물리적으로 인접한 페이지를 순차적으로 읽는 방식이다. - 디스크 헤더의 움직임을 최소하하여 작업시간과 리소스 점유 시간을 줄일 수 있다. 2.랜덤 액세스 - 물리적으로 떨어진 페이지를 임의로 접근하는 방식이다. - 디스크 헤더에 많은 움직임을 요구하기 때문에 접근 시간이 오래걸린다. - 접근 범위를 줄이는 방식으로 튜닝이 필요할 수도 있따. 테이블 스캔방식 1.테이블 풀 스캔 - 인덱스를 거치지 않고 테이블 데이터 처음부터 끝까지 모든것을 스캔하는 방식이다. - where 조건을 기준으로 인덱스가 없을경우 이 스캔방식을 사용한다. - 시퀸셜 액..
PIVOT - 행을 열로 바꾸기 통계페이지와 같은 집계가 필요한 경우 종종 로우를 칼럼으로 바꿔서 출력해야될 경우가 있다. 로우를 칼럼으로 바꾸는 방법을 3개 정도 알아보고자 한다. 1.DECODE 혹은 CASE 문을 사용하는 방법 2.WITH 절을 이용한 방법 3.PIVOT 함수를 이용하는 방법 이 글에서 사용하는 테스트 데이터는 다음과 같다. create table table_score( years varchar(100) ,game_name varchar(100) ,play_level varchar(100) ,rate int ); insert into table_score values ('2023','ez2on','lv14',92); insert into table_score values ('2023','ez2on','lv15',8..
maira db 설치하기 1.maria db 설치파일 받기 마리아 db 다운로드 파일은 이곳에서 받을수 있다. https://mariadb.org/ 초록색으로 표시된 영역에서 version을 선택할 수 있다. 빨간색으로 표시된 영역에서는 Zip파일로 다운받을지 MSI 파일로 다운받을지 성택할 수 있다. Download를 눌러 설치 파일을 받자. 2.설치하기 설치파일을 실행시키면 다음과 같은 화면이 나타난다. Next를 눌러주자 다시한번 Next 설치경로를 설정하고 Next를 누르자 - 다음은 maria db의 최상위 권한을 가진 root 계정의 비밀번호를 설정해야한다. 잊어버리면 안되니 주의하자. - Enable access from remote machines for 'root' user 이 옵션은 localhost 외부 컴퓨..
CONNECT BY 사용하기 CONNECT BY 란 계층형 쿼리를 조회하기 위한 쿼리이다. 다음과 같이 회사 조직도가 있다고 해보자. 조직에는 각 계층이 있다. 각 계층을 A레벨, B레벨 ,C 레벨이라 하겠다. 각 레벨들의 정보들을 기록한 테이블이 다음과 같다고 해보자. 각 row 에는 상위 부서 번호와 해당 부서의 번호가 있고, 부서번호가 만약에 시퀸스값으로 insert 가 된다고 할 때 만약에 조회를 할 때 A레벨부터 B레벨, C레벨 순으로 나오게끔 하고 싶다면 어떻게 해야될까? 단순히 order by 를 하면 레벨별로 나온다고 무조건 장담할 수 없다. 이럴때 사용하는게 계층형 쿼리이다. 1. 계층형 쿼리 오라클에서 계층형 쿼리의 예약어는 START WITH 이다. START WITH - 계층의 루트노드(처음행)로 사용될 행을 ..
SQL 쿼리의 실행 순서 1.일반적인 쿼리의 실행순서 예제로 쿼리를 실행해 본다고 하자 SELECT DISINTCT sample_data FROM sample_main_table a INNER JOIN sample_sub_table b ON a.key_id = b.key_id WHERE sample_condition = 2 GROUP BY sample_data HAVING SUM(sample_data) > 1 ORDER BY sample_data (LIMIT 5) FROM 절이 먼저 실행이 된다. ON으로 조인 조건을 확인한다. JOIN 으로 테이블을 조인한다. WHERE 절을 검사하여 조건을 체크한다. GROUP BY 를 실행하여 조회 칼럼을 그룹화한다. HAVING 으로 그룹화 한 이후에 대한 데이터 조건을 체크한다. SEL..
데이터 베이스 옵티마이저란? 1.옵티마이저란? SQL을 실행을 할 때 DB는 내부적으로 SQL을 가장 빠르고 효율적이게 처리를 하려고 한다. 때문에 DBMS는 실행계획을 세우고 SQL을 실행시킨다. 실행계획을 짜기 위해 사용하는 것이 옵티마이저이다. 2.실행계획(Execution Plan) 동일한 결과가 나오는 SQL을 작성하더라도 어떻게 실행되냐에 따라 성능이 달라질 수 있다. 옵티마이저는 Data Dictionary에 있는 오브젝트 통계, 시스템 통계등의 정보를 사용해서 예상되는 비용을 평가하여 여러 실행계획을 작성한다. 그 뒤 여러가지 실행계획의 비용을 계산하고 가장 낮은 비용을 가진 실행 계획을 선택하여 SQL을 실행시킨다. 3.쿼리의 처리 흐름 SQL이 작성되고 실행된다. 파서(Parser)는 작성된 SQL의 문법검사와 구..
JPA -여러가지 어노테이션 @MappedSuperclass 매핑정보만 상속받는 Superclass라는 의미 @EntityListeners 엔티티에 대한 데이터가 변경될 시점을 정의 @PostLoad: 해당 엔티티를 새로 불러오거나 refresh 한 이후. -- @PrePersist: 해당 엔티티를 저장하기 이전 -- @PostPersist: 해당 엔티티를 저장한 이후 -- @PreUpdate: 해당 엔티티를 업데이트 하기 이전 -- @PostUpdate: 해당 엔티티를 업데이트 한 이후 -- @PreRemove: 해당 엔티티를 삭제하기 이전 -- @PostRemove: 해당 엔티티를 삭제한 이후