본문 바로가기
728x90
반응형

Database12

[Procedure] 동시성 문제, GOTO를 활용한 PK에러 해결 안녕하세요! 동시성 문제를 저의 상황에 맞게 해결했던 경험을 공유하려고 합니다. 상황은 이렇습니다. 제가 운영 중이던 서비스는 시퀀스가 단순히 번호를 매기는 의미가 아닌 비즈니스적으로 의미 있는 번호로 사용되어야 했습니다. 그래서 프로세스 중간중간에 예외로 인해 시퀀스가 버려지는 일이 발생하지 않아야 했기 때문에 RDBMS의 시퀀스를 사용하지 않고, 직접 시퀀스 테이블을 만들어 시퀀스의 순서가 보장되도록 설계가 되었습니다. 하지만 이러한 설계에는 문제가 있었습니다. 발생한 에러를 보겠습니다. Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 무결성 제약 조건(CHOICODE.SEQ_PK).. 2023. 9. 6.
[H2] JPA User 엔티티, 테이블 drop 에러 상황 H2 DB를 사용하고 있고, Jpa를 이용해 User 엔티티를 만들어 애플리케이션을 실행했다. 에러가 발생했다. Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "drop table if exists [*]user"; expected "identifier"; SQL statement: 원인 나는 지금 H2 2.1.214 버전을 사용중인데 2.1.212 버전부터 user 키워드가 예약어로 지정되었기 때문이다. 해결 해결 방법은 3가지다. 1. @Table 사용하기 @Entity @Table(name = "users") public class User {...} 2. User 엔티티 이름 변경하기 @Ent.. 2023. 8. 20.
우왕좌왕 좌충우돌 Slow query 개선 경험기 안녕하세요. 우왕좌왕 좌충우돌 Slow query 개선 경험기를 공유해 보려고 합니다. 혹시 잘못된 내용이 있다면 알려주세요. 피드백은 언제나 환영입니다 :) 큰일이다 어느 날 정산 모듈에 사용자가 몰리면서 전체 시스템에 영향을 준 일이 발생했습니다. 문제의 쿼리는 정산 모듈에서 특정 기간, 특정 사용자의 누적 사용 금액을 조회하는 쿼리였습니다. 정산 시 매번 조회되는 쿼리였기에 개선이 필요한 상황이었습니다. 예제를 위해 Slow query를 필요한 부분만 추출해 보면 아래와 같습니다. SELECT SUM(B.AMOUNT) AS SUM_AMOUNT FROM TB_MST A , TB_DTL B WHERE A.ID = B.ID AND A.DATES BETWEEN '20230101' AND '20230831'.. 2023. 8. 18.
[DB지식] MyBatis 사용 시 <!CDATA[ ... ]]> 사용 이유? MyBatis 사용 시 쿼리문에 비교 연산자와 같이 부등호 처리가 필요할 때가 있다. 하지만 비교 연산자를 사용했을 경우 error를 발생시키는데 그 이유는 비교 연산자인지 괄호인지 구분하지 못하기 때문이다. SELECT * FORM EMPLOYEES WHERE SALARY > 100 위 예시처럼 비교 연산자를 사용했을 때 MyBatis는 괄호인지 비교 연산자인지 구분하지 못한다. 이런 경우에 CDATA를 사용하면 CDATA 안에 들어가는 문장을 문자열로 인식해 구분할 수 있도록 도와준다. 사용방법은 아래와 같다. 100 ]]> 2021. 11. 1.
[DB] 인덱스(Index) 사용 예시 (생성, 조회, 삭제, 리빌드) 들어가면서.. 인덱스를 사용하는 방법을 알아보려 한다. 예전에 실습용으로 잠깐 만들어 두었던 B 테이블을 가지고 간단한 예제를 진행해 보려고 한다. 인덱스(Index) 사용 예시 ① 인덱스 생성 --문법 CREATE INDEX [인덱스명] ON [테이블명](컬럼1, 컬럼2, 컬럼3.......) --예제 1) 기본 CREATE INDEX EX_INDEX ON B(B_NO, B_TITLE); --예제 2) 컬럼 값 중복 허용 x 인 인덱스 생성 CREATE[UNIQUE] INDEX EX_INDEX ON B(B_NO, B_TITLE); 위와 같이 쿼리문을 작성하면 INDEX를 생성할 수 있다. CREATE 뒤에 UNIQUE 키워드를 붙이면 컬럼 값에 중복 값을 허용하지 않는다는 뜻이다. ② 인덱스 조회 --.. 2021. 9. 17.
[DB] 데이터베이스(DB) 인덱스(Index) 란 무엇인가? 들어가면서.. DB를 사용하면서 데이터의 양(row)에 따라 실행 결과의 속도가 차이가 나는 것을 알고 있었다. 특히 데이터의 양이 증가할수록 실행 속도는 느려지고, JOIN이나 서브 쿼리 사용 시 곱 연산이 일어나 데이터 양이 증가하기 때문에 WHERE 조건에서 필요한 데이터만 추출 후 사용하는 것이 좋다고 알고 있었는데, 보다 쿼리의 성능을 높이는 데 중요한 것은 인덱스를 적재적소로 활용하는 것이었다. 그렇다면 인덱스의 개념과 구조, 그리고 왜 사용하는지?, 사용했을 때 장점과 단점들에 대해 공부해보도록 하자. 인덱스(Index)란? 인덱스는 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조라고 한다. 특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간.. 2021. 9. 13.
[Oracle] OT 문제 만들기 스터디 5주차 문제1. (인복) 분기별로 가장 빠르게 입사한 사람들중에서 입사한 월이 해당 분기의 첫 번째 달인 사람들의 직업을 구하여 아래와 같이 출력하시오 출력필드: 회원 번호, 풀네임, 직업, 입사 날짜 SELECT A.EMPLOYEE_ID, FULL_NAME, A.JOB_TITLE, A.HIRE_DATE FROM (SELECT EMPLOYEE_ID, (FIRST_NAME || ' ' || LAST_NAME) AS FULL_NAME, JOB_TITLE, TO_CHAR(HIRE_DATE, 'Q'), HIRE_DATE, RANK() OVER(PARTITION BY TO_CHAR(HIRE_DATE, 'Q') ORDER BY TRUNC(HIRE_DATE, 'DD') ASC) AS RNK FROM EMPLOYEES) A .. 2021. 9. 13.
[Oracle] OT 문제 만들기 스터디 4주차 문제1.(도헌) 제품 원가 순위중 금액이 높은 2위와 10위의 차를 구하고(소수 1째자리 반올림), 차이보다 낮은 판매원가 금액은 2.7배 증가, 높으면 0.5배감소 시키고, 변경된 판매원가의 2위의 주문수량과 변경된 판매원가와 기존 판매원가의 차를 구하고, 제품회사명을 출력하시오. 출력필드 : 제품번호, 제품회사명, 카테고리명, 주문수량, 판매가, 변경된판매원가, 차이 SELECT A.PRODUCT_ID, SUBSTR(A.PRODUCT_NAME, 1, 5) AS COMPANY_NAME, PC.CATEGORY_NAME, OI.QUANTITY, A.LIST_PRICE, A.F_PRICE, (A.F_PRICE - A.LIST_PRICE) AS CHA FROM (SELECT P.PRODUCT_ID, P.PRO.. 2021. 9. 6.
[Oracle] OT 문제 만들기 스터디 3주차 문제1. (재현) 창고(WAREHOUSE_NAME) 이름이 7글자을 넘고 보유중인 총수량이 1등인 창고를 아래 정답과 똑같이 출력하시오(WHERE은 1번만 사용가능합니다) SELECT (LOWER(SUBSTR(A.WAREHOUSE_NAME, 1, 3)) || SUBSTR(A.WAREHOUSE_NAME, 5)) AS NAME, A.SUM AS QSUM FROM (SELECT W.WAREHOUSE_NAME, SUM(I.QUANTITY) AS SUM, RANK() OVER(ORDER BY SUM(I.QUANTITY) DESC) AS RNK FROM WAREHOUSES W INNER JOIN INVENTORIES I ON W.WAREHOUSE_ID = I.WAREHOUSE_ID GROUP BY W.WAREHOU.. 2021. 9. 6.
[Oracle] OT 문제 만들기 스터디 2주차 문제1. (도헌) 주문 상태가 Pending이고, 주소에 1과 S가 들어가는 고객중 주문날짜가 가장 오래된 고객을 찾고, 그 고객의 풀네임의 길이와, 전체 고객중 풀네임의 길이가 일치하고, 주문이 완료된 고객의 주문번호와 고객의 이름, 폰번호, 주문상태, 주문날짜를 출력하시오. 추가로, 주문날짜가 오래된 순서로 정렬하시오. SELECT B.ORDER_ID, B.FIRST_NAME, B.PHONE, B.STATUS, B.ORDER_DATE FROM (SELECT LENGTH (A.F_NAME) AS LEN FROM (SELECT O.ORDER_ID, O.CUSTOMER_ID, (CO.FIRST_NAME || CO.LAST_NAME) AS F_NAME, O.ORDER_DATE, RANK() OVER(ORDE.. 2021. 8. 27.
728x90
반응형