본문 바로가기
반응형

컴퓨터공학 기초/데이터베이스9

[MongoDB] group 쿼리를 사용하여 Array<Object> 데이터 그룹화하기 MongoDB 를 사용하다보면 Array 형식인 데이터를 그룹화 해야할때가 있습니다. 예를들어 아래와 같은 데이터가 있고 user 의 type 별 평균값을 알고싶다고 가정해봅시다. { "id" : 1, "userId" : 1, "items" : [ {"type" : 1, "value" : 1}, {"type" : 2, "value" : 2}, ] }, { "id" : 2, "userId" : 1, "items" : [ {"type" : 1, "value" : 3}, {"type" : 2, "value" : 4}, ] } 눈으로 보면 굉장히 쉬워보입니다. userId 로 group 한 후 타입별로 평균값을 내기만하면됩니다. 이 쉬워보이는 작업을 필자는 오랜시간 삽질한후에 결과를 낼 수 있었습니다. 혹시나 .. 2022. 7. 3.
[MongoDB] Index 를 이용하여 Sort 하기 Mongo 에서는 인덱스에 정렬필드가 포함되어 있다면 인덱스를 사용하여 정렬을 할 수 있다. 인덱스에 포함되지 않은경우 blocking sort 를 사용한다. blocking sort는 collection 또는 database 에서 concurrent 작업을 차단하지 않는다. 공식문서에 따르면 index 를 이용한 정렬이 blocking sort 보다 성능이 좋다. 정렬은 역방향, 정방향 둘 다 지원한다. 예를 들어보자 아래와 같은 인덱스를 생성 했을 때 db.records.createIndex( { a: 1 } ) 두 쿼리 모두 위의 인덱스를 사용한다. db.records.find().sort( { a: 1 } ) db.records.find().sort( { a: -1 } ) 하지만 Multiple .. 2021. 7. 16.
[PostgreSQL] postgresql replication slot does not exist backup을 통해 받으면 안생길 수 있다. 다시 생성해주면 정상적으로 replication 이 된다. 2021. 3. 15.
[데이터베이스] 데이터 저장구조 데이터베이스 저장구조 데이터를 저장하려면 테이블 스페이스를 생성해야한다. 테이블 스페이스를 생성했으면 세그먼트를 생성한다. 그림과 같이 테이블 스페이스에는 여러개의 세그먼트가 존재하고 세그먼트 안에 여러개의 익스텐트로 구성된다. 파티션 구조가 아니라면 테이블, 인덱스가 각각 하나의 세그먼트가 된다. 파티션 구조라면 각 파티션이 하나의 세그먼트가 된다. 데이터를 입력하다가 공간이 부족해지면 테이블스페이스로부터 익스텐트를 추가로 할당받는다. 익스텐트 단위로 공간을 확장하지만, 실제로 저장하는 공간은 데이터 블록이다. 한 블록은 하나의 테이블이 독점한다 = 한 블록에 저장된 레코드는 모두 같은 테이블 레코드이다. 한 익스텐트도 하나의 테이블이 독점한다. = 한 익스텐트에 담긴 블록은 모두 같은 테이블 블록이다.. 2020. 5. 3.
[데이터베이스] 소프트 파싱과 하드 파싱 SQL 파싱, 최적화, 로우소스 생성 과정을 거쳐 생성된 것을 내부 프로시저라고 한다. 내부 프로시저를 반복, 재사용할 수 있도록 캐싱해두는 메모리 공간을 라이브러리 캐시라고 한다. 라이브러리 캐시는 SGA (System Global Area)의 구성요소이다. SGA는 서버프로세스와 백그라운드 프로세스가 공통으로 액세스 하는 데이터와 제어구조를 캐싱하는 메모리 공간이다. 사용자가 SQL문을 전달하면 SQL을 파싱한 후 라이브러리 캐시에 존재하는지부터 탐색한다. 이때 라이브러리 캐시에 존재해서 바로 실행 하는것을 소프트 파싱 존재하지 않아서 최적화 및 로우소스 생성단계까지 거치는것을 하드 파싱이라고 한다. ※ 라이브러리 캐시 존재이유 매번 하드파싱을 하려면 비용이 어마어마하다. 그렇기때문에 효율적으로 이용.. 2020. 4. 26.
[데이터베이스] SQL 최적화과정 DBMS는 SQL을 실행하기전에 아래와 같은과정을 거쳐 최적화를 진행한다. 1. SQL파싱 실행할 SQL을 전달받으면 SQL파서가 파싱진행 파싱트리 생성 Syntax체크 : 문법적오류가 없는지 체크 semantic 체크 : 의미상 오류가 없는지 체크 2. SQL최적화 옵티마이저가 실행한다. 미리 수집한 시스템 및 오브젝트 통계정보를 바탕으로 다양한 실행경로를 생성해서 비교 한 후 가장 효율적인 하나를 선택 3. 로우소스 생성 ※ SQL 옵티마이저란? 사용자가 원하는 작업을 가장 효율적으로 수행할 수 있는 최적의 데이터액세스 경로를 선택해주는 DBMS의 핵심엔진 ※ 옵티마이저 Hint 옵티마이저가 항상 최선의 선택을 하는것은 아니다. DB에 Insert, delete등 연산이 일어날 경우 인덱스를 이상하게.. 2020. 4. 26.
[데이터베이스] org.postgresql.util.PSQLException:CODE[0]STATE[22001]ERROR: value too long for type character varying(1) org.postgresql.util.PSQLException:CODE[0]STATE[22001]ERROR: value too long for type character varying(1) 데이터의 길이가 데이터타입의 길이보다 짧아서 생기는오류 2020. 4. 16.
[데이터베이스] 테이블설계 및 컬럼추가시 주의사항 테이블을 설계할 때 어떠한 데이터가 들어가는지 중요하다. 여기까지만 봤을때는 뭐야? 당연한소리 아니야? 라고 생각할 수 있다. 테이블에 들어가는 데이터가 다른 테이블과 연관이 어떻게 되어있는지, 연관된 테이블의 데이터수는 얼마나 되는지도 매우 중요하다. 큰 서비스일수록 한 테이블의 row수는 어마어마하다. 이런것들을 생각하지않고 A.id 랑 B.a_id랑 연관성있네? 하고 fk를 설정하는 순간 지옥이 시작될 수 있다. 또한 추후 서비스의 방향과 고객의 요청을 예상 해야된다. 대다수의 고객들은 A기능 개발 해주세요!! 하고 요청해서 A기능을 개발해주면 A에 B도 추가시켜 주세요. 라고 한다. 고객들의 입장에서는 편리하고자 사용하기 때문에 당연한 것이다. 그렇기때문에 테이블설계 또는 컬럼추가에 신중 해야한다.. 2020. 4. 8.
[데이터베이스] 트랜잭션이란 ? 트랜잭션이란 ? query를 수행할때 중간에 오류가 발생하면 Rollback을 통하여 처음부터 다시 수행하고 오류없이 실행을 마치면 commit을 하는 작업단위 사용이유 여러 클라이언트가 동시에 액세스할때 발생할 수 있는 데이터 부정합을 방지하기 위해 사용 한번에 하나의 트랜잭션만 허용하면 부정합은 발생하지 않지만 효율성이 떨어진다. 특성 ACID Atomicity (원자성) 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는것을 보장 Consistency (일관성) 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지해야한다. Isolation (격리성) 트랜잭션 수행시 다른 트랜잭션이 끼어들어서는 안된다. (트랜잭션끼리 간섭이 있어서는 안된다.) Durability (지속성) commit이 되면 .. 2020. 2. 29.