{"componentChunkName":"component---src-templates-blog-post-js","path":"/etc/PostgreSQL-고급-기능-JSON-Full-Text-Search-Partitioning/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"bc926b7f-30c8-5e6f-b6bd-dfebe24ba793","excerpt":"PostgreSQL 고급 기능 - JSON, Full-Text Search, Partitioning PostgreSQL은 가장 강력한 오픈소스 관계형 데이터베이스 중 하나다. JSON 지원, Full-Text Search…","html":"<h1 id=\"postgresql-고급-기능---json-full-text-search-partitioning\" style=\"position:relative;\"><a href=\"#postgresql-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5---json-full-text-search-partitioning\" aria-label=\"postgresql 고급 기능   json full text search partitioning permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>PostgreSQL 고급 기능 - JSON, Full-Text Search, Partitioning</h1>\n<p>PostgreSQL은 가장 강력한 오픈소스 관계형 데이터베이스 중 하나다. JSON 지원, Full-Text Search, 파티셔닝 등 고급 기능들을 통해 다양한 요구사항을 충족할 수 있다. 이 글은 PostgreSQL의 고급 기능을 실전 예제와 함께 정리한다.</p>\n<h2 id=\"1-json과-jsonb\" style=\"position:relative;\"><a href=\"#1-json%EA%B3%BC-jsonb\" aria-label=\"1 json과 jsonb permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. JSON과 JSONB</h2>\n<h3 id=\"1-1-json-타입-기본\" style=\"position:relative;\"><a href=\"#1-1-json-%ED%83%80%EC%9E%85-%EA%B8%B0%EB%B3%B8\" aria-label=\"1 1 json 타입 기본 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-1. JSON 타입 기본</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- JSON 컬럼이 있는 테이블 생성</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> products <span class=\"token punctuation\">(</span>\n    id <span class=\"token keyword\">SERIAL</span> <span class=\"token keyword\">PRIMARY</span> <span class=\"token keyword\">KEY</span><span class=\"token punctuation\">,</span>\n    name <span class=\"token keyword\">VARCHAR</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    metadata JSON<span class=\"token punctuation\">,</span>\n    attributes JSONB\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- JSON 데이터 삽입</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> products <span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> metadata<span class=\"token punctuation\">,</span> attributes<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'Laptop'</span><span class=\"token punctuation\">,</span> \n <span class=\"token string\">'{\"brand\": \"Dell\", \"model\": \"XPS 13\", \"year\": 2024}'</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'{\"cpu\": \"Intel i7\", \"ram\": \"16GB\", \"storage\": \"512GB SSD\", \"price\": 1299}'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- JSON 데이터 조회</span>\n<span class=\"token keyword\">SELECT</span> name<span class=\"token punctuation\">,</span> metadata<span class=\"token punctuation\">,</span> attributes <span class=\"token keyword\">FROM</span> products<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- JSON 필드 접근</span>\n<span class=\"token keyword\">SELECT</span> \n    name<span class=\"token punctuation\">,</span>\n    metadata<span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'brand'</span> <span class=\"token keyword\">AS</span> brand<span class=\"token punctuation\">,</span>\n    attributes<span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'cpu'</span> <span class=\"token keyword\">AS</span> cpu<span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">(</span>attributes<span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'price'</span><span class=\"token punctuation\">)</span>::<span class=\"token keyword\">INTEGER</span> <span class=\"token keyword\">AS</span> price\n<span class=\"token keyword\">FROM</span> products<span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"1-2-jsonb-연산자\" style=\"position:relative;\"><a href=\"#1-2-jsonb-%EC%97%B0%EC%82%B0%EC%9E%90\" aria-label=\"1 2 jsonb 연산자 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-2. JSONB 연산자</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- JSONB 연산자들</span>\n<span class=\"token keyword\">SELECT</span> \n    <span class=\"token comment\">-- 필드 접근</span>\n    attributes<span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token string\">'cpu'</span> <span class=\"token keyword\">AS</span> cpu_json<span class=\"token punctuation\">,</span>           <span class=\"token comment\">-- JSON 반환</span>\n    attributes<span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'cpu'</span> <span class=\"token keyword\">AS</span> cpu_text<span class=\"token punctuation\">,</span>          <span class=\"token comment\">-- 텍스트 반환</span>\n    \n    <span class=\"token comment\">-- 중첩 필드 접근</span>\n    attributes<span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token string\">'specs'</span><span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'ram'</span> <span class=\"token keyword\">AS</span> ram<span class=\"token punctuation\">,</span>\n    \n    <span class=\"token comment\">-- 배열 접근</span>\n    attributes<span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token string\">'tags'</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token number\">0</span> <span class=\"token keyword\">AS</span> first_tag<span class=\"token punctuation\">,</span>\n    attributes<span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token string\">'tags'</span><span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token number\">0</span> <span class=\"token keyword\">AS</span> first_tag_text<span class=\"token punctuation\">,</span>\n    \n    <span class=\"token comment\">-- 경로 접근</span>\n    attributes<span class=\"token comment\">#>'{specs,ram}' AS ram_path,</span>\n    attributes<span class=\"token comment\">#>>'{specs,ram}' AS ram_path_text,</span>\n    \n    <span class=\"token comment\">-- 키 존재 확인</span>\n    attributes ? <span class=\"token string\">'cpu'</span> <span class=\"token keyword\">AS</span> has_cpu<span class=\"token punctuation\">,</span>\n    attributes ?<span class=\"token operator\">|</span> ARRAY<span class=\"token punctuation\">[</span><span class=\"token string\">'cpu'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'ram'</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">AS</span> has_any<span class=\"token punctuation\">,</span>\n    attributes ?<span class=\"token operator\">&amp;</span> ARRAY<span class=\"token punctuation\">[</span><span class=\"token string\">'cpu'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'ram'</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">AS</span> has_all<span class=\"token punctuation\">,</span>\n    \n    <span class=\"token comment\">-- JSONB 포함 확인</span>\n    attributes @<span class=\"token operator\">></span> <span class=\"token string\">'{\"cpu\": \"Intel i7\"}'</span> <span class=\"token keyword\">AS</span> contains_cpu<span class=\"token punctuation\">,</span>\n    <span class=\"token string\">'{\"cpu\": \"Intel i7\"}'</span> <span class=\"token operator\">&lt;</span>@ attributes <span class=\"token keyword\">AS</span> is_contained\n    \n<span class=\"token keyword\">FROM</span> products<span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"1-3-jsonb-함수\" style=\"position:relative;\"><a href=\"#1-3-jsonb-%ED%95%A8%EC%88%98\" aria-label=\"1 3 jsonb 함수 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-3. JSONB 함수</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- JSONB 함수들</span>\n<span class=\"token keyword\">SELECT</span> \n    <span class=\"token comment\">-- 키 추출</span>\n    jsonb_object_keys<span class=\"token punctuation\">(</span>attributes<span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> <span class=\"token keyword\">keys</span><span class=\"token punctuation\">,</span>\n    \n    <span class=\"token comment\">-- 값 추출</span>\n    jsonb_array_elements<span class=\"token punctuation\">(</span>attributes<span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token string\">'tags'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> tag<span class=\"token punctuation\">,</span>\n    \n    <span class=\"token comment\">-- 객체 병합</span>\n    attributes <span class=\"token operator\">||</span> <span class=\"token string\">'{\"warranty\": \"2 years\"}'</span>::jsonb <span class=\"token keyword\">AS</span> merged<span class=\"token punctuation\">,</span>\n    \n    <span class=\"token comment\">-- 키 제거</span>\n    attributes <span class=\"token operator\">-</span> <span class=\"token string\">'price'</span> <span class=\"token keyword\">AS</span> without_price<span class=\"token punctuation\">,</span>\n    attributes <span class=\"token operator\">-</span> ARRAY<span class=\"token punctuation\">[</span><span class=\"token string\">'price'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'warranty'</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">AS</span> without_multiple<span class=\"token punctuation\">,</span>\n    \n    <span class=\"token comment\">-- 배열 요소 제거</span>\n    attributes <span class=\"token comment\">#- '{tags,0}' AS without_first_tag,</span>\n    \n    <span class=\"token comment\">-- 타입 변환</span>\n    jsonb_typeof<span class=\"token punctuation\">(</span>attributes<span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token string\">'price'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> price_type<span class=\"token punctuation\">,</span>\n    \n    <span class=\"token comment\">-- JSONB 크기</span>\n    jsonb_array_length<span class=\"token punctuation\">(</span>attributes<span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token string\">'tags'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> tags_count\n    \n<span class=\"token keyword\">FROM</span> products<span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"1-4-jsonb-인덱싱\" style=\"position:relative;\"><a href=\"#1-4-jsonb-%EC%9D%B8%EB%8D%B1%EC%8B%B1\" aria-label=\"1 4 jsonb 인덱싱 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-4. JSONB 인덱싱</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- GIN 인덱스 생성 (전체 JSONB 검색용)</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_products_attributes_gin <span class=\"token keyword\">ON</span> products <span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>attributes<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 특정 키에 대한 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_products_cpu <span class=\"token keyword\">ON</span> products <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>attributes<span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'cpu'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_products_price <span class=\"token keyword\">ON</span> products <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>attributes<span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'price'</span><span class=\"token punctuation\">)</span>::<span class=\"token keyword\">INTEGER</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- JSONB 경로 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_products_specs <span class=\"token keyword\">ON</span> products <span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>attributes<span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token string\">'specs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 사용 예시</span>\n<span class=\"token comment\">-- GIN 인덱스를 활용한 쿼리</span>\n<span class=\"token keyword\">SELECT</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">FROM</span> products \n<span class=\"token keyword\">WHERE</span> attributes @<span class=\"token operator\">></span> <span class=\"token string\">'{\"cpu\": \"Intel i7\"}'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 특정 키 인덱스를 활용한 쿼리</span>\n<span class=\"token keyword\">SELECT</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">FROM</span> products \n<span class=\"token keyword\">WHERE</span> attributes<span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'cpu'</span> <span class=\"token operator\">=</span> <span class=\"token string\">'Intel i7'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"1-5-jsonb-업데이트\" style=\"position:relative;\"><a href=\"#1-5-jsonb-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8\" aria-label=\"1 5 jsonb 업데이트 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-5. JSONB 업데이트</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- JSONB 필드 업데이트</span>\n<span class=\"token keyword\">UPDATE</span> products \n<span class=\"token keyword\">SET</span> attributes <span class=\"token operator\">=</span> attributes <span class=\"token operator\">||</span> <span class=\"token string\">'{\"warranty\": \"2 years\"}'</span>::jsonb\n<span class=\"token keyword\">WHERE</span> id <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 중첩 필드 업데이트</span>\n<span class=\"token keyword\">UPDATE</span> products \n<span class=\"token keyword\">SET</span> attributes <span class=\"token operator\">=</span> jsonb_set<span class=\"token punctuation\">(</span>\n    attributes<span class=\"token punctuation\">,</span>\n    <span class=\"token string\">'{specs,ram}'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">'\"32GB\"'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token boolean\">true</span>  <span class=\"token comment\">-- 없으면 생성</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">WHERE</span> id <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 배열에 요소 추가</span>\n<span class=\"token keyword\">UPDATE</span> products \n<span class=\"token keyword\">SET</span> attributes <span class=\"token operator\">=</span> jsonb_set<span class=\"token punctuation\">(</span>\n    attributes<span class=\"token punctuation\">,</span>\n    <span class=\"token string\">'{tags}'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">COALESCE</span><span class=\"token punctuation\">(</span>attributes<span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token string\">'tags'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'[]'</span>::jsonb<span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token string\">'\"new-tag\"'</span>::jsonb\n<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">WHERE</span> id <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 키 제거</span>\n<span class=\"token keyword\">UPDATE</span> products \n<span class=\"token keyword\">SET</span> attributes <span class=\"token operator\">=</span> attributes <span class=\"token operator\">-</span> <span class=\"token string\">'warranty'</span>\n<span class=\"token keyword\">WHERE</span> id <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"2-full-text-search\" style=\"position:relative;\"><a href=\"#2-full-text-search\" aria-label=\"2 full text search permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Full-Text Search</h2>\n<h3 id=\"2-1-기본-full-text-search\" style=\"position:relative;\"><a href=\"#2-1-%EA%B8%B0%EB%B3%B8-full-text-search\" aria-label=\"2 1 기본 full text search permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-1. 기본 Full-Text Search</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- Full-Text Search용 테이블 생성</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> articles <span class=\"token punctuation\">(</span>\n    id <span class=\"token keyword\">SERIAL</span> <span class=\"token keyword\">PRIMARY</span> <span class=\"token keyword\">KEY</span><span class=\"token punctuation\">,</span>\n    title <span class=\"token keyword\">VARCHAR</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    content <span class=\"token keyword\">TEXT</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    created_at <span class=\"token keyword\">TIMESTAMP</span> <span class=\"token keyword\">DEFAULT</span> <span class=\"token keyword\">CURRENT_TIMESTAMP</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- tsvector 컬럼 추가</span>\n<span class=\"token keyword\">ALTER</span> <span class=\"token keyword\">TABLE</span> articles <span class=\"token keyword\">ADD</span> <span class=\"token keyword\">COLUMN</span> search_vector tsvector<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- tsvector 생성 함수</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token operator\">OR</span> <span class=\"token keyword\">REPLACE</span> <span class=\"token keyword\">FUNCTION</span> update_search_vector<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">RETURNS</span> <span class=\"token keyword\">TRIGGER</span> <span class=\"token keyword\">AS</span> $$\n<span class=\"token keyword\">BEGIN</span>\n    NEW<span class=\"token punctuation\">.</span>search_vector :<span class=\"token operator\">=</span> \n        setweight<span class=\"token punctuation\">(</span>to_tsvector<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">COALESCE</span><span class=\"token punctuation\">(</span>NEW<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">,</span> <span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'A'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span>\n        setweight<span class=\"token punctuation\">(</span>to_tsvector<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">COALESCE</span><span class=\"token punctuation\">(</span>NEW<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">,</span> <span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'B'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">RETURN</span> NEW<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">END</span><span class=\"token punctuation\">;</span>\n$$ <span class=\"token keyword\">LANGUAGE</span> plpgsql<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 트리거 생성</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TRIGGER</span> update_articles_search_vector\n    BEFORE <span class=\"token keyword\">INSERT</span> <span class=\"token operator\">OR</span> <span class=\"token keyword\">UPDATE</span> <span class=\"token keyword\">ON</span> articles\n    <span class=\"token keyword\">FOR EACH ROW</span>\n    <span class=\"token keyword\">EXECUTE</span> <span class=\"token keyword\">FUNCTION</span> update_search_vector<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 샘플 데이터</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> articles <span class=\"token punctuation\">(</span>title<span class=\"token punctuation\">,</span> content<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'Introduction to PostgreSQL'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'PostgreSQL is a powerful open-source database...'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'Advanced SQL Techniques'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Learn advanced SQL techniques for data analysis...'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'Database Performance Optimization'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Optimize your database queries for better performance...'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- Full-Text Search 쿼리</span>\n<span class=\"token keyword\">SELECT</span> title<span class=\"token punctuation\">,</span> content\n<span class=\"token keyword\">FROM</span> articles\n<span class=\"token keyword\">WHERE</span> search_vector @@ to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'PostgreSQL &amp; database'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 순위 기반 검색</span>\n<span class=\"token keyword\">SELECT</span> \n    title<span class=\"token punctuation\">,</span>\n    content<span class=\"token punctuation\">,</span>\n    ts_rank<span class=\"token punctuation\">(</span>search_vector<span class=\"token punctuation\">,</span> to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'PostgreSQL &amp; database'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> rank\n<span class=\"token keyword\">FROM</span> articles\n<span class=\"token keyword\">WHERE</span> search_vector @@ to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'PostgreSQL &amp; database'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> rank <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"2-2-gin-인덱스와-full-text-search\" style=\"position:relative;\"><a href=\"#2-2-gin-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EC%99%80-full-text-search\" aria-label=\"2 2 gin 인덱스와 full text search permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-2. GIN 인덱스와 Full-Text Search</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- GIN 인덱스 생성</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_articles_search_vector <span class=\"token keyword\">ON</span> articles <span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>search_vector<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 인덱스를 활용한 빠른 검색</span>\n<span class=\"token keyword\">SELECT</span> title<span class=\"token punctuation\">,</span> content\n<span class=\"token keyword\">FROM</span> articles\n<span class=\"token keyword\">WHERE</span> search_vector @@ to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'PostgreSQL &amp; database'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 여러 언어 지원</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_articles_search_korean <span class=\"token keyword\">ON</span> articles \n<span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>to_tsvector<span class=\"token punctuation\">(</span><span class=\"token string\">'korean'</span><span class=\"token punctuation\">,</span> title <span class=\"token operator\">||</span> <span class=\"token string\">' '</span> <span class=\"token operator\">||</span> content<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 한국어 검색</span>\n<span class=\"token keyword\">SELECT</span> title<span class=\"token punctuation\">,</span> content\n<span class=\"token keyword\">FROM</span> articles\n<span class=\"token keyword\">WHERE</span> to_tsvector<span class=\"token punctuation\">(</span><span class=\"token string\">'korean'</span><span class=\"token punctuation\">,</span> title <span class=\"token operator\">||</span> <span class=\"token string\">' '</span> <span class=\"token operator\">||</span> content<span class=\"token punctuation\">)</span> \n      @@ to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'korean'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'데이터베이스 &amp; 최적화'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"2-3-고급-full-text-search\" style=\"position:relative;\"><a href=\"#2-3-%EA%B3%A0%EA%B8%89-full-text-search\" aria-label=\"2 3 고급 full text search permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-3. 고급 Full-Text Search</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 사용자 정의 텍스트 검색 설정</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TEXT</span> SEARCH CONFIGURATION english_custom <span class=\"token punctuation\">(</span>COPY <span class=\"token operator\">=</span> english<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 동의어 사전 생성</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TEXT</span> SEARCH DICTIONARY english_synonym <span class=\"token punctuation\">(</span>\n    TEMPLATE <span class=\"token operator\">=</span> synonym<span class=\"token punctuation\">,</span>\n    SYNONYMS <span class=\"token operator\">=</span> english_synonyms\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 동의어 사전을 텍스트 검색 설정에 추가</span>\n<span class=\"token keyword\">ALTER</span> <span class=\"token keyword\">TEXT</span> SEARCH CONFIGURATION english_custom\n    <span class=\"token keyword\">ALTER</span> MAPPING <span class=\"token keyword\">FOR</span> asciiword<span class=\"token punctuation\">,</span> word\n    <span class=\"token keyword\">WITH</span> english_synonym<span class=\"token punctuation\">,</span> english_stem<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 사용자 정의 설정 사용</span>\n<span class=\"token keyword\">SELECT</span> title<span class=\"token punctuation\">,</span> content\n<span class=\"token keyword\">FROM</span> articles\n<span class=\"token keyword\">WHERE</span> to_tsvector<span class=\"token punctuation\">(</span><span class=\"token string\">'english_custom'</span><span class=\"token punctuation\">,</span> title <span class=\"token operator\">||</span> <span class=\"token string\">' '</span> <span class=\"token operator\">||</span> content<span class=\"token punctuation\">)</span>\n      @@ to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english_custom'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'database | DB'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 하이라이트 검색 결과</span>\n<span class=\"token keyword\">SELECT</span> \n    title<span class=\"token punctuation\">,</span>\n    ts_headline<span class=\"token punctuation\">(</span>\n        <span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span>\n        content<span class=\"token punctuation\">,</span>\n        to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'PostgreSQL'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">'StartSel=&lt;mark>, StopSel=&lt;/mark>'</span>\n    <span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> highlighted_content\n<span class=\"token keyword\">FROM</span> articles\n<span class=\"token keyword\">WHERE</span> search_vector @@ to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'PostgreSQL'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"2-4-full-text-search-성능-최적화\" style=\"position:relative;\"><a href=\"#2-4-full-text-search-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94\" aria-label=\"2 4 full text search 성능 최적화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-4. Full-Text Search 성능 최적화</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 부분 인덱스 (NULL이 아닌 경우만 인덱싱)</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_articles_search_partial <span class=\"token keyword\">ON</span> articles \n<span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>search_vector<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">WHERE</span> search_vector <span class=\"token operator\">IS</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 표현식 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_articles_title_search <span class=\"token keyword\">ON</span> articles \n<span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>to_tsvector<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> title<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 복합 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_articles_title_content <span class=\"token keyword\">ON</span> articles \n<span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>\n    to_tsvector<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> title<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    to_tsvector<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> content<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 통계 정보 업데이트</span>\n<span class=\"token keyword\">ANALYZE</span> articles<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 쿼리 실행 계획 확인</span>\n<span class=\"token keyword\">EXPLAIN</span> <span class=\"token keyword\">ANALYZE</span>\n<span class=\"token keyword\">SELECT</span> title<span class=\"token punctuation\">,</span> content\n<span class=\"token keyword\">FROM</span> articles\n<span class=\"token keyword\">WHERE</span> search_vector @@ to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'PostgreSQL'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"3-테이블-파티셔닝\" style=\"position:relative;\"><a href=\"#3-%ED%85%8C%EC%9D%B4%EB%B8%94-%ED%8C%8C%ED%8B%B0%EC%85%94%EB%8B%9D\" aria-label=\"3 테이블 파티셔닝 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 테이블 파티셔닝</h2>\n<h3 id=\"3-1-range-partitioning\" style=\"position:relative;\"><a href=\"#3-1-range-partitioning\" aria-label=\"3 1 range partitioning permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-1. Range Partitioning</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 파티션된 테이블 생성</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> sales <span class=\"token punctuation\">(</span>\n    id <span class=\"token keyword\">SERIAL</span><span class=\"token punctuation\">,</span>\n    sale_date <span class=\"token keyword\">DATE</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    product_id <span class=\"token keyword\">INTEGER</span><span class=\"token punctuation\">,</span>\n    amount <span class=\"token keyword\">DECIMAL</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">PRIMARY</span> <span class=\"token keyword\">KEY</span> <span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> sale_date<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span> <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">BY</span> RANGE <span class=\"token punctuation\">(</span>sale_date<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 월별 파티션 생성</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> sales_2024_01 <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> sales\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">FROM</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-01-01'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">TO</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-02-01'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> sales_2024_02 <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> sales\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">FROM</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-02-01'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">TO</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-03-01'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> sales_2024_03 <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> sales\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">FROM</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-03-01'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">TO</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-04-01'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 기본 파티션 (나머지 모든 값)</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> sales_default <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> sales <span class=\"token keyword\">DEFAULT</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 데이터 삽입</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> sales <span class=\"token punctuation\">(</span>sale_date<span class=\"token punctuation\">,</span> product_id<span class=\"token punctuation\">,</span> amount<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'2024-01-15'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100.00</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'2024-02-20'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">200.00</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'2024-03-10'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">150.00</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 파티션 프루닝 확인</span>\n<span class=\"token keyword\">EXPLAIN</span> <span class=\"token keyword\">ANALYZE</span>\n<span class=\"token keyword\">SELECT</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">FROM</span> sales\n<span class=\"token keyword\">WHERE</span> sale_date <span class=\"token operator\">>=</span> <span class=\"token string\">'2024-01-01'</span> <span class=\"token operator\">AND</span> sale_date <span class=\"token operator\">&lt;</span> <span class=\"token string\">'2024-02-01'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"3-2-list-partitioning\" style=\"position:relative;\"><a href=\"#3-2-list-partitioning\" aria-label=\"3 2 list partitioning permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-2. List Partitioning</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 리스트 파티셔닝</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> products_by_region <span class=\"token punctuation\">(</span>\n    id <span class=\"token keyword\">SERIAL</span><span class=\"token punctuation\">,</span>\n    name <span class=\"token keyword\">VARCHAR</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    region <span class=\"token keyword\">VARCHAR</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    price <span class=\"token keyword\">DECIMAL</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">PRIMARY</span> <span class=\"token keyword\">KEY</span> <span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> region<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span> <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">BY</span> LIST <span class=\"token punctuation\">(</span>region<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 지역별 파티션 생성</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> products_north <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> products_by_region\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token operator\">IN</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'Seoul'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Incheon'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Gyeonggi'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> products_south <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> products_by_region\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token operator\">IN</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'Busan'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Daegu'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ulsan'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> products_central <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> products_by_region\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token operator\">IN</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'Daejeon'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Gwangju'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Jeonju'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 데이터 삽입</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> products_by_region <span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> region<span class=\"token punctuation\">,</span> price<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'Product A'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Seoul'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100.00</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'Product B'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Busan'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">200.00</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">(</span><span class=\"token string\">'Product C'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Daejeon'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">150.00</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"3-3-hash-partitioning\" style=\"position:relative;\"><a href=\"#3-3-hash-partitioning\" aria-label=\"3 3 hash partitioning permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-3. Hash Partitioning</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 해시 파티셔닝</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> user_sessions <span class=\"token punctuation\">(</span>\n    id <span class=\"token keyword\">SERIAL</span><span class=\"token punctuation\">,</span>\n    user_id <span class=\"token keyword\">INTEGER</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    session_data JSONB<span class=\"token punctuation\">,</span>\n    created_at <span class=\"token keyword\">TIMESTAMP</span> <span class=\"token keyword\">DEFAULT</span> <span class=\"token keyword\">CURRENT_TIMESTAMP</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">PRIMARY</span> <span class=\"token keyword\">KEY</span> <span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> user_id<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span> <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">BY</span> <span class=\"token keyword\">HASH</span> <span class=\"token punctuation\">(</span>user_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 4개의 해시 파티션 생성</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> user_sessions_0 <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> user_sessions\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">WITH</span> <span class=\"token punctuation\">(</span>MODULUS <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> REMAINDER <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> user_sessions_1 <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> user_sessions\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">WITH</span> <span class=\"token punctuation\">(</span>MODULUS <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> REMAINDER <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> user_sessions_2 <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> user_sessions\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">WITH</span> <span class=\"token punctuation\">(</span>MODULUS <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> REMAINDER <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> user_sessions_3 <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> user_sessions\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">WITH</span> <span class=\"token punctuation\">(</span>MODULUS <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> REMAINDER <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"3-4-파티션-관리\" style=\"position:relative;\"><a href=\"#3-4-%ED%8C%8C%ED%8B%B0%EC%85%98-%EA%B4%80%EB%A6%AC\" aria-label=\"3 4 파티션 관리 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-4. 파티션 관리</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 새 파티션 추가</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> sales_2024_04 <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> sales\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">FROM</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-04-01'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">TO</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-05-01'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 파티션 분할</span>\n<span class=\"token keyword\">ALTER</span> <span class=\"token keyword\">TABLE</span> sales_2024_01 \n    SPLIT <span class=\"token keyword\">PARTITION</span> sales_2024_01 <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token keyword\">PARTITION</span> sales_2024_01_early <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">FROM</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-01-01'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">TO</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-01-15'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token keyword\">PARTITION</span> sales_2024_01_late <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">FROM</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-01-15'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">TO</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-02-01'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 파티션 제거 (데이터 보존)</span>\n<span class=\"token keyword\">ALTER</span> <span class=\"token keyword\">TABLE</span> sales DETACH <span class=\"token keyword\">PARTITION</span> sales_2024_01<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 파티션 삭제 (데이터 삭제)</span>\n<span class=\"token keyword\">DROP</span> <span class=\"token keyword\">TABLE</span> sales_2024_01<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 파티션 통계 정보</span>\n<span class=\"token keyword\">SELECT</span> \n    schemaname<span class=\"token punctuation\">,</span>\n    tablename<span class=\"token punctuation\">,</span>\n    pg_size_pretty<span class=\"token punctuation\">(</span>pg_total_relation_size<span class=\"token punctuation\">(</span>schemaname<span class=\"token operator\">||</span><span class=\"token string\">'.'</span><span class=\"token operator\">||</span>tablename<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> size\n<span class=\"token keyword\">FROM</span> pg_tables\n<span class=\"token keyword\">WHERE</span> tablename <span class=\"token operator\">LIKE</span> <span class=\"token string\">'sales_%'</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> tablename<span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"4-인덱싱-전략\" style=\"position:relative;\"><a href=\"#4-%EC%9D%B8%EB%8D%B1%EC%8B%B1-%EC%A0%84%EB%9E%B5\" aria-label=\"4 인덱싱 전략 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. 인덱싱 전략</h2>\n<h3 id=\"4-1-b-tree-인덱스\" style=\"position:relative;\"><a href=\"#4-1-b-tree-%EC%9D%B8%EB%8D%B1%EC%8A%A4\" aria-label=\"4 1 b tree 인덱스 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-1. B-Tree 인덱스</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 기본 B-Tree 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_users_email <span class=\"token keyword\">ON</span> users <span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 복합 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_orders_user_date <span class=\"token keyword\">ON</span> orders <span class=\"token punctuation\">(</span>user_id<span class=\"token punctuation\">,</span> order_date <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 부분 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_active_users <span class=\"token keyword\">ON</span> users <span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">)</span> \n<span class=\"token keyword\">WHERE</span> is_active <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 표현식 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_users_lower_email <span class=\"token keyword\">ON</span> users <span class=\"token punctuation\">(</span>LOWER<span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- UNIQUE 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">UNIQUE</span> <span class=\"token keyword\">INDEX</span> idx_users_username_unique <span class=\"token keyword\">ON</span> users <span class=\"token punctuation\">(</span>username<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"4-2-gin-인덱스\" style=\"position:relative;\"><a href=\"#4-2-gin-%EC%9D%B8%EB%8D%B1%EC%8A%A4\" aria-label=\"4 2 gin 인덱스 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-2. GIN 인덱스</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- JSONB용 GIN 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_products_attributes_gin <span class=\"token keyword\">ON</span> products <span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>attributes<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 배열용 GIN 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_products_tags_gin <span class=\"token keyword\">ON</span> products <span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>tags<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- Full-Text Search용 GIN 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_articles_search_gin <span class=\"token keyword\">ON</span> articles <span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>search_vector<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"4-3-gist-인덱스\" style=\"position:relative;\"><a href=\"#4-3-gist-%EC%9D%B8%EB%8D%B1%EC%8A%A4\" aria-label=\"4 3 gist 인덱스 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-3. GiST 인덱스</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 기하학적 데이터용 GiST 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_locations_geom <span class=\"token keyword\">ON</span> locations <span class=\"token keyword\">USING</span> GIST <span class=\"token punctuation\">(</span>geom<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 범위 타입용 GiST 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_events_period <span class=\"token keyword\">ON</span> events <span class=\"token keyword\">USING</span> GIST <span class=\"token punctuation\">(</span>period<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- Full-Text Search용 GiST 인덱스 (GIN 대신)</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_articles_search_gist <span class=\"token keyword\">ON</span> articles <span class=\"token keyword\">USING</span> GIST <span class=\"token punctuation\">(</span>search_vector<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"4-4-인덱스-최적화\" style=\"position:relative;\"><a href=\"#4-4-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%B5%9C%EC%A0%81%ED%99%94\" aria-label=\"4 4 인덱스 최적화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-4. 인덱스 최적화</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 인덱스 사용 통계 확인</span>\n<span class=\"token keyword\">SELECT</span> \n    schemaname<span class=\"token punctuation\">,</span>\n    tablename<span class=\"token punctuation\">,</span>\n    indexname<span class=\"token punctuation\">,</span>\n    idx_scan <span class=\"token keyword\">AS</span> index_scans<span class=\"token punctuation\">,</span>\n    idx_tup_read <span class=\"token keyword\">AS</span> tuples_read<span class=\"token punctuation\">,</span>\n    idx_tup_fetch <span class=\"token keyword\">AS</span> tuples_fetched\n<span class=\"token keyword\">FROM</span> pg_stat_user_indexes\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> idx_scan<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 사용되지 않는 인덱스 찾기</span>\n<span class=\"token keyword\">SELECT</span> \n    schemaname<span class=\"token punctuation\">,</span>\n    tablename<span class=\"token punctuation\">,</span>\n    indexname<span class=\"token punctuation\">,</span>\n    pg_size_pretty<span class=\"token punctuation\">(</span>pg_relation_size<span class=\"token punctuation\">(</span>indexrelid<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> index_size\n<span class=\"token keyword\">FROM</span> pg_stat_user_indexes\n<span class=\"token keyword\">WHERE</span> idx_scan <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> pg_relation_size<span class=\"token punctuation\">(</span>indexrelid<span class=\"token punctuation\">)</span> <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 인덱스 크기 확인</span>\n<span class=\"token keyword\">SELECT</span> \n    tablename<span class=\"token punctuation\">,</span>\n    indexname<span class=\"token punctuation\">,</span>\n    pg_size_pretty<span class=\"token punctuation\">(</span>pg_relation_size<span class=\"token punctuation\">(</span>indexrelid<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> index_size\n<span class=\"token keyword\">FROM</span> pg_indexes\n<span class=\"token keyword\">WHERE</span> schemaname <span class=\"token operator\">=</span> <span class=\"token string\">'public'</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> pg_relation_size<span class=\"token punctuation\">(</span>indexrelid<span class=\"token punctuation\">)</span> <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 인덱스 재구성</span>\nREINDEX <span class=\"token keyword\">INDEX</span> CONCURRENTLY idx_users_email<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 인덱스 통계 업데이트</span>\n<span class=\"token keyword\">ANALYZE</span> users<span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"5-성능-최적화\" style=\"position:relative;\"><a href=\"#5-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94\" aria-label=\"5 성능 최적화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. 성능 최적화</h2>\n<h3 id=\"5-1-쿼리-최적화\" style=\"position:relative;\"><a href=\"#5-1-%EC%BF%BC%EB%A6%AC-%EC%B5%9C%EC%A0%81%ED%99%94\" aria-label=\"5 1 쿼리 최적화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-1. 쿼리 최적화</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- EXPLAIN ANALYZE로 쿼리 계획 확인</span>\n<span class=\"token keyword\">EXPLAIN</span> <span class=\"token keyword\">ANALYZE</span>\n<span class=\"token keyword\">SELECT</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">FROM</span> orders\n<span class=\"token keyword\">WHERE</span> user_id <span class=\"token operator\">=</span> <span class=\"token number\">123</span>\n  <span class=\"token operator\">AND</span> order_date <span class=\"token operator\">>=</span> <span class=\"token string\">'2024-01-01'</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> order_date <span class=\"token keyword\">DESC</span>\n<span class=\"token keyword\">LIMIT</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 인덱스 힌트 (PostgreSQL 12+)</span>\n<span class=\"token keyword\">SET</span> enable_seqscan <span class=\"token operator\">=</span> <span class=\"token keyword\">off</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">-- 순차 스캔 비활성화 (테스트용)</span>\n\n<span class=\"token comment\">-- 통계 정보 업데이트</span>\n<span class=\"token keyword\">ANALYZE</span> orders<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 쿼리 통계 확인</span>\n<span class=\"token keyword\">SELECT</span> \n    query<span class=\"token punctuation\">,</span>\n    calls<span class=\"token punctuation\">,</span>\n    total_exec_time<span class=\"token punctuation\">,</span>\n    mean_exec_time<span class=\"token punctuation\">,</span>\n    max_exec_time\n<span class=\"token keyword\">FROM</span> pg_stat_statements\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> total_exec_time <span class=\"token keyword\">DESC</span>\n<span class=\"token keyword\">LIMIT</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"5-2-연결-풀링\" style=\"position:relative;\"><a href=\"#5-2-%EC%97%B0%EA%B2%B0-%ED%92%80%EB%A7%81\" aria-label=\"5 2 연결 풀링 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-2. 연결 풀링</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 연결 수 제한</span>\n<span class=\"token keyword\">ALTER</span> SYSTEM <span class=\"token keyword\">SET</span> max_connections <span class=\"token operator\">=</span> <span class=\"token number\">200</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 공유 버퍼 크기 조정</span>\n<span class=\"token keyword\">ALTER</span> SYSTEM <span class=\"token keyword\">SET</span> shared_buffers <span class=\"token operator\">=</span> <span class=\"token string\">'256MB'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 작업 메모리 조정</span>\n<span class=\"token keyword\">ALTER</span> SYSTEM <span class=\"token keyword\">SET</span> work_mem <span class=\"token operator\">=</span> <span class=\"token string\">'16MB'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 설정 적용</span>\n<span class=\"token keyword\">SELECT</span> pg_reload_conf<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"5-3-vacuum과-analyze\" style=\"position:relative;\"><a href=\"#5-3-vacuum%EA%B3%BC-analyze\" aria-label=\"5 3 vacuum과 analyze permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-3. VACUUM과 ANALYZE</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 자동 VACUUM 설정</span>\n<span class=\"token keyword\">ALTER</span> <span class=\"token keyword\">TABLE</span> orders <span class=\"token keyword\">SET</span> <span class=\"token punctuation\">(</span>\n    autovacuum_vacuum_scale_factor <span class=\"token operator\">=</span> <span class=\"token number\">0.1</span><span class=\"token punctuation\">,</span>\n    autovacuum_analyze_scale_factor <span class=\"token operator\">=</span> <span class=\"token number\">0.05</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 수동 VACUUM</span>\nVACUUM <span class=\"token keyword\">ANALYZE</span> orders<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 전체 VACUUM (테이블 잠금)</span>\nVACUUM <span class=\"token keyword\">FULL</span> orders<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- VACUUM 통계 확인</span>\n<span class=\"token keyword\">SELECT</span> \n    schemaname<span class=\"token punctuation\">,</span>\n    tablename<span class=\"token punctuation\">,</span>\n    n_dead_tup <span class=\"token keyword\">AS</span> dead_tuples<span class=\"token punctuation\">,</span>\n    last_vacuum<span class=\"token punctuation\">,</span>\n    last_autovacuum<span class=\"token punctuation\">,</span>\n    last_analyze<span class=\"token punctuation\">,</span>\n    last_autoanalyze\n<span class=\"token keyword\">FROM</span> pg_stat_user_tables\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> n_dead_tup <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"6-실전-예제\" style=\"position:relative;\"><a href=\"#6-%EC%8B%A4%EC%A0%84-%EC%98%88%EC%A0%9C\" aria-label=\"6 실전 예제 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. 실전 예제</h2>\n<h3 id=\"6-1-이커머스-데이터베이스-설계\" style=\"position:relative;\"><a href=\"#6-1-%EC%9D%B4%EC%BB%A4%EB%A8%B8%EC%8A%A4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EA%B3%84\" aria-label=\"6 1 이커머스 데이터베이스 설계 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-1. 이커머스 데이터베이스 설계</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 제품 테이블 (JSONB 사용)</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> products <span class=\"token punctuation\">(</span>\n    id <span class=\"token keyword\">SERIAL</span> <span class=\"token keyword\">PRIMARY</span> <span class=\"token keyword\">KEY</span><span class=\"token punctuation\">,</span>\n    name <span class=\"token keyword\">VARCHAR</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    description <span class=\"token keyword\">TEXT</span><span class=\"token punctuation\">,</span>\n    price <span class=\"token keyword\">DECIMAL</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    attributes JSONB<span class=\"token punctuation\">,</span>\n    created_at <span class=\"token keyword\">TIMESTAMP</span> <span class=\"token keyword\">DEFAULT</span> <span class=\"token keyword\">CURRENT_TIMESTAMP</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 제품 속성 인덱스</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_products_attributes_gin <span class=\"token keyword\">ON</span> products <span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>attributes<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_products_price <span class=\"token keyword\">ON</span> products <span class=\"token punctuation\">(</span>price<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 주문 테이블 (파티셔닝)</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> orders <span class=\"token punctuation\">(</span>\n    id <span class=\"token keyword\">SERIAL</span><span class=\"token punctuation\">,</span>\n    user_id <span class=\"token keyword\">INTEGER</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    order_date <span class=\"token keyword\">DATE</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    total_amount <span class=\"token keyword\">DECIMAL</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">status</span> <span class=\"token keyword\">VARCHAR</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    shipping_info JSONB<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">PRIMARY</span> <span class=\"token keyword\">KEY</span> <span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> order_date<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span> <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">BY</span> RANGE <span class=\"token punctuation\">(</span>order_date<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 월별 파티션</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> orders_2024_01 <span class=\"token keyword\">PARTITION</span> <span class=\"token keyword\">OF</span> orders\n    <span class=\"token keyword\">FOR</span> <span class=\"token keyword\">VALUES</span> <span class=\"token keyword\">FROM</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-01-01'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">TO</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2024-02-01'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 주문 검색 (Full-Text Search)</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> order_notes <span class=\"token punctuation\">(</span>\n    id <span class=\"token keyword\">SERIAL</span> <span class=\"token keyword\">PRIMARY</span> <span class=\"token keyword\">KEY</span><span class=\"token punctuation\">,</span>\n    order_id <span class=\"token keyword\">INTEGER</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    note_text <span class=\"token keyword\">TEXT</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n    search_vector tsvector<span class=\"token punctuation\">,</span>\n    created_at <span class=\"token keyword\">TIMESTAMP</span> <span class=\"token keyword\">DEFAULT</span> <span class=\"token keyword\">CURRENT_TIMESTAMP</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">INDEX</span> idx_order_notes_search <span class=\"token keyword\">ON</span> order_notes <span class=\"token keyword\">USING</span> GIN <span class=\"token punctuation\">(</span>search_vector<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 검색 벡터 업데이트 트리거</span>\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TRIGGER</span> update_order_notes_search_vector\n    BEFORE <span class=\"token keyword\">INSERT</span> <span class=\"token operator\">OR</span> <span class=\"token keyword\">UPDATE</span> <span class=\"token keyword\">ON</span> order_notes\n    <span class=\"token keyword\">FOR EACH ROW</span>\n    <span class=\"token keyword\">EXECUTE</span> <span class=\"token keyword\">FUNCTION</span> update_search_vector<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"6-2-복합-쿼리-예제\" style=\"position:relative;\"><a href=\"#6-2-%EB%B3%B5%ED%95%A9-%EC%BF%BC%EB%A6%AC-%EC%98%88%EC%A0%9C\" aria-label=\"6 2 복합 쿼리 예제 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-2. 복합 쿼리 예제</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- JSONB와 Full-Text Search 조합</span>\n<span class=\"token keyword\">SELECT</span> \n    p<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">,</span>\n    p<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">,</span>\n    p<span class=\"token punctuation\">.</span>price<span class=\"token punctuation\">,</span>\n    p<span class=\"token punctuation\">.</span>attributes<span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'brand'</span> <span class=\"token keyword\">AS</span> brand<span class=\"token punctuation\">,</span>\n    ts_rank<span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">.</span>search_vector<span class=\"token punctuation\">,</span> to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'quality'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> rank\n<span class=\"token keyword\">FROM</span> products p\n<span class=\"token keyword\">JOIN</span> order_notes n <span class=\"token keyword\">ON</span> n<span class=\"token punctuation\">.</span>order_id <span class=\"token operator\">IN</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">SELECT</span> id <span class=\"token keyword\">FROM</span> orders <span class=\"token keyword\">WHERE</span> product_id <span class=\"token operator\">=</span> p<span class=\"token punctuation\">.</span>id\n<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">WHERE</span> p<span class=\"token punctuation\">.</span>attributes @<span class=\"token operator\">></span> <span class=\"token string\">'{\"category\": \"electronics\"}'</span>\n  <span class=\"token operator\">AND</span> n<span class=\"token punctuation\">.</span>search_vector @@ to_tsquery<span class=\"token punctuation\">(</span><span class=\"token string\">'english'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'quality'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> rank <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">,</span> p<span class=\"token punctuation\">.</span>price\n<span class=\"token keyword\">LIMIT</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 파티션 프루닝과 인덱스 활용</span>\n<span class=\"token keyword\">SELECT</span> \n    o<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">,</span>\n    o<span class=\"token punctuation\">.</span>total_amount<span class=\"token punctuation\">,</span>\n    o<span class=\"token punctuation\">.</span>shipping_info<span class=\"token operator\">-</span><span class=\"token operator\">>></span><span class=\"token string\">'address'</span> <span class=\"token keyword\">AS</span> address\n<span class=\"token keyword\">FROM</span> orders o\n<span class=\"token keyword\">WHERE</span> o<span class=\"token punctuation\">.</span>order_date <span class=\"token operator\">>=</span> <span class=\"token string\">'2024-01-01'</span>\n  <span class=\"token operator\">AND</span> o<span class=\"token punctuation\">.</span>order_date <span class=\"token operator\">&lt;</span> <span class=\"token string\">'2024-02-01'</span>\n  <span class=\"token operator\">AND</span> o<span class=\"token punctuation\">.</span><span class=\"token keyword\">status</span> <span class=\"token operator\">=</span> <span class=\"token string\">'completed'</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> o<span class=\"token punctuation\">.</span>order_date <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"7-모니터링과-유지보수\" style=\"position:relative;\"><a href=\"#7-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81%EA%B3%BC-%EC%9C%A0%EC%A7%80%EB%B3%B4%EC%88%98\" aria-label=\"7 모니터링과 유지보수 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. 모니터링과 유지보수</h2>\n<h3 id=\"7-1-성능-모니터링\" style=\"position:relative;\"><a href=\"#7-1-%EC%84%B1%EB%8A%A5-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81\" aria-label=\"7 1 성능 모니터링 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-1. 성능 모니터링</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 활성 쿼리 확인</span>\n<span class=\"token keyword\">SELECT</span> \n    pid<span class=\"token punctuation\">,</span>\n    usename<span class=\"token punctuation\">,</span>\n    application_name<span class=\"token punctuation\">,</span>\n    state<span class=\"token punctuation\">,</span>\n    query<span class=\"token punctuation\">,</span>\n    query_start<span class=\"token punctuation\">,</span>\n    state_change\n<span class=\"token keyword\">FROM</span> pg_stat_activity\n<span class=\"token keyword\">WHERE</span> state <span class=\"token operator\">!=</span> <span class=\"token string\">'idle'</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> query_start<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 테이블 통계</span>\n<span class=\"token keyword\">SELECT</span> \n    schemaname<span class=\"token punctuation\">,</span>\n    tablename<span class=\"token punctuation\">,</span>\n    n_live_tup <span class=\"token keyword\">AS</span> live_tuples<span class=\"token punctuation\">,</span>\n    n_dead_tup <span class=\"token keyword\">AS</span> dead_tuples<span class=\"token punctuation\">,</span>\n    last_vacuum<span class=\"token punctuation\">,</span>\n    last_autovacuum<span class=\"token punctuation\">,</span>\n    last_analyze<span class=\"token punctuation\">,</span>\n    last_autoanalyze\n<span class=\"token keyword\">FROM</span> pg_stat_user_tables\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> n_dead_tup <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 인덱스 사용 통계</span>\n<span class=\"token keyword\">SELECT</span> \n    schemaname<span class=\"token punctuation\">,</span>\n    tablename<span class=\"token punctuation\">,</span>\n    indexname<span class=\"token punctuation\">,</span>\n    idx_scan<span class=\"token punctuation\">,</span>\n    idx_tup_read<span class=\"token punctuation\">,</span>\n    idx_tup_fetch\n<span class=\"token keyword\">FROM</span> pg_stat_user_indexes\n<span class=\"token keyword\">WHERE</span> idx_scan <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> pg_relation_size<span class=\"token punctuation\">(</span>indexrelid<span class=\"token punctuation\">)</span> <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"7-2-용량-관리\" style=\"position:relative;\"><a href=\"#7-2-%EC%9A%A9%EB%9F%89-%EA%B4%80%EB%A6%AC\" aria-label=\"7 2 용량 관리 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-2. 용량 관리</h3>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">-- 데이터베이스 크기</span>\n<span class=\"token keyword\">SELECT</span> \n    pg_database<span class=\"token punctuation\">.</span>datname<span class=\"token punctuation\">,</span>\n    pg_size_pretty<span class=\"token punctuation\">(</span>pg_database_size<span class=\"token punctuation\">(</span>pg_database<span class=\"token punctuation\">.</span>datname<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> size\n<span class=\"token keyword\">FROM</span> pg_database\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> pg_database_size<span class=\"token punctuation\">(</span>pg_database<span class=\"token punctuation\">.</span>datname<span class=\"token punctuation\">)</span> <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">-- 테이블 크기</span>\n<span class=\"token keyword\">SELECT</span> \n    schemaname<span class=\"token punctuation\">,</span>\n    tablename<span class=\"token punctuation\">,</span>\n    pg_size_pretty<span class=\"token punctuation\">(</span>pg_total_relation_size<span class=\"token punctuation\">(</span>schemaname<span class=\"token operator\">||</span><span class=\"token string\">'.'</span><span class=\"token operator\">||</span>tablename<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> total_size<span class=\"token punctuation\">,</span>\n    pg_size_pretty<span class=\"token punctuation\">(</span>pg_relation_size<span class=\"token punctuation\">(</span>schemaname<span class=\"token operator\">||</span><span class=\"token string\">'.'</span><span class=\"token operator\">||</span>tablename<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> table_size<span class=\"token punctuation\">,</span>\n    pg_size_pretty<span class=\"token punctuation\">(</span>pg_total_relation_size<span class=\"token punctuation\">(</span>schemaname<span class=\"token operator\">||</span><span class=\"token string\">'.'</span><span class=\"token operator\">||</span>tablename<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> \n                   pg_relation_size<span class=\"token punctuation\">(</span>schemaname<span class=\"token operator\">||</span><span class=\"token string\">'.'</span><span class=\"token operator\">||</span>tablename<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">AS</span> indexes_size\n<span class=\"token keyword\">FROM</span> pg_tables\n<span class=\"token keyword\">WHERE</span> schemaname <span class=\"token operator\">=</span> <span class=\"token string\">'public'</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> pg_total_relation_size<span class=\"token punctuation\">(</span>schemaname<span class=\"token operator\">||</span><span class=\"token string\">'.'</span><span class=\"token operator\">||</span>tablename<span class=\"token punctuation\">)</span> <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"8-결론\" style=\"position:relative;\"><a href=\"#8-%EA%B2%B0%EB%A1%A0\" aria-label=\"8 결론 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. 결론</h2>\n<p>PostgreSQL의 고급 기능들을 적절히 활용하면 강력하고 효율적인 데이터베이스 시스템을 구축할 수 있다. 이 글에서 다룬 내용:</p>\n<ol>\n<li><strong>JSON/JSONB</strong>: 유연한 스키마 데이터 저장 및 검색</li>\n<li><strong>Full-Text Search</strong>: 강력한 텍스트 검색 기능</li>\n<li><strong>파티셔닝</strong>: 대용량 데이터 관리 (Range, List, Hash)</li>\n<li><strong>인덱싱</strong>: B-Tree, GIN, GiST 등 다양한 인덱스 타입</li>\n<li><strong>성능 최적화</strong>: 쿼리 최적화, 연결 풀링, VACUUM</li>\n<li><strong>모니터링</strong>: 성능 및 용량 모니터링</li>\n</ol>\n<p>이러한 기능들을 조합하여 확장 가능하고 성능이 뛰어난 데이터베이스 애플리케이션을 개발할 수 있다.</p>\n<h2 id=\"참고-자료\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\" aria-label=\"참고 자료 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고 자료</h2>\n<ul>\n<li><a href=\"https://www.postgresql.org/docs/\">PostgreSQL 공식 문서</a></li>\n<li><a href=\"https://www.postgresql.org/docs/current/datatype-json.html\">PostgreSQL JSON 문서</a></li>\n<li><a href=\"https://www.postgresql.org/docs/current/textsearch.html\">PostgreSQL Full-Text Search</a></li>\n<li><a href=\"https://www.postgresql.org/docs/current/ddl-partitioning.html\">PostgreSQL Partitioning</a></li>\n</ul>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#postgresql-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5---json-full-text-search-partitioning\">PostgreSQL 고급 기능 - JSON, Full-Text Search, Partitioning</a></p>\n<ul>\n<li>\n<p><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#1-json%EA%B3%BC-jsonb\">1. JSON과 JSONB</a></p>\n<ul>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#1-1-json-%ED%83%80%EC%9E%85-%EA%B8%B0%EB%B3%B8\">1-1. JSON 타입 기본</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#1-2-jsonb-%EC%97%B0%EC%82%B0%EC%9E%90\">1-2. JSONB 연산자</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#1-3-jsonb-%ED%95%A8%EC%88%98\">1-3. JSONB 함수</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#1-4-jsonb-%EC%9D%B8%EB%8D%B1%EC%8B%B1\">1-4. JSONB 인덱싱</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#1-5-jsonb-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8\">1-5. JSONB 업데이트</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#2-full-text-search\">2. Full-Text Search</a></p>\n<ul>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#2-1-%EA%B8%B0%EB%B3%B8-full-text-search\">2-1. 기본 Full-Text Search</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#2-2-gin-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EC%99%80-full-text-search\">2-2. GIN 인덱스와 Full-Text Search</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#2-3-%EA%B3%A0%EA%B8%89-full-text-search\">2-3. 고급 Full-Text Search</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#2-4-full-text-search-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94\">2-4. Full-Text Search 성능 최적화</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#3-%ED%85%8C%EC%9D%B4%EB%B8%94-%ED%8C%8C%ED%8B%B0%EC%85%94%EB%8B%9D\">3. 테이블 파티셔닝</a></p>\n<ul>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#3-1-range-partitioning\">3-1. Range Partitioning</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#3-2-list-partitioning\">3-2. List Partitioning</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#3-3-hash-partitioning\">3-3. Hash Partitioning</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#3-4-%ED%8C%8C%ED%8B%B0%EC%85%98-%EA%B4%80%EB%A6%AC\">3-4. 파티션 관리</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#4-%EC%9D%B8%EB%8D%B1%EC%8B%B1-%EC%A0%84%EB%9E%B5\">4. 인덱싱 전략</a></p>\n<ul>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#4-1-b-tree-%EC%9D%B8%EB%8D%B1%EC%8A%A4\">4-1. B-Tree 인덱스</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#4-2-gin-%EC%9D%B8%EB%8D%B1%EC%8A%A4\">4-2. GIN 인덱스</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#4-3-gist-%EC%9D%B8%EB%8D%B1%EC%8A%A4\">4-3. GiST 인덱스</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#4-4-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%B5%9C%EC%A0%81%ED%99%94\">4-4. 인덱스 최적화</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#5-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94\">5. 성능 최적화</a></p>\n<ul>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#5-1-%EC%BF%BC%EB%A6%AC-%EC%B5%9C%EC%A0%81%ED%99%94\">5-1. 쿼리 최적화</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#5-2-%EC%97%B0%EA%B2%B0-%ED%92%80%EB%A7%81\">5-2. 연결 풀링</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#5-3-vacuum%EA%B3%BC-analyze\">5-3. VACUUM과 ANALYZE</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#6-%EC%8B%A4%EC%A0%84-%EC%98%88%EC%A0%9C\">6. 실전 예제</a></p>\n<ul>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#6-1-%EC%9D%B4%EC%BB%A4%EB%A8%B8%EC%8A%A4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EA%B3%84\">6-1. 이커머스 데이터베이스 설계</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#6-2-%EB%B3%B5%ED%95%A9-%EC%BF%BC%EB%A6%AC-%EC%98%88%EC%A0%9C\">6-2. 복합 쿼리 예제</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#7-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81%EA%B3%BC-%EC%9C%A0%EC%A7%80%EB%B3%B4%EC%88%98\">7. 모니터링과 유지보수</a></p>\n<ul>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#7-1-%EC%84%B1%EB%8A%A5-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81\">7-1. 성능 모니터링</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#7-2-%EC%9A%A9%EB%9F%89-%EA%B4%80%EB%A6%AC\">7-2. 용량 관리</a></li>\n</ul>\n</li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#8-%EA%B2%B0%EB%A1%A0\">8. 결론</a></li>\n<li><a href=\"/etc/PostgreSQL-%EA%B3%A0%EA%B8%89-%EA%B8%B0%EB%8A%A5-JSON-Full-Text-Search-Partitioning/#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\">참고 자료</a></li>\n</ul>\n</li>\n</ul>","wordCount":{"words":224},"fields":{"slug":"/etc/PostgreSQL-고급-기능-JSON-Full-Text-Search-Partitioning/","image":null,"faq":[]},"frontmatter":{"title":"PostgreSQL 고급 기능 - JSON, Full-Text Search, Partitioning","date":"2025년 11월 28일","dateISO":"2025-11-28T00:00:00.000Z","updatedISO":null,"category":"etc","description":"PostgreSQL의 고급 기능들을 실전 예제와 함께 정리합니다. JSON/JSONB 데이터 타입, Full-Text Search, 테이블 파티셔닝, 인덱싱 전략, 성능 최적화까지 모든 것을 다룹니다.","tags":["PostgreSQL","데이터베이스","JSON","Full-Text Search","Partitioning","인덱싱","성능 최적화","SQL"]}}},"pageContext":{"slug":"/etc/PostgreSQL-고급-기능-JSON-Full-Text-Search-Partitioning/","previous":{"fields":{"slug":"/javascript/TypeScript-완전정복-타입-시스템부터-고급-패턴까지/"},"frontmatter":{"title":"TypeScript 완전정복 - 타입 시스템부터 고급 패턴까지","tags":["TypeScript","타입 시스템","제네릭","유틸리티 타입","JavaScript","프론트엔드","웹 개발"]}},"next":{"fields":{"slug":"/etc/OAuth-2.0과-JWT-완전정복-인증-인가-실전-가이드/"},"frontmatter":{"title":"OAuth 2.0과 JWT 완전정복 - 인증/인가 실전 가이드","tags":["OAuth 2.0","JWT","인증","인가","보안","API","웹 개발","백엔드"]}}}},"staticQueryHashes":["213619243","3262363727"]}