EXPLAIN 플랜 이해하기
PostgreSQL의 EXPLAIN 명령을 사용하여 쿼리 플랜을 분석하고 데이터베이스 쿼리를 최적화하는 방법을 설명합니다.
PostgreSQL에서는 EXPLAIN 명령을 사용하여 쿼리 플랜을 확인할 수 있습니다. 이 명령은 쿼리의 성능을 파악하려 할 때 매우 유용합니다. 쿼리가 해당 명령으로 시작하는 경우, SQL 쿼리 내에서 직접 사용할 수 있습니다: EXPLAIN SELECT COUNT(*) FROM projects WHERE visibility_level IN (0, 20); GitLab.com에서 이를 실행하면 다음과 같은 출력이 표시됩니다: Aggregate (cost=922411.76..922411.77 rows=1 width=8) -> Seq Scan on projects (cost=0.00..908044.47 rows=5746914 width=0) Filter: (visibility_level = ANY ('{0,20}'::integer[])) EXPLAIN 만 사용하면 PostgreSQL은 실제로 쿼리를 실행하지 않고, 대신 사용 가능한 통계를 기반으로 추정 실행 플랜을 생성합니다. 이는 실제 플랜과 상당히 다를 수 있습니다. 다행히도 PostgreSQL은 쿼리를 함께 실행하는 옵션을 제공합니다. 이를 위해 EXPLAIN 대신 EXPLAIN ANALYZE 를 사용해야 합니다: EXPLAIN ANALYZE SELECT COUNT(*) FROM projects WHERE visibility_level IN (0, 20); 이 경우 다음이 출력됩니다: Aggregate (cost=922420.60..922420.61 rows=1 width=8) (actual time=3428.535..3428.535 rows=1 loops=1) -> Seq Scan on projects (cost=0.00..908053.18 rows=5746969 width=0) (actual time=0.041..2987.606 rows=5746940 loops=1) Filter: (visibility_level = ANY ('{0,20}'::integer[])) Rows Removed by Filter: 65677 Planning time: 2.861 ms Execution time: 3428.596 ms 이 플랜은 이전과 상당히 다르며, 훨씬 더 많은 데이터를 포함합니다. 단계별로 살펴보겠습니다. EXPLAIN ANALYZE 는 쿼리를 실제로 실행하므로, 데이터를 수정하거나 타임아웃이 발생할 수 있는 쿼리를 사용할 때는 주의가 필요합니다. 쿼리가 데이터를 수정하는 경우, 다음과 같이 자동으로 롤백되는 트랜잭션으로 감싸는 것을 고려하세요: BEGIN; EXPLAIN ANALYZE DELETE FROM users WHERE id = 1; ROLLBACK; EXPLAIN 명령은 BUFFERS 와 같은 추가 옵션도 허용합니다: EXPLAIN (ANALYZE, BUFFERS) SELECT COUNT(*) FROM projects WHERE visibility_level IN (0, 20); 이 경우 다음이 출력됩니다: Aggregate (cost=922420.60..922420.61