프로그래밍/Database 20

MySQL eq_range_index_dive_limit 를 활용한 쿼리 수행시간 개선 및 실무에서 발생할 수 있는 연관된 문제

배경 의도치 않게 쿼리 수행시간이 증가하거나 이슈가 발생하는 부분 중 하나인 쉽게 발생하지만 원인파악이 쉽지 않은 부분에 대한 내용입니다. IN절로 인한 쿼리 수행시간이 증가하는 것에 따른 원인파악과 해결방법에 대해서 다룹니다. IN절에 들어가는 개수에 따라 쿼리 수행시간이 급격하게 나빠지는 경우가 존재하기 때문입니다. 설정값 eq_range_index_dive_limit eq_range_index_dive_limit IN 절에 길게 중첩되었을때 쿼리 속도를 높이는데 사용되는 값이다. 이 값 이상이라면 옵티마이저는 인덱스 다이빙을 수행하지 않고 기존 인덱스 통계를 사용한다. 0으로 설정하면 항상 인덱스 다이빙을 수행한다. 아래와 같은 쿼리가 있을 때, col_name IN(val1, ..., valN) ..

MySQL의 Between 쿼리 개선하기

본 글은 RealMySQL 도서를 스터디하며 읽은 내용 + 실습한 내용입니다. Between을 써서 쿼리를 작성하는데 있어서 비효율적으로 탈 수 있는 쿼리를 개선해 볼 수 있는 내용을 다루었습니다. 테스트 데이터 세팅 실습을 하려면 실제 쿼리를 수행해보고 실행계획을 확인할 수 있는 환경이 필요하다. 먼저 테이블은 컬럼을 간단히 만들었다. (id, position, no) 3개의 컬럼이 있는데 position은 직원의 직책이고 no는 사번이라고 생각하면 된다. 인덱스는 (position + no)에 걸어놓았다. 테스트를 위해서 데이터세팅을 해보았다. 아래와 같이 대충 insert가 되도록 하였다. @Component public class Runner implements CommandLineRunner {..

MySQL 잠금과 Isolation level에 대해서

트랜잭션은 작업의 완전성을 보장해줍니다. 함께 수행되어야 하는 작업들을 묶어서 전부 완벽하게 처리하거나 하나라도 처리가 되지 않으면 다시 원상태로 돌리는 작업을 하는 것을 의미합니다. 잠금과 트랜잭션은 비슷하면서 다릅니다. 잠금: 동시성을 제어하기 위함 → 여러 커넥션에서 동시에 같은 레코드나 테이블에 접근하여 변경할 경우 결과적으로 예측할 수 없는 값이 됨. 트랜잭션: 데이터의 정합성을 보장하기 위함. 격리수준이라는 것을 정의할 수 있는데 이것은 하나 혹은 여러 트랜잭션에서 작업내용을 어떻게 공유하고 차단할지를 결정하는 것입니다. 트랜잭션 트랜잭션은 묶여있는 논리적 작업 단위들이 전부 반영되거나 오류발생 시 하나도 반영되지 않아야 합니다. MySQL의 스토리지 엔진에 따라도 차이가 있는데요. MyISA..

[데이터베이스] 동시 실행 제어 (Concurrency Control)와 공유 lock, 배타적 lock에 대해서

동시 실행 제어1. 락에 대해서 Lock - Based Protocol Lock이란 자원에 액세스하는 환경에서 순차적으로 제어할 수 있는 매커니즘이다. lock은 2가지로 분류할 수 있다. 1) Exclusive Lock : (X mode) 배타적 Lock은 여러 트랜잭션이 한 데이터에 접근할 수 없다. 2) Shared Lock : (S mode) 공유 락은 읽기 동안에만 일어나며 여러 트랜잭션이 동시에 한 데이터를 읽을 수 있다. Shared lock 끼리는 충돌하지 않는다. 하지만 Exclusive Lock과는 호환되지 않는다. 예를 보면 처음에 A 는 $100 B는 $200 을 가지고 있는데 B가 A에게 $50을 보내는 시나리오이다. T1이 자원 B에게 쓰기 위해서 배타적 락을 건다. B-50을 ..

[데이터베이스] 트랜잭션(Transaction)에대한 고찰

데이터베이스 트랜잭션데이터베이스 트랜잭션이란 데이터베이스의 상태를 변화시키는 프로그램의 작업 단위이다. 1. SQL 표준에서의 Transaction제일 첫 번째 SQL 문이 자동으로 Transaction 의 시작Commit을 호출하면 트랜잭션 종료Rollback을 호출하면 트랜잭션 취소AutoCommit 모드일 경우 SQL 문장 하나 단위로 Transaction 2. Transaction의 성질 (ACID) 2-1. 원자성 (Atomicity)트랜잭션의 작업들이 모두 수행되거나 전혀 수행되지 않아야 한다.. (all or nothing)트랜잭션이 부분적으로 수행된다면 데이터베이스에 반영되지 않아야 한다. 그렇지않다면 데이터베이스의 상태가 inconsistent해진다. 2-2. 지속성 (Durability..

[데이터베이스] 쿼리 최적화에 대해서 (Query Optimization)

데이터베이스 쿼리 최적화에 대해서두 개의 relational algebra 표현식이 데이터베이스 인스턴스에서 항상 같은 튜플들을 반환한다면 그것은 동등(equivalent)하다고 한다. (순서는 상관 없음) 참고) 스키마 : 데이터베이스의 논리적 구조, 인스턴스 : 특정시간에 사진을 찍었을 때 그 테이블의 모습. 즉 튜플들의 전체적인 모습 Equivalence Rules이 중에 대표적인 것들을 보자. 1. 네추럴 조인 (Natural Join)은 associative(동일)하다. 2. select연산의 동등성테이블 E1과 E2는 각각 1000개의 튜플을 가지고 있다고 하자. (조건은 세타제로 조건을 만족하는 것은 10개밖에 없다고 가정하자)왼쪽 식에서는 먼저 조인을 시도 한다. 각각 1000개니까 조인하..

[데이터베이스] 트랜잭션에 대해서

트랜잭션이란 하나의 논리적인 작업 단위를 이루는 여러 연산들의 집합을 말한다. 예를들어, 한 계좌의 돈을 다른 계좌로 이체하는 계좌 이체 작업은 각 계좌의 잔고를 변경하는 두 개의 갱신 연산으로 구성되어있는 하나의 트랜잭션이다. 트랜잭션이 지녀야할 기본 속성 (ACID 성질) Atomicity (원자성) 어떤 오류가 발생했을 경우에는 미완료된 트랜잭션이 부분적인 영향까지 모두 되돌려야 한다. 즉 트랜잭션의 작업들이 모두 수행되거나 전혀 수행되지 않아야 한다. 일부만 수행된 상태가 되어서는 안됨 -> all or nothing 원자성을 보장하기 위한 아이디어는 데이터베이스 시스템이 트랜잭션이 갱신하는 데이터의 예전 값을 기록하는데 이 정보는 로그(log)라고 불리는 파일에 기록된다. Consistency ..

IntelliJ에서 JDBC 테스트하기

JDBC (Java Database Connectivity)의 정의 - 자바를 이용한 데이터베이스 접속과 SQL문장의 실행, 그리고 실행 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약- 자바 프로그램내에서 SQL문을 실행하기 위한 자바 API- SQL 과 프로그래밍 언어의 통합 접근 중 한 형태 JDBC를 이용한 데이터베이스 연결 방법 import java.sql.* -> 드라이버 로드 -> Connection객체 생성 -> Statement 객체를 생성 및 질의 수행 -> SQL문에 결과물이 있다면 ResultSet 객체 생성 -> 모든 객체 닫기 코드를 보면서 살펴보자. 인텔리제이를 실행시킨다. 이클립스에서 해도 상관없다. 자바 프로젝트를 하나 생성한다. 그리고 데이터베이스 드라이..

[오라클] DDL & DML

DDL 예제를 돌려보자. 기본 생성된 베이스테이블과 데이터는 http://pjh3749.tistory.com/156 여기서 sql파일을 받아서 developer에 때려넣자. create table history1 as select * from emp 데이터도 이렇게 똑같이 복사된다. 그렇다면 안의 데이터는 없이 그냥 테이블만 복사하려면 어떻게 해야할까? create table history2 as select * from emp where 1=0 이렇게 칼럼만 있고 데이터는 복사가 되지 않음을 알 수 있다. # 테이블 구조 살펴보기 desc history1 # 제약 조건 Constraint Database에 테이블 레벨에서 특정한 규칙을 설정해둠예상치 못한 데이터의 손실이나 일관성을 어기는 데이터의 추가..

[오라클] Grouping 과 Subquery

저번 시간에 Aggregation 을 했는데 이것은 집계함수라고도 하며 이 결과는 하나의 row만 남게 된다. 그러므로 Grouping을 해주어야 같이 쓸 수 있다. # Grouping 이렇게 deptno로 grouping을 해주면 AVG를 쓰는데 문제가 없다. SELECT job, avg(sal), max(sal), min(sal) FROM emp GROUP BY job 직업별 평균 월급과 최대월급 최소월급을 구하고 싶다. 저 뒤에 group by를 써주지 않는다면 이렇게 sql에러가 날 것이다. ORA-00937: 단일 그룹의 그룹 함수가 아닙니다 00937. 00000 - "not a single-group group function" select deptno, count(*) from emp gr..

반응형