SQL Academy · 강의

공간 인덱스(GiST)

위치 쿼리를 빠르게 만듭니다

레슨 4/413개 단계

공간 인덱스(GiST)은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

위치 질의가 느려지는 이유

레스토랑 위치가 수백만 개 저장된 테이블을 생각해 보십시오. "내 위치에서 5km 이내에 있는 모든 레스토랑을 찾으십시오."라고 요청하면 데이터베이스는 거리를 계산하기 위해 모든 행을 하나씩 확인해야 합니다. 이를 순차 스캔이라고 하며, 테이블이 커질수록 매우 느려집니다.

공간 인덱스는 도형 데이터를 트리 구조로 구성하여 이 문제를 해결합니다. 덕분에 데이터베이스가 테이블의 큰 부분을 즉시 건너뛸 수 있습니다.

GiST 인덱스란 무엇인가요?

GiST는 일반화 검색 트리를 의미합니다. 이는 PostgreSQL에 내장된 유연한 인덱스 프레임워크로, 기하 도형과 PostGIS 도형을 비롯한 다양한 데이터 유형을 지원합니다.

정수나 문자열처럼 정렬 가능한 값에 사용하는 B 트리 인덱스와 달리, GiST는 점, 다각형, 선과 같은 다차원 데이터를 인덱싱할 수 있습니다. PostGIS는 내부적으로 GiST를 사용하여 공간 인덱스를 구축합니다.

공간 인덱스 생성

도형 열에 GiST 인덱스를 생성하는 작업은 간단합니다. CREATE INDEX와 USING gist 절을 사용합니다. 이 한 문장만으로 질의 실행 시간을 몇 분에서 몇 밀리초로 줄일 수 있습니다.

CREATE INDEX idx_restaurants_geom
  ON restaurants
  USING gist (geom);

GiST 작동 방식: 경계 상자

GiST 공간 인덱스는 정확한 도형을 저장하지 않습니다. 대신 각 도형을 둘러싸는 가장 작은 직사각형인 경계 상자를 저장합니다. 트리는 각 수준에서 가까이 있는 경계 상자를 함께 그룹화하여 만들어집니다.

질의가 실행되면 PostgreSQL은 트리를 따라 내려가면서 경계 상자가 검색 영역과 겹치지 않는 가지를 제거합니다. 그런 다음 남은 후보 행만 정확하게 검사합니다. 이 2단계 방식(인덱스 탐색 + 재검사)은 매우 효율적입니다.

샘플 테이블 설정

인덱스 동작을 살펴보기 전에 도시 점을 저장할 샘플 테이블을 만들고 몇 개의 행을 채워 보겠습니다. geom 열은 각 도시를 WGS 84(SRID 4326)의 점으로 저장합니다.

CREATE TABLE cities (
  id   SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  geom GEOMETRY(Point, 4326)
);

INSERT INTO cities (name, geom) VALUES
  ('Paris',    ST_SetSRID(ST_MakePoint(2.3522,  48.8566), 4326)),
  ('Berlin',   ST_SetSRID(ST_MakePoint(13.4050, 52.5200), 4326)),
  ('Madrid',   ST_SetSRID(ST_MakePoint(-3.7038, 40.4168), 4326)),
  ('Rome',     ST_SetSRID(ST_MakePoint(12.4964, 41.9028), 4326)),
  ('Warsaw',   ST_SetSRID(ST_MakePoint(21.0122, 52.2297), 4326));

GiST 인덱스 추가

테이블에 데이터를 채웠다면 geom 열에 GiST 인덱스를 추가하십시오. 수백만 개의 행이 있는 운영 환경 테이블에서는 이 문장을 실행하는 데 몇 분이 걸릴 수 있지만 한 번만 실행하면 됩니다. 그 후에는 이 열을 대상으로 하는 모든 공간 질의가 자동으로 이점을 얻습니다.

CREATE INDEX idx_cities_geom
  ON cities
  USING gist (geom);

-- Verify the index exists
SELECT indexname, indexdef
FROM   pg_indexes
WHERE  tablename = 'cities';

경계 상자 연산자 &&

PostGIS는 두 경계 상자가 겹치는지 검사하는 && 연산자를 제공합니다. 이 연산자는 인덱스를 활용할 수 있으므로 쿼리 계획 수립기가 GiST 인덱스를 자동으로 사용합니다. 정확한 도형 교차를 계산하는 것보다 훨씬 빠르며, 빠른 사전 필터로 자주 사용됩니다.

-- Find cities whose bounding box overlaps a search rectangle
SELECT name
FROM   cities
WHERE  geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);

최근접 이웃 검색: <->

<-> 연산자는 두 도형 사이의 거리를 반환하며 GiST로 가속됩니다. 이 연산자를 ORDER BY ... LIMIT과 결합하면 전체 테이블 스캔 없이 매우 빠른 k-최근접 이웃(KNN) 질의를 수행할 수 있습니다.

-- Find the 3 cities closest to a reference point (Brussels)
SELECT name,
       ST_Distance(
         geom::geography,
         ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)::geography
       ) / 1000 AS distance_km
FROM   cities
ORDER BY geom <-> ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)
LIMIT  3;

EXPLAIN으로 인덱스 사용 확인

쿼리 계획 수립기가 실제로 인덱스를 사용하는지 확인하려면 항상 EXPLAIN 또는 EXPLAIN ANALYZE를 사용하십시오. 출력에서 비트맵 인덱스 스캔 또는 idx_cities_geom을 사용하는 인덱스 스캔을 찾으십시오. 대신 순차 스캔이 표시된다면 테이블이 너무 작아서 쿼리 계획 수립기가 인덱스를 우선하지 않는 것일 수 있습니다.

EXPLAIN
SELECT name
FROM   cities
WHERE  geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);

동시 인덱스 생성

표준 CREATE INDEX 명령으로 대규모 공간 인덱스를 구축하면 쓰기 작업을 위해 테이블이 잠깁니다. 운영 환경에서는 CREATE INDEX CONCURRENTLY를 사용하여 삽입이나 업데이트를 차단하지 않고 인덱스를 구축하십시오. 대신 구축 시간이 더 오래 걸리고 트랜잭션 블록 안에서는 실행할 수 없습니다.

-- Safe for production tables (no write lock)
CREATE INDEX CONCURRENTLY idx_restaurants_geom
  ON restaurants
  USING gist (geom);

공간 인덱스 유지 관리

시간이 지나면서 대량의 삽입, 업데이트 및 삭제로 인해 인덱스 비대화가 발생할 수 있습니다. 인덱스가 조각화되어 효율성이 떨어지는 상태입니다. REINDEX를 사용하여 인덱스를 다시 깔끔하게 구축하거나, 주기적으로 VACUUM ANALYZE를 예약 실행하여 통계를 업데이트하면 쿼리 계획 수립기가 더 나은 결정을 내릴 수 있습니다.

-- Rebuild the index to remove bloat
REINDEX INDEX idx_cities_geom;

-- Update planner statistics for the table
ANALYZE cities;

빠른 확인: GiST 인덱스

PostGIS에서 GiST를 사용한 공간 인덱스에 대한 이해도를 확인해 보십시오.

복습: GiST를 사용한 공간 인덱스

이 레슨에서는 PostgreSQL과 PostGIS에서 GiST를 사용하여 성능이 중요한 위치 질의를 효율적으로 처리하는 이유와 그 방법을 배웠습니다.

핵심 내용:

  • GiST(일반화 검색 트리)는 다차원 도형 데이터를 지원하는 유연한 인덱스 유형입니다.
  • CREATE INDEX ... USING gist (geom)을 사용하여 공간 인덱스를 생성합니다.
  • GiST는 경계 상자를 저장하고 검색 트리의 가지를 제거하여 전체 테이블 스캔을 피합니다.
  • && 연산자(경계 상자 겹침)와 <-> 연산자(거리/KNN)는 모두 GiST로 가속됩니다.
  • 인덱스 사용을 확인하려면 EXPLAIN을 사용하고, 운영 환경에서는 쓰기 잠금을 피하기 위해 CREATE INDEX CONCURRENTLY를 사용하십시오.
  • 쿼리를 시간이 지나도 빠르게 유지하려면 REINDEX와 ANALYZE로 인덱스를 관리하십시오.
무료로 시작

AI 튜터와 함께 SQL을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
46
레슨
183

자주 묻는 질문

“공간 인덱스(GiST)” 강의는 무료인가요?

네 — “공간 인덱스(GiST)” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“공간 인덱스(GiST)”에서 뭘 배우나요?

위치 쿼리를 빠르게 만듭니다 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“공간 인덱스(GiST)” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 공간 데이터 유형
  2. 거리와 최근접 이웃
  3. 공간 조인과 포함 관계
  4. 공간 인덱스(GiST)
← SQL Academy(으)로 돌아가기