GeoJSON Object 몽고DB에서 GeoJSON Objects는 지리적 위치 정보를 나타내는 JSON 형식의 데이터입니다. GeoJSON은 다양한 지리 정보 데이터 유형을 포함하는 오픈 소스 데이터 형식으로, 지리적 위치 정보를 다루는 많은 애플리케이션에서 사용됩니다. 몽고DB는 GeoJSON Objects를 지원하며, GeoJSON 형식의 데이터를 저장하고 쿼리하기 위한 강력한 기능을 제공합니다. 모든 GeoJSON 객체는 몽고DB의 지리 공간 인덱스(Spatial Index)를 사용하여 쿼리할 수 있습니다. type 필드 : GeoJSON Object 타입 "Point", "LineString", "Polygon", "MultiPoint", "MultiLineString", "MultiPolyg..
5.2 explain 출력 쿼리에 대한 많은 정보를 제공, 느린 쿼리를 위한 중요한 진단 도구 어떤 인덱스가 어떻게 사용되는지 알 수 있음 쿼리 마지막에 explain 호출 추가 쿼리가 "COLLSCAN"을 사용하면 인덱스를 사용하지 않음 "needYields" : 쓰기 요청을 처리하도록 쿼리가 양보(일시정지)한 횟수 대기 중인 쓰기가 있다면 쿼리는 일시적으로 락을 해제하고 쓰기 처리 "indexBounds" : 인덱스가 어떻게 사용됐는지 설명하며 탐색한 인덱스의 범위를 제공 {"username": 1, "age":1}, {"age":1, "username":1} 인덱스 존재 시 쿼리마다 사용 인덱스 상이 > db.users.find({"age":{>:10}, "username":"user2134"}..
5.1 인덱싱 소개 인덱스를 사용하지 않는 쿼리를 컬렉션 스캔이라 함 explain 커서 메서드는 CRUD 작업의 실행 정보 제공 executionStats 모드는 인덱스를 이용한 쿼리의 효과를 이해하는 데 도움 totalDocsExamined : 쿼리를 실행하면서 살펴본 도큐먼트 개수 totalKeysExamined : 결과 셋을 생성하기 위해 인덱스 내에서 몇 개의 키를 통과했는지 nReturned : 반환받은 결과의 개수 쿼리 패턴 : 애플리케이션이 데이터베이스에 요구하는 다양한 유형의 질문 > db.users.find({"username" : "user101"}).explain("executionStats") { "queryPlanner" : { ... }, "executionStats" : { ..
4.1 find 첫 매개변수에 가져올 도큐먼트를 결정 쿼리 도큐먼트에 키/값 쌍을 추가해 검색을 제한 여러 개의 키/값 쌍은 '조건1 AND 조건2 AND...' > db.c.find()//빈 쿼리 도큐먼트는 컬렉션 전체 조회 > db.c.find({})//동일 > db.users.find({"username" : "joe"})//문자열형이 일치하는 도큐먼트 조회 > db.users.find({"username" : "joe", "age" : 27}) 4.1.1 반환받을 키 지정 두 번째 매개변수에 반환받을 키를 지정 네트워상의 데이터 전송량과 클라이언트 측에서 디코딩하는 데 시간, 메모리 절약 "_id" 키는 지정하지 않아도 항상 반환, 제외도 가능 > db.users.find({}, {"usernam..
3.1 도큐먼트 삽입 insertOne 메서드 사용 > db.movies.insertOne({"title" : "StarWars"}) 3.1.1 insertMany 각 도큐먼트에 대해 데이터베이스로 왕복하지 않고 bulk insert 처리 단일 컬렉션에 삽입할 때 유용 48mbyte 크기씩 분할 삽입 두번째 매개변수로 옵션 도큐먼트 지정 "ordered" : true (default) 정렬된 삽입, 오류발생하면 이후 삽입 X "ordered" : false 정렬되지 않은 삽입, 오류발생 관계없이 모두 삽입 시도 3.1.2 삽입 유효성 검사 "_id" 필드가 없으면 새로 추가 모든 도큐먼트는 16mbyte 크기 제한 3.1.3 삽입 insertOne, insertMany 3.2 도큐먼트 삭제 deleteO..
1.1 손쉬운 사용 도큐먼트 지향 데이터베이스 키와 값을 미리 정의하지 않고 고정된 스키마가 없음 1.2 확장 가능한 설계 분산 확장을 염두하여 설계 데이터를 여러 서버에 쉽게 분산 1.3 다양한 기능 인덱싱 집계 특수한 컬렉션 유형 파일 스토리지 1.4 고성능 동시성과 처리량을 극대화하기 위해 WiredTiger Storage engine에 기회적 락(Opportunistic Locking)을 사용 캐시처럼 제한된 용량의 램으로 쿼리에 알맞은 인덱스를 자동 선택 1.5 몽고DB 철학 확장성이 높으며 유연하고 빠른, 완전한 기능을 갖춘 데이터 스토리지를 만드는 일
비관적 락 (Pessimistic Lock) 동시성 제어 동시성 문제가 있을 것이라 예상하고 Lock을 걸고 처리 하나의 트랜잭션이 자원에 Lock을 걸면 다른 트랜잭션은 기다림 다른 트랜잭션이 계속 기다리게 되어 성능 저하 NO WAIT, WAIT 옵션을 사용하여 대기 시간을 제어해서 해결 Exception을 발생 시켜 예외처리 가능, 트랜잭션 종료 처리로 동시성 증가 충돌이 자주 발생하는 환경에 대해서는 롤백의 횟수를 줄일 수 있으므로 성능에서 유리 잠시 대기가 있지만 재시도 로직 없이 한번에 처리가 가능 SELECT ... FOR UPDATE WAIT 10; UPDATE ... 낙관적 락 (Optimistic Lock) 동시성 제어 동시성 문제가 없을 것이라고 예상하고 후처리 데이터를 읽을 때는 L..
동시성 제어를 위해 특정 Row에 Lock을 거는 Row-Level Exclusive Lock (X Lock) 특정 Row를 변경하기 전 해당 Row를 SELECT 했을 때 다른 Transaction 에서 변경 가능한 동시성 (Phantom Reads) 해결을 위해 사용 UPDATE, DELETE 구문처럼 SELECT ~ FOR UPDATE 실행 시 COMMIT/ROLLBACK 전까지 다른 Transaction 에서 SELECT 불가 Table Lock 이 아니기 때문에 SELECT COUNT(*) FROM TABLE 같은 구문에 사용 불가 SELECT COUNT FROM TABLE WHERE ID = #{ID} FOR UPDATE; -- Lock 이 풀릴 때까지 무한정 대기 FOR UPDATE NOWA..
What? ORA-01401 : 열에 입력한 값이 너무 큽니다. INSERT 나 UPDATE 쿼리문에서 발생할 에러가 SELECT 문에서 발생. Why? 서브쿼리문에서 데이터를 가공하는 부분에 LISTAGG 함수를 사용. LISTAGG 함수는 컬럼타입이 NVARCHAR2 이면 한글이 깨질 수 있는데 VARCHAR 로 캐스팅해서 사용. 컬럼 캐스팅할 때 사이즈가 컬럼 사이즈보다 작으면 ORA-01401 발생! SELECT LISTAGG(CAST(tab.col AS VARCHAR(100)), ',') FROM TABLE tabL GROUP BY some_column