SQL을 실행할 때, 어떤 테이블을 먼저 읽고(드라이빙 테이블, Driving Table), 어떤 테이블을 나중에 조회(드라이븐 테이블, Driven Table)할지에 따라 실행 속도가 달라집니다.특히 Nested Loop Join에서는 조인 순서가 직접적인 성능에 큰 영향을 줍니다. 옵티마이저는 기본적으로 조인 순서를 자동으로 결정합니다.단, SQL 문에 힌트가 없을 경우입니다. 힌트나 통계 정보가 있다면 그것을 기반으로 옵티마이저가 판단을 조정할 수 있습니다. 조인 순서가 중요한 이유 드라이빙 테이블(Driving Table)의 선택이 실행 속도를 좌우함드라이빙 테이블의 크기가 작을수록 성능이 좋아짐.작은 테이블을 먼저 읽고, 그 결과를 기반으로 큰 테이블을 조회하면 Index Lookup을 최소화할..
INNER JOIN SELECT A.*FROM TableA AINNER JOIN TableB B ON A.id = B.id; INNER JOIN은 두 테이블을 결합한 후, 조인 조건에 맞는 레코드만 반환합니다.조인 시 TableB의 중복된 id가 있으면 TableA의 해당 레코드가 여러 번 중복 반환될 수 있습니다.실행 계획에서 JOIN 연산이 수행되며, 인덱스가 적절히 설정되지 않으면 성능 저하 가능성이 있습니다.EXISTSSELECT A.*FROM TableA AWHERE EXISTS (SELECT 1 FROM TableB B WHERE A.id = B.id); EXISTS는 TableB에서 A.id = B.id 조건을 만족하는 레코드가 존재하는지만 체크합니다.서브쿼리에서 SELECT 1을 사용하여..
Oracle에서 SQL 조인이 실행될 때, 논리적 조인(Logical Join)(예: INNER JOIN, LEFT JOIN)은 물리적 조인(Physical Join) 방식으로 변환되어 실행물리적 조인은 데이터를 실제로 처리하는 방법이며, Oracle의 옵티마이저가 가장 효율적인 방식을 자동으로 선택1. Nested Loop Join (중첩 루프 조인)🔹 기본 개념:외부 테이블의 각 행을 내부 테이블과 비교하여 일치하는 행을 찾는 방식작은 데이터셋이나 내부 테이블에 인덱스가 있는 경우 효율적일반적으로 인덱스가 존재하는 경우 자동 선택됨🔹 동작 방식:외부 테이블의 첫 번째 행을 가져옴내부 테이블에서 조인 조건을 만족하는 행을 찾음 (Index Lookup 가능)반복하여 모든 행을 처리SELECT /*+..
MySQL 8.0 이상에서만 사용 가능배열 내 모든 객체를 검사 가능{ "list": [ { "couponInfo": { "couponNo": "12345" } }, { "couponInfo": { "couponNo": "" } } ]}SELECT t.*FROM your_table yt,JSON_TABLE( yt.your_column, '$.list[*]' COLUMNS ( couponNo VARCHAR(255) PATH '$.couponInfo.couponNo' )) AS tWHERE JSON_VALID(yt.your_column) -- 유효한 JSON 데이터만 처리 AND t.coup..
언제 샤딩해야 하나 사용 가능한 메모리를 늘릴 때 사용 가능한 디스크 공간을 늘릴 때 서버의 부하를 줄일 때 한 개의 mongod가 다룰 수 있는 처리량보다 더 많이 데이터를 읽거나 쓸 때 서버 시작 구성 서버는 클러스터 구성을 저장하는 일반 mongod 서버 클러스터 구성은 샤드를 호스팅하는 복제 셋, 샤딩된 컬렉션, 각 청크가 위치한 샤드 등을 포함 구성 서버 구성 서버는 어떤 서버가 무슨 데이터를 갖고 있는지에 대한 모든 메타 데이터를 보유 mongos가 구성 서버로부터 구성을 가져오므로, 구성서버는 mongos 프로세스 앞서 시작해야함 3개의 개별 시스템에서 구성 서버 시작 --configsvr 옵션은 mongod를 구성 서버로 사용하겠다는 뜻 config 와 admin 이외의 데이터베이스에 데이..
MySQL에서 JSON 데이터에서 값을 추출하려면 JSON_EXTRACT() 함수를 사용 JSON_EXTRACT(json_column, path) json_column: JSON 데이터가 저장된 컬럼 path: 추출하려는 값의 경로 SELECT JSON_EXTRACT(json_column, '$.name') AS extracted_name FROM your_table; MySQL에서는 JSON 형식의 데이터를 VARCHAR 타입의 컬럼에 저장할 수 있습니다. JSON 데이터를 VARCHAR 컬럼에 저장하면 JSON 문자열이 그대로 저장되며, JSON 함수 및 연산을 사용하여 JSON 데이터를 다룰 수 있습니다. 주의할 점은 JSON 데이터의 크기가 VARCHAR의 최대 크기를 초과하지 않도록 해야 합니다..
샤딩 여러 장비에 걸쳐 데이터를 분할하는 과정 파티셔닝이라는 용어로도 불림 하드웨어 및 비용 제약을 해결하거나 애플리케이션에 나은 성능을 제공하기 위해 데이터셋을 분할하는데 사용 더 자주 사용되는 데이터를 성능이 더 좋은 하드웨어에 배치 지역에 따라 데이터셋을 분할해 주로 접근하는 애플리케이션 서버와 가까운 컬렉션에서 서브셋 조회 수동 샤딩을 사용하면 애플리케이션이 다른 DB 서버와 연결을 유지, 각 서버는 완전히 독립적 몽고는 애플리케이션에서 구조를 추상화하고 시스템 관리를 간단하게 하는 자동 샤딩을 지원 클러스터 구성 요소 몽고는 샤딩을 통해 많은 장비의 클러스터를 생성하고, 각 샤드에 데이터 서브셋을 넣음으로써 컬렉션을 쪼갬 애플리케이션이 독립 실행형 서버나 복제 셋의 리소스 한계에 구애되지 않음 ..
13.1 독립 실행형 모드에서 멤버 시작 유지 보수 작업은 (쓰기와 관련) 세컨더리에서 수행 불가 애플리케이션 성능에 영향을 미치기 때문에 프라이머리에서 수행하면 안됨 복제 셋의 멤버가 아닌 독립 실행형 서버로 재시작해야함 이 서버에서 유지 보수를 수행하려면 replSet 옵션 없이 서버를 재시작 다른 서버에서 통신하지 않도록 다른 포트로 수신 서버의 데이터를 어떤 방식으로든 조작하기 위해 dppath는 그대로 유지 > db.serverCmdLineOpts() { "argv" : [ "mongod", "-f", "/var/lib/mongod.conf" ], "parsed" : { "replSet": "mySet", "port": "27017", "dbpath": "/var/lib/db" }, "ok" :..
12.1 클라이언트 - 복제 셋 연결 동작 복제 셋이면 기본적으로 드라이버는 프라이머리에 연결되고 모든 트래픽을 프라이머리에 라우팅 애플리케이션은 복제 셋이 백그라운드에서 대기 상태를 유지하는 동안 독립 실행형 서버와 통신하듯이 읽기와 쓰기 수행 복제 셋의 목적은 네트워크 파티션이나 서버가 다운될 때도 데이터의 가용성을 높이는 것 이용 가능한 프라이머리가 없으면 드라이버는 읽기/쓰기를 처리하지 않는다 문제가 발생했을 때 올바른 전략은 최대 한 번만 재시도하는 방법 연산이 멱등이라면 네트워크 오류를 한번 재시도하면 여러 유형의 오류를 모두 올바르게 처리할 수 있다 모든 몽고DB 드라이버는 재시도 가능한 쓰기 옵션을 지원 명령 오류는 클라이언트 측 처리를 위해 어플리케이션에 반환 네트워크 오류는 프라이머리 ..
11.1 동기화 프라이머리가 수행한 쓰기를 모두 포함하는 로그 oplog를 보관함으로써 복제를 수행 oplog는 프라이머리의 로컬 데이터베이스에 있는 제한 컬렉션 세컨더리는 이 컬렉션에 복제를 위한 연산을 쿼리 각 세컨더리는 프라이머리로부터 복제한 작업을 각각 기록하는 oplog를 보관 oplog는 다른 멤버에 대한 동기화 소스로 사용되도록 한다 세컨더리가 다운되면 재시작할 때 oplog에 있는 마지막 연산과 동기화 oplog는 크기가 고정되어 있으므로 담을 수 있는 연산의 수가 정해져 있다 일반적으로 oplog는 기본 크기면 충분 11.1.1 초기 동기화 초기 동기화를 수행해 복제 셋의 한 멤버에서 다른 멤버로 모든 데이터를 복사 모든 데이터를 대상 멤버에 있는 자체 컬렉션 복사본에 삽입 대상 멤버의 ..