sql 공부 모음

강찬우·2024년 6월 19일

sql

목록 보기
2/3

카테시안 조인(Cartesian Join)

데이터베이스에서 조인은 두 개 이상의 테이블을 결합하여 하나의 결과 집합을 만드는 중요한 작업이다. 여러 가지 조인 유형 중에서 "카테시안 조인(Cartesian Join)"은 가장 기본적이지만 가장 비효율적인 조인 방식으로 알려져 있다. 이번 포스트에서는 카테시안 조인이 무엇인지, 그리고 실제로 어떻게 동작하는지 알아보겠다.

카테시안 조인이란?

카테시안 조인은 두 테이블 간에 조인 조건을 지정하지 않고, 모든 가능한 행의 조합을 반환하는 조인 방식이다. 수학에서 데카르트 곱(Cartesian Product) 개념을 차용하여, 두 테이블의 모든 행이 서로 조합되는 방식으로 작동한다.

예시

예를 들어, 두 개의 테이블 A와 B가 있다고 가정해보자.

테이블 A:

A_idA_value
1A1
2A2

테이블 B:

B_idB_value
10B1
20B2

카테시안 조인을 수행하면 다음과 같은 결과가 나온다.

결과:

A_idA_valueB_idB_value
1A110B1
1A120B2
2A210B1
2A220B2

보시다시피, 테이블 A의 각 행이 테이블 B의 모든 행과 조합되어 총 4개의 행이 반환되었다.

카테시안 조인의 특징

  • 비효율성: 카테시안 조인은 두 테이블의 행 수가 곱해진 만큼의 결과를 생성하기 때문에, 테이블의 행 수가 많을 경우 엄청나게 큰 결과 집합이 생성되어 성능에 큰 영향을 미칠 수 있다.
  • 조인 조건 없음: 조인 조건이 없는 경우 기본적으로 카테시안 조인이 수행된다. 따라서 대부분의 경우 의도하지 않은 결과를 초래할 수 있다.

카테시안 조인 방지 방법

대부분의 경우, 카테시안 조인은 의도한 것이 아니라 실수로 발생한다. 이를 방지하기 위해 다음과 같은 조치를 취할 수 있다.

  1. 적절한 조인 조건 사용: 두 테이블을 조인할 때는 항상 적절한 조인 조건(ON 절이나 WHERE 절)을 사용하여 필요한 행만 조인되도록 한다.

    SELECT *
    FROM A
    JOIN B ON A.A_id = B.B_id;
  2. 명확한 요구사항 확인: 조인을 수행하기 전에 정확히 어떤 결과를 원하는지 명확히 이해하고, 이에 맞는 조인 방식을 선택한다.

결론

카테시안 조인은 모든 행의 조합을 반환하는 조인 방식으로, 특정 상황에서는 유용할 수 있지만 대부분의 경우 비효율적이고 의도하지 않은 결과를 초래할 수 있다. 따라서 항상 적절한 조인 조건을 사용하여 필요 없는 카테시안 조인이 발생하지 않도록 주의해야 한다.

로우 체이닝(Row Chaining)

정의

  • 행의 크기가 블록 크기보다 클 때 하나의 행이 여러 블록에 걸쳐 나누어 저장되는 현상이다.

발생 시점

  • 초기 저장 시점: 행이 처음 삽입될 때 이미 크기가 블록 크기를 초과하여 여러 블록에 나누어 저장되는 경우이다.

원인

  • 행 자체가 매우 커서 한 블록에 모두 저장될 수 없을 때 발생한다.

예시

  • 데이터베이스 블록 크기가 8KB이고, 처음 삽입되는 행의 크기가 10KB라면 이 행은 처음부터 두 개의 블록에 나누어 저장된다.

로우 마이그레이션(Row Migration)

정의

  • 행이 업데이트로 인해 크기가 증가할 때, 현재 블록에 충분한 공간이 없어서 다른 블록으로 이동하는 현상이다.

발생 시점

  • 업데이트 시점: 기존에 저장된 행이 업데이트되면서 크기가 증가하여 원래 블록에 저장 공간이 부족해지는 경우이다.

원인

  • 행이 업데이트되어 크기가 증가하지만, 원래 저장된 블록에 추가 데이터를 저장할 공간이 충분하지 않을 때 발생한다.

예시

  • 원래 블록에 저장된 행의 크기가 6KB였는데, 업데이트로 인해 9KB로 증가했다. 원래 블록에 추가로 3KB의 여유 공간이 없으면 이 행은 새로운 블록으로 이동하게 된다.

요약

  • 로우 체이닝은 행이 처음부터 크기가 커서 여러 블록에 나뉘어 저장되는 경우이다.
  • 로우 마이그레이션은 기존 행이 업데이트로 인해 크기가 증가하여 다른 블록으로 이동하는 경우이다.

두 현상 모두 행이 여러 블록에 걸쳐 저장되는 결과를 낳지만, 로우 체이닝은 행의 크기가 처음부터 큰 경우이고, 로우 마이그레이션은 행이 업데이트로 인해 크기가 커진 경우라는 점에서 차이가 있다. 이를 통해 각 현상의 발생 원인과 시점을 이해할 수 있다.

DROP,TRUNCATE,DELETE 차이

DROPTRUNCATEDELETE
분류DDLDDL (일부 DML 성격 가짐)DML
RollbackRollback 불가능Rollback 불가능Commit 이전 Rollback 가능
CommitAuto CommitAuto Commit사용자 Commit
Storage테이블이 사용했던 Storage를 모두 Release테이블이 사용했던 Storage 중 최초 테이블 생성 시 할당된 Storage만 남기고 Release데이터를 모두 Delete해도 사용했던 Storage는 Release되지 않음
정의테이블의 정의 자체를 완전히 삭제함테이블을 최초 생성된 초기 상태로 만듦데이터만 삭제

트랜잭션의 4가지 특성

원자성: 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않은 상태로 남아있어야 한다

일관성: 트랜잭션이 실행 되기 전의 데이터베이스 내용이 잘못 되어 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안된다.

고립성: 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.

지속성: 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다.

단일행 NULL 관련 함수 종류

일반형 함수함수 설명
NVL(표현식1, 표현식2) / ISNULL(표현식1, 표현식2)표현식1의 결과값이 NULL이면 표현식2의 값을 출력한다. 단, 표현식1과 표현식2의 결과 데이터 타입이 같아야 한다. NULL 관련 가장 많이 사용되는 함수이므로 상당히 중요하다.
NULLIF(표현식1, 표현식2)표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 리턴한다.
COALESCE(표현식1, 표현식2, ......)임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다. 모든 표현식이 NULL이라면 NULL을 리턴한다.

집계 함수의 종류

집계 함수사용 목적
COUNT(*)NULL 값을 포함한 행의 수를 출력한다.
COUNT(표현식)표현식의 값이 NULL 값인 것을 제외한 행의 수를 출력한다.
SUM([DISTINCT or ALL] 표현식)표현식의 NULL 값을 제외한 합계를 출력한다.
AVG([DISTINCT or ALL] 표현식)표현식의 NULL 값을 제외한 평균을 출력한다.
MAX([DISTINCT or ALL] 표현식)표현식의 최대값을 출력한다. (문자, 날짜 데이터 타입도 사용 가능)
MIN([DISTINCT or ALL] 표현식)표현식의 최소값을 출력한다. (문자, 날짜 데이터 타입도 사용 가능)
STDEV([DISTINCT or ALL] 표현식)표현식의 표준 편차를 출력한다.
VARIAN([DISTINCT or ALL] 표현식)표현식의 분산을 출력한다.
기타 통계 함수벤더별로 다양한 통계식을 제공한다.

0개의 댓글