RDBMS
인덱스 관련 총정리
인덱스 관련 총정리
2023.08.15인덱스 관련 이론 6장. 물리적 데이터베이스 설계 : 인덱스 관련 https://dataonair.or.kr/인덱스 기본 원리 https://d2.naver.com/helloworld/1155 https://docs.oracle.com/cd/E11882_01/server.112/e40540/indexiot.htm#CNCPT721 커버링 인덱스 적용하기 https://jojoldu.tistory.com/476 https://docs.oracle.com/javadb/10.8.3.0/tuning/ctunoptimz30768.html 커버링 인덱스는 SELECT의 모든 컬럼이 인덱스에 들어있어야 적용된다. 허나 그렇지 않다고 하더라도, Data Filter 보다 Key Filter를 적용하는게 성능에 큰 도움이..
인덱스 힌트 관련 - 쿼리 플랜 결과는 무시하고 꼭 써줘야 한다.
인덱스 힌트 관련 - 쿼리 플랜 결과는 무시하고 꼭 써줘야 한다.
2023.04.25이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
처리대상 flag, 일배치, 재처리 관련 설계
처리대상 flag, 일배치, 재처리 관련 설계
2023.04.01상황 1. 거래원장_테이블 ------> 일배치_테이블 // 하루에 한번 [어제 있었던 거래+재처리 필요 거래]들을 대상으로 일배치를 돌린다. '재처리 필요 거래'를 처리하는 관점에서 크게 2가지 방법이 있다. A. 거래원장_테이블에 update해서 처리 대상임을 표시하여 일배치에 포함시키는 방법 B. 일배치_테이블에 미리 적재하는 방법 A. 거래원장_테이블에 update해서 처리 대상임을 표시하는 방법 어제 있었던 거래 -> 생성하면서 처리 대상으로 표시 재처리 필요 거래 -> 재처리 필요해진 순간 처리 대상으로 표시하는 방법. 처리 대상 표시 방법은 [처리대상 flag를 두거나, 처리상태 code를 두거나, 처리일자 date]를 두는 방법으로 나뉜다. A-1. 처리대상 flag를 두는 방법, 처리상태..
MERGE INTO(UPSERT) 에서도 PK violation이 발생할 수 있다.
MERGE INTO(UPSERT) 에서도 PK violation이 발생할 수 있다.
2022.02.10상황 요구사항 1) tbl에 없는 경우 INSERT. 있다면 에러 없이 스킵 처리 요구사항 2) 동시에 여러 스레드에서 쿼리 실행해야 함 ```sql MERGE INTO tbl USING dual ON (pk1 = '1') WHEN NOT MATCHED THEN INSERT (pk1) VALUES ('1') ``` ``` ; SQL []; ORA-00001: 무결성 제약 조건(TBL.IPK_PK1)에 위배됩니다 ; nested exception is java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 무결성 제약 조건(TBL.IPK_PK1)에 위배됩니다 ``` tbl에 없는 경우 INSERT임에도, PK violation이 발생했음. (만약 co..
docker 안의 DB를 사용할 때 timezone 문제
docker 안의 DB를 사용할 때 timezone 문제
2021.05.19Oracle로 설명했지만 대부분의 DB in docker image에서 통하는 내용이다. 문제 상황 Oracle docker image를 사용해서 DB 올리고 작업하고 있는데, insert된 row들 날짜 필드 시간이 안맞는다. (UTC -> Asia/Seoul)로 timezone 설정이 필요한 상황이다. ```sql SELECT SYSDATE, CURRENT_DATE, DBTIMEZONE, SESSIONTIMEZONE FROM DUAL; -- 현재 시각은 한국 기준 05-19 00:38:51 +-------------------+--------------------------+----------+---------------+ |SYSDATE |CURRENT_DATE |DBTIMEZONE|SESSIONT..
[Oracle] Pagination
[Oracle] Pagination
2021.05.17Pagination https://en.wikipedia.org/wiki/Select_(SQL)#Result_limits Offset 기반 rownum ROW_NUMBER() Cursor 기반 Cursor-based pagination을 Seek method라고도 부르고 No offset이라고도 부른다. 12c 버전 이후라면? : Row Limiting Clause https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1 myjamong.tistory.com/170 12c 이전에는? https://stackoverflow.com/questions/241622/paging-with-oracle https://blogs...
Flyway
Flyway
2021.05.13flyway는 DB에 schema_version 테이블을 유지하면서, DB 상태를 버전으로 관리할 수 있게끔 도와준다. (나중에 DB를 실행해도 버전에 맞게 데이터를 밀어넣어준다.) DB에 데이터가 존재하는 상태에서 flyway를 적용할 때 발생하는 문제 ``` Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema "SYSTEM" without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table. ``` DB가 비어있지 않아(상태를 가지고 있어) flyway를 적용할 수 없다는 것. flyway를 사용하려면 ..
[Oracle] longest match
[Oracle] longest match
2021.02.16https://dba.stackexchange.com/questions/42997/longest-prefix-search-in-oracle https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:4246230700346756268 일단... 쿼리 하나로 해결하자면 이렇게도 가능은 한데, 성능 관점에서는? ```sql SELECT MIN(t.BIN_NO) KEEP (DENSE_RANK FIRST ORDER BY LENGTH(t.BIN_NO) DESC) FROM CARD_BIN t WHERE '654103' LIKE t.BIN_NO || '%'; ``` DBA 문의 결과... 다음과 같이 인덱스 걸고 ```sql create index CARD..
PostgreSQL 설치
PostgreSQL 설치
2020.12.04설치 ```bash sudo yum update -y yum list | grep postgre sudo yum install -y postgresql postgresql-server cat /etc/passwd -- postgres 계정 있는지 확인 ``` init ```bash sudo find / -name initdb 2>/dev/null sudo su - postgres initdb --encoding='utf8' sudo systemctl start postgresql sudo systemctl enable postgresql -- systemd가 알아서 실행 ``` 접근 ```bash sudo su - postgres psql -- postgres 계정으로 postgres DB에 로그인 됨...
DB 이중화 / 클러스터링
DB 이중화 / 클러스터링
2020.09.23DB 클러스터링 DB 장애 시 가용성을 유지하기 위한 클러스터링 방안 Oracle 기준이긴 하지만, 다른 DB에서도 비슷한 옵션이 있는 경우 있음. HA ( High Availability ) 같은 장비를 Active 1대 , Standby 1대로 구성해서 Active에 문제 생기면 Standby로 서비스 하는 방식. Active, Standby 각자가 별도 storage를 가지고 있음. => Active와 Standby의 데이터 동기화 문제 및 성능 저하 => Active 가 죽고 Standby로 전환되기 전 그 사이에 발생하는 트랜잭션은 유실됨 - 데이터 불일치. 정합성 bad *** 오라클에서는 데이터 가드 라는 이름으로 제공하고 있다. *** 위와 같은 문제점 때문에 OPS 방식이 8i 버전까지 ..
일단 다 가져와서 앱에서 필터링? vs 쿼리 WHERE에서 필터링?
일단 다 가져와서 앱에서 필터링? vs 쿼리 WHERE에서 필터링?
2019.11.28findAll로 다 가져와서 앱에서 필터링? 아니면 쿼리 WHERE절에서 필터링? 어디서 관리하는게 더 나은가? PagingItemReader 같이 offset 기반으로 분할해서 읽어오는 경우, 일단 다 가져와서 앱에서 필터링하게 되면 update로 인한 offset이 틀어짐이 발생 할 수 있다. 전제 작업 A1 read 대상 항목 : complete=n & type=A 작업 B1 read 대상 항목 : complete=n & type=B 작업 A1, B1에서는 read 대상 항목을 임시 테이블에 적재 작업 A2, B2에서는 임시 테이블에서 대상 가져와 complete=y로 update 작업 {}1, {}2는 다른 Step으로 되어 있음. (Chunk 단위 처리 아님) 같은 Step으로 구성하고 read..
[DB] 분산 DB, 파티셔닝 (partitioning ), 샤딩 (sharding)
[DB] 분산 DB, 파티셔닝 (partitioning ), 샤딩 (sharding)
2019.08.25파티셔닝(단편화) 란? 저장해야 하는 정보가 많은 대규모 시스템의 경우 하나의 DB에 모든 정보를 저장해서는 제대로 된 응답성을 기대할 수 없다. read가 많이 발생하든, write가 많이 발생하든 DB 저장하는 정보가 많을 수록 스캔 속도도 느려지고, 요청이 많은 경우 큐에 작업이 쌓이면서 응답도 느려진다. 그래서 DB를 여러대 운용해서 응답을 좀 분산해보자, 라는 생각을 하게 되는데, 가장 쉽게 생각해 볼만한건 Master DB의 데이터를 복제한 Slave DB를 두고, read를 분산하는 것이다. 스캔 속도는 그대로겠지만 요청을 분산할 수 있다. 그러나 이 방법은 write는 분산되지 않는다. Master에 write가 발생하면 이를 Slave에 복제 해줘야 하므로, 복제하면서 같은 내용의 wri..