<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>리고니</title>
    <link>https://rigun.tistory.com/</link>
    <description>놀러와주신 모든 분들께 항상 행복하길  </description>
    <language>ko</language>
    <pubDate>Sat, 27 Jun 2026 22:45:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>리거니</managingEditor>
    <image>
      <title>리고니</title>
      <url>https://tistory1.daumcdn.net/tistory/4921140/attach/8b11ef5f9a404d8286e94397f029966f</url>
      <link>https://rigun.tistory.com</link>
    </image>
    <item>
      <title>INDEX 생성 시 CONCURRENTLY 옵션</title>
      <link>https://rigun.tistory.com/207</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;그냥&amp;nbsp;일반&amp;nbsp;CREATE&amp;nbsp;INDEX&amp;nbsp;하면&amp;nbsp;테이블에&amp;nbsp;LOCK&amp;nbsp;발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CONCURRENTLY 사용하면 LOCK 없이 인덱스 생성 가능, DROP 도 가능&lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;테이블&amp;nbsp;전체를&amp;nbsp;쭉&amp;nbsp;읽고&amp;nbsp;그&amp;nbsp;사이에&amp;nbsp;변경된&amp;nbsp;데이터에&amp;nbsp;대한&amp;nbsp;변경사항에&amp;nbsp;대한&amp;nbsp;적용을&amp;nbsp;위해&amp;nbsp;한&amp;nbsp;번&amp;nbsp;더&amp;nbsp;읽는다.&lt;br /&gt;그래서&amp;nbsp;순간&amp;nbsp;I/O&amp;nbsp;가&amp;nbsp;증가&lt;br /&gt;디스크&amp;nbsp;I/O&amp;nbsp;가&amp;nbsp;처리하는&amp;nbsp;동안&amp;nbsp;해당&amp;nbsp;프로세스는&amp;nbsp;잠을&amp;nbsp;잔다.(완료되기를&amp;nbsp;대기)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>PostgreSQL</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/207</guid>
      <comments>https://rigun.tistory.com/207#entry207comment</comments>
      <pubDate>Thu, 4 Dec 2025 16:42:16 +0900</pubDate>
    </item>
    <item>
      <title>Hash Join</title>
      <link>https://rigun.tistory.com/206</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;선행&amp;nbsp;테이블에&amp;nbsp;조건을&amp;nbsp;만족하는&amp;nbsp;행을&amp;nbsp;찾아서&amp;nbsp;조인&amp;nbsp;키(컬럼)&amp;nbsp;기준으로&amp;nbsp;hash&amp;nbsp;알고리즘을&amp;nbsp;적용하여&amp;nbsp;hash&amp;nbsp;테이블&amp;nbsp;생성&lt;br /&gt;2.&amp;nbsp;후행&amp;nbsp;테이블도&amp;nbsp;동일하게&amp;nbsp;생성하는데&amp;nbsp;선행&amp;nbsp;테이블의&amp;nbsp;해쉬값과&amp;nbsp;맞는지(등가&amp;nbsp;=)&amp;nbsp;찾음&lt;br /&gt;3.&amp;nbsp;이후&amp;nbsp;JOIN&amp;nbsp;수행&lt;br /&gt;&lt;br /&gt;항상&amp;nbsp;HASH&amp;nbsp;값이&amp;nbsp;같아야&amp;nbsp;조인이&amp;nbsp;수행되므로&amp;nbsp;동등&amp;nbsp;조인에서만&amp;nbsp;사용가능&lt;br /&gt;선행&amp;nbsp;테이블의&amp;nbsp;결과값(ROWS)이&amp;nbsp;작아야&amp;nbsp;유리&lt;br /&gt;CPU,메모리&amp;nbsp;작업&amp;nbsp;위주&amp;nbsp;데이터&amp;nbsp;처리&lt;br /&gt;해쉬&amp;nbsp;함수를&amp;nbsp;이용하여&amp;nbsp;조인을&amp;nbsp;수행하기&amp;nbsp;때문에&amp;nbsp;'='로&amp;nbsp;수행하는&amp;nbsp;조인에서만&amp;nbsp;사용가능&amp;nbsp;합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfmW90/dJMcabWYYVF/zpl9LmepHP1L7Ksv5803FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfmW90/dJMcabWYYVF/zpl9LmepHP1L7Ksv5803FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfmW90/dJMcabWYYVF/zpl9LmepHP1L7Ksv5803FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfmW90%2FdJMcabWYYVF%2Fzpl9LmepHP1L7Ksv5803FK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;701&quot; height=&quot;329&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Database</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/206</guid>
      <comments>https://rigun.tistory.com/206#entry206comment</comments>
      <pubDate>Thu, 4 Dec 2025 16:41:03 +0900</pubDate>
    </item>
    <item>
      <title>Sort Merge Join</title>
      <link>https://rigun.tistory.com/205</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;선행&amp;nbsp;테이블에&amp;nbsp;조건을&amp;nbsp;만족하는&amp;nbsp;행을&amp;nbsp;찾는다&amp;nbsp;후행&amp;nbsp;테이블도&amp;nbsp;동일하게&lt;br /&gt;2.&amp;nbsp;PGA&amp;nbsp;공간에&amp;nbsp;조인컬럼을&amp;nbsp;기준으로&amp;nbsp;정렬을&amp;nbsp;수행&lt;br /&gt;3.&amp;nbsp;이후&amp;nbsp;두&amp;nbsp;테이블을&amp;nbsp;JOIN&amp;nbsp;수행&lt;br /&gt;&lt;br /&gt;해당&amp;nbsp;조인은&amp;nbsp;정렬할&amp;nbsp;데이터가&amp;nbsp;많은경우&amp;nbsp;TEMP&amp;nbsp;영역을&amp;nbsp;사용하기&amp;nbsp;때문에&amp;nbsp;대량&amp;nbsp;조인&amp;nbsp;작업에서는&amp;nbsp;Hash&amp;nbsp;Join이&amp;nbsp;유리&lt;br /&gt;INDEX&amp;nbsp;있으면&amp;nbsp;자동정렬&lt;br /&gt;대부분&amp;nbsp;해시조인인&amp;nbsp;보다&amp;nbsp;느린&amp;nbsp;성능을&amp;nbsp;보이나,&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;상황에서는&amp;nbsp;소트머지&amp;nbsp;조인이&amp;nbsp;유용하다.&lt;br /&gt;&lt;br /&gt;First&amp;nbsp;테이블에&amp;nbsp;소트연산을&amp;nbsp;대체할&amp;nbsp;인덱스가&amp;nbsp;있을&amp;nbsp;때&lt;br /&gt;조인할&amp;nbsp;First&amp;nbsp;집합이&amp;nbsp;이미&amp;nbsp;정렬되어&amp;nbsp;있을&amp;nbsp;때&lt;br /&gt;조인&amp;nbsp;조건식이&amp;nbsp;등차(=)조건이&amp;nbsp;아닐&amp;nbsp;때&lt;br /&gt;&lt;br /&gt;두&amp;nbsp;테이블의&amp;nbsp;사이즈가&amp;nbsp;비슷한경우에&amp;nbsp;유리하며,&amp;nbsp;사이즈&amp;nbsp;차이가&amp;nbsp;큰&amp;nbsp;경우에는&amp;nbsp;불리하고,&amp;nbsp;비효율적인&amp;nbsp;방법이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RfzWD/dJMcaacHDHc/jUPgOcH1G2BWIZUj8tDcb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RfzWD/dJMcaacHDHc/jUPgOcH1G2BWIZUj8tDcb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RfzWD/dJMcaacHDHc/jUPgOcH1G2BWIZUj8tDcb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRfzWD%2FdJMcaacHDHc%2FjUPgOcH1G2BWIZUj8tDcb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;398&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Database</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/205</guid>
      <comments>https://rigun.tistory.com/205#entry205comment</comments>
      <pubDate>Thu, 4 Dec 2025 16:40:07 +0900</pubDate>
    </item>
    <item>
      <title>NL(Nested Loop) Join</title>
      <link>https://rigun.tistory.com/204</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;NL&amp;nbsp;조인은&amp;nbsp;조인컬럼에&amp;nbsp;인덱스를&amp;nbsp;이용하는&amp;nbsp;방식,&amp;nbsp;INDEX&amp;nbsp;SCAN(RANDOM&amp;nbsp;I/O)&amp;nbsp;사용&lt;br /&gt;1.&amp;nbsp;선행&amp;nbsp;테이블을&amp;nbsp;순차적으로&amp;nbsp;읽어&amp;nbsp;조건&amp;nbsp;만족하는&amp;nbsp;행&amp;nbsp;찾음,&amp;nbsp;만족하지&amp;nbsp;않으면&amp;nbsp;필터링&lt;br /&gt;2.&amp;nbsp;그&amp;nbsp;조인키를&amp;nbsp;가지고&amp;nbsp;후행&amp;nbsp;테이블에서&amp;nbsp;접근하여&amp;nbsp;조인키를&amp;nbsp;찾는다&amp;nbsp;조인&amp;nbsp;시도(inner[driven]&amp;nbsp;조인키에&amp;nbsp;인덱스가&amp;nbsp;없으면&amp;nbsp;풀스캔)&lt;br /&gt;3.&amp;nbsp;후행&amp;nbsp;테이블에&amp;nbsp;조인&amp;nbsp;키가&amp;nbsp;없으면&amp;nbsp;필터링&lt;br /&gt;4.&amp;nbsp;있으면&amp;nbsp;추출&amp;nbsp;버퍼에&amp;nbsp;넣음&lt;br /&gt;5.&amp;nbsp;반복&amp;nbsp;수행&lt;br /&gt;&lt;br /&gt;중첩&amp;nbsp;FOR&amp;nbsp;문&amp;nbsp;이라고&amp;nbsp;보면됨.&lt;br /&gt;선행&amp;nbsp;테이블의&amp;nbsp;처리&amp;nbsp;범위(ROW)&amp;nbsp;가&amp;nbsp;성능을&amp;nbsp;결정,&amp;nbsp;양이&amp;nbsp;많지&amp;nbsp;않으면&amp;nbsp;인덱스&amp;nbsp;없이&amp;nbsp;Full&amp;nbsp;Scan해도&amp;nbsp;한번만&amp;nbsp;하면&amp;nbsp;됨.&lt;br /&gt;후행테이블에&amp;nbsp;대해서는&amp;nbsp;반드시&amp;nbsp;인덱스가&amp;nbsp;존재해야&amp;nbsp;NL&amp;nbsp;조인이&amp;nbsp;가능하다.&lt;br /&gt;랜덤&amp;nbsp;엑세스&amp;nbsp;위주라&amp;nbsp;대용량&amp;nbsp;처리&amp;nbsp;시&amp;nbsp;불리함,&lt;br /&gt;유니크&amp;nbsp;인덱스를&amp;nbsp;이용하여&amp;nbsp;소량&amp;nbsp;테이블&amp;nbsp;조인시&amp;nbsp;유리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diobTz/dJMcafd08UP/KChNY1tERjqTeaf8JKInz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diobTz/dJMcafd08UP/KChNY1tERjqTeaf8JKInz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diobTz/dJMcafd08UP/KChNY1tERjqTeaf8JKInz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiobTz%2FdJMcafd08UP%2FKChNY1tERjqTeaf8JKInz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;515&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Database</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/204</guid>
      <comments>https://rigun.tistory.com/204#entry204comment</comments>
      <pubDate>Thu, 4 Dec 2025 16:39:37 +0900</pubDate>
    </item>
    <item>
      <title>배치 I/O</title>
      <link>https://rigun.tistory.com/203</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를&amp;nbsp;통한&amp;nbsp;Table&amp;nbsp;Random&amp;nbsp;Access는&amp;nbsp;Single&amp;nbsp;Block&amp;nbsp;I/O으로&amp;nbsp;작동하기에&amp;nbsp;엄청난&amp;nbsp;부하를&amp;nbsp;유발하는데,&amp;nbsp;심지어&amp;nbsp;버퍼&amp;nbsp;캐시&amp;nbsp;경유&amp;nbsp;비용&amp;nbsp;+&amp;nbsp;래치&amp;nbsp;경합까지&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있어&amp;nbsp;로우가&amp;nbsp;많아&amp;nbsp;질수록&amp;nbsp;각종&amp;nbsp;Wait&amp;nbsp;Event가&amp;nbsp;발생해&amp;nbsp;성능이&amp;nbsp;급격히&amp;nbsp;저하되었다.&lt;br /&gt;-&amp;gt;&amp;nbsp;실행계획&amp;nbsp;:&amp;nbsp;TABLE&amp;nbsp;ACCESS&amp;nbsp;BY&amp;nbsp;INDEX&amp;nbsp;ROWID&amp;nbsp;BATCHED&lt;br /&gt;-&amp;gt;&amp;nbsp;위&amp;nbsp;성능&amp;nbsp;개선을&amp;nbsp;위해&amp;nbsp;12c&amp;nbsp;부터&amp;nbsp;batch&amp;nbsp;I/O&amp;nbsp;추가&lt;br /&gt;&lt;br /&gt;BATCH&amp;nbsp;I/O&lt;br /&gt;1.&amp;nbsp;인덱스를&amp;nbsp;통해&amp;nbsp;버퍼&amp;nbsp;캐시에서&amp;nbsp;찾지&amp;nbsp;못하면&amp;nbsp;DISK&amp;nbsp;I/O(TABLE&amp;nbsp;SCAN)&amp;nbsp;했던&amp;nbsp;SINGLE&amp;nbsp;I/O&amp;nbsp;방식이&amp;nbsp;아니라&lt;br /&gt;2.&amp;nbsp;DISK&amp;nbsp;I/O&amp;nbsp;를&amp;nbsp;잠시&amp;nbsp;미루고&amp;nbsp;일정량&amp;nbsp;모은&amp;nbsp;뒤&amp;nbsp;일괄&amp;nbsp;처리&amp;nbsp;방식&lt;br /&gt;*&amp;nbsp;ROWID&amp;nbsp;로&amp;nbsp;버퍼&amp;nbsp;캐시&amp;nbsp;조회&amp;nbsp;-&amp;gt;&amp;nbsp;실패&amp;nbsp;시&amp;nbsp;ROWID&amp;nbsp;저장&lt;br /&gt;*&amp;nbsp;위&amp;nbsp;과정&amp;nbsp;반복하여&amp;nbsp;ROWID&amp;nbsp;일정량&amp;nbsp;저장&amp;nbsp;후&amp;nbsp;블록&amp;nbsp;번호&amp;nbsp;정렬하여&amp;nbsp;Multi&amp;nbsp;Block&amp;nbsp;I/O&amp;nbsp;수행&lt;br /&gt;*&amp;nbsp;다만&amp;nbsp;위&amp;nbsp;방식은&amp;nbsp;정렬이&amp;nbsp;되지&amp;nbsp;않음.&lt;/p&gt;</description>
      <category>Database</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/203</guid>
      <comments>https://rigun.tistory.com/203#entry203comment</comments>
      <pubDate>Thu, 4 Dec 2025 16:38:44 +0900</pubDate>
    </item>
    <item>
      <title>부분범위 처리</title>
      <link>https://rigun.tistory.com/202</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;PostgreSQL에서&amp;nbsp;&amp;ldquo;부분&amp;nbsp;범위&amp;nbsp;처리&amp;rdquo;를&amp;nbsp;잘&amp;nbsp;하려면&lt;br /&gt;WHERE + ORDER BY + LIMIT를 인덱스 구조와 일치시키는 방식 사용 유도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 상위 N개만 읽고 스캔을 멈출 수 있어 성능 향상&lt;br /&gt;-&amp;gt;&amp;nbsp;테이블&amp;nbsp;전체를&amp;nbsp;읽지&amp;nbsp;않고,&amp;nbsp;인덱스&amp;nbsp;풀&amp;nbsp;스캔도&amp;nbsp;하지않고,&amp;nbsp;인덱스&amp;nbsp;자체로&amp;nbsp;정렬되어&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;정렬된&amp;nbsp;엔트리를&amp;nbsp;위에서&amp;nbsp;순차적으로&amp;nbsp;20건만&amp;nbsp;스캔하고&amp;nbsp;끝남&lt;br /&gt;&lt;br /&gt;Oracle&amp;nbsp;은&amp;nbsp;자동으로&amp;nbsp;범위처리가&amp;nbsp;된다고함&amp;nbsp;;;&lt;br /&gt;&lt;br /&gt;인덱스가&amp;nbsp;없거나,&amp;nbsp;ORDER&amp;nbsp;BY랑&amp;nbsp;안&amp;nbsp;맞는&amp;nbsp;경우&amp;nbsp;모든&amp;nbsp;row&amp;nbsp;스캔&amp;nbsp;후&amp;nbsp;정렬이&amp;nbsp;필요한&amp;nbsp;컬럼&amp;nbsp;기준으로&amp;nbsp;전체&amp;nbsp;정렬&lt;br /&gt;-&amp;gt;&amp;nbsp;이러면&amp;nbsp;최종&amp;nbsp;출력&amp;nbsp;수&amp;nbsp;는&amp;nbsp;소량이지만&amp;nbsp;작업은&amp;nbsp;전체&amp;nbsp;대상임&lt;/p&gt;</description>
      <category>Database</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/202</guid>
      <comments>https://rigun.tistory.com/202#entry202comment</comments>
      <pubDate>Thu, 4 Dec 2025 16:38:11 +0900</pubDate>
    </item>
    <item>
      <title>다중 컬럼 인덱스(복합 인덱스)</title>
      <link>https://rigun.tistory.com/201</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;선두&amp;nbsp;컬럼부터&amp;nbsp;연속해서&amp;nbsp;조건/정렬을&amp;nbsp;사용해야&amp;nbsp;효율적&lt;br /&gt;선두&amp;nbsp;컬럼을&amp;nbsp;건너뛰고&amp;nbsp;그&amp;nbsp;뒤에&amp;nbsp;있는&amp;nbsp;컬럼만으로는&amp;nbsp;인덱스를&amp;nbsp;제대로&amp;nbsp;못탐&lt;br /&gt;선두&amp;nbsp;컬럼에는&amp;nbsp;=(동등&amp;nbsp;조건),&amp;nbsp;뒤에는&amp;nbsp;범위&amp;nbsp;조건(LIKE,&amp;nbsp;BETWEEN)&amp;nbsp;이&amp;nbsp;베스트&lt;br /&gt;조건절에&amp;nbsp;선두&amp;nbsp;컬럼이&amp;nbsp;없으면,&amp;nbsp;옵티마이저가&amp;nbsp;TABLE&amp;nbsp;FULL&amp;nbsp;SCAN&amp;nbsp;혹은&amp;nbsp;INDEX&amp;nbsp;FULL&amp;nbsp;SCAN(데이터가&amp;nbsp;적으면)&amp;nbsp;으로&amp;nbsp;유도한다&lt;br /&gt;&lt;br /&gt;인덱스&amp;nbsp;컬럼에&amp;nbsp;함수/표현식&amp;nbsp;씌워서&amp;nbsp;인덱스를&amp;nbsp;못&amp;nbsp;타는&amp;nbsp;경우&amp;nbsp;많음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스&amp;nbsp;컬럼을&amp;nbsp;WHERE&amp;nbsp;,&amp;nbsp;ORDER&amp;nbsp;BY,&amp;nbsp;GROUP&amp;nbsp;BY&amp;nbsp;에&amp;nbsp;사용&amp;nbsp;되어야&amp;nbsp;함&lt;br /&gt;그리고&amp;nbsp;인덱스에&amp;nbsp;포함되지&amp;nbsp;않는&amp;nbsp;컬럼이&amp;nbsp;들어오면(SELECT)&amp;nbsp;TABLE&amp;nbsp;HEAP&amp;nbsp;스캔&amp;nbsp;발생&lt;/p&gt;</description>
      <category>Database</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/201</guid>
      <comments>https://rigun.tistory.com/201#entry201comment</comments>
      <pubDate>Thu, 4 Dec 2025 16:37:18 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] 관리 및 성능 모니터링 SQL</title>
      <link>https://rigun.tistory.com/200</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;세션 관련 SQL&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;세션 수&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select count(*) from pg_stat_activity ;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Active 세션 정보&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT datname, usename, state, query
FROM pg_stat_activity
WHERE state = 'active';&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;idle 세션 정보&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT datname, usename, state, query
FROM pg_stat_activity
WHERE state = 'idle';&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;특정 사용자 세션 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT datname, usename, state, query
FROM pg_stat_activity
WHERE username = '';&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;현재 실행 중인 쿼리 중단&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT pg_cancel_backend(PID);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;현재 세션을 강제 종료&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT pg_terminate_backend(PID);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;최근 1일 동안 접속한 세션 정보 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
    pid,                           -- 프로세스 ID
    usename,                       -- 사용자 이름
    client_addr,                   -- 클라이언트의 IP 주소
    client_port,                   -- 클라이언트의 포트 번호
    backend_start,                 -- 백엔드 프로세스 시작 시간
    state,                         -- 세션 상태 (예: active, idle 등)
    query                          -- 현재 실행 중인 쿼리
FROM
    pg_stat_activity               -- PostgreSQL의 시스템 뷰
WHERE
    backend_start &amp;gt;= current_timestamp - INTERVAL '1 day'
   				   -- 최근 1일 동안의 세션만 필터링
ORDER BY
    backend_start DESC;            -- 세션 시작 시간 기준 내림차순으로 정렬&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;성능지표&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1분 이상 실행되는 쿼리&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
    current_timestamp - query_start AS runtime,
    datname, usename, query
FROM pg_stat_activity
WHERE state = 'active'
      AND current_timestamp - query_start &amp;gt; '1 min'
ORDER BY 1 DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;LONG 실행 쿼리 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT current_timestamp - query_start AS runtime,datname, usename, query
FROM pg_stat_activity
WHERE state = 'active' ORDER BY 1 DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자주 호출되는 SQL 분석&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT query FROM pg_stat_statements ORDER BY calls DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;캐시 적중률&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
  d.datname,
  u.usename,
  round(100.*sd.blks_hit/(sd.blks_read+sd.blks_hit), 2) AS dhitratio
FROM pg_stat_database sd
JOIN pg_database d ON (d.oid=sd.datid)
JOIN pg_user u ON (u.usesysid=d.datdba)
WHERE sd.blks_read+sd.blks_hit&amp;lt;&amp;gt;0;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;커밋 적중률&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
  d.datname,
  u.usename,
  round(100.*sd.xact_commit/(sd.xact_commit+sd.xact_rollback), 2) AS dcommitratio
FROM pg_stat_database sd
JOIN pg_database d ON (d.oid=sd.datid)
JOIN pg_user u ON (u.usesysid=d.datdba)
WHERE sd.xact_commit+sd.xact_rollback&amp;lt;&amp;gt;0;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;LOCK TABLE 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select locktype, relation::regclass, mode, transactionid tid, pid, granted
from pg_catalog.pg_locks
where not pid = pg_backend_pid() and relation::regclass::text not like 'pg%';&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;서버 상태 정보&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
    buffers_alloc, -- 할당된 버퍼 수 
    maxwritten_clean, -- 백그라운드 프로세스가 디스크에 기록한 최대 버퍼 수
    buffers_backend, -- 백엔드 프로세스에서 사용한 버퍼 수
    buffers_alloc / (SELECT count(*) FROM pg_stat_bgwriter) AS buffer_ratio
FROM
    pg_stat_bgwriter;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;디스크 I/O 성능 분석&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
    relname,
    heap_blks_read,
    heap_blks_hit,
    idx_blks_read,
    idx_blks_hit,
    toast_blks_read,
    toast_blks_hit
FROM
    pg_statio_user_tables
ORDER BY
    heap_blks_read DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;테이블 오브젝트&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;db 별 사용량 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스키마별 사용량 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT schema_name, pg_size_pretty(sum(table_size)::bigint) as &quot;disk space&quot;, 
        (sum(table_size) / pg_database_size(current_database())) * 100 as &quot;percent&quot; 
        FROM (SELECT pg_catalog.pg_namespace.nspname as schema_name, pg_relation_size(pg_catalog.pg_class.oid) as table_size 
        FROM pg_catalog.pg_class JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid ) t 
        GROUP BY schema_name ORDER BY schema_name;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스키마별 테이블 사용량 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) FROM pg_tables where schemaname not in ('information_schema', 'pg_catalog');&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스키마별 row 건 수&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT 'SELECT ''' || schemaname || '.' || tablename || ''' as tablename, count(*) FROM ' || schemaname || '.' || tablename|| ' union all' FROM pg_tables where schemaname not in ('information_schema', 'pg_catalog');&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인덱스 건 수&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT * FROM pg_indexes WHERE schemaname not in ('pg_catalog');&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인덱스 통계 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
    relname AS table_name,
    indexrelname AS index_name,
    idx_scan AS number_of_scans, -- 스캔 횟수
    idx_tup_read AS tuples_read, -- 읽은 튜플 수
    idx_tup_fetch AS tuples_fetched -- 가져온 튜플 수
FROM
    pg_stat_user_indexes
JOIN
    pg_index ON pg_stat_user_indexes.indexrelid = pg_index.indexrelid
WHERE
    pg_stat_user_indexes.schemaname = 'public'  -- 원하는 스키마로 변경 가능
ORDER BY
    number_of_scans DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스키마별 PK,FK 건 수&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select constraint_schema, constraint_type , count(*)
        from information_schema.table_constraints 
        where constraint_schema in('experdba')
        and constraint_type in ('FOREIGN KEY','PRIMARY KEY')
        group by constraint_schema,constraint_type 
        ORDER BY constraint_schema, constraint_type ;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;VIEW 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
    schemaname,
    viewname,
    definition
FROM
    pg_views
WHERE
    schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY
    schemaname, viewname;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;시퀀스 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select * from pg_catalog.pg_sequences;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;테이블 스페이스 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select * from pg_catalog.pg_tablespace ;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;role 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select * from pg_catalog.pg_roles where rolname not like 'pg_%';&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;user 별 권한 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
    usename,
    usecreatedb,
    usesuper,
    userepl,
    usebypassrls
FROM
    pg_user;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;user 별 테이블 권한 조회&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT
    grantee,
    table_name,
    privilege_type
FROM
    information_schema.role_table_grants
WHERE
    table_name = '';&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기타&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DBMS 가동시간&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select pg_postmaster_start_time();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DB 포트&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;show port;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DB 버전&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select version();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;데이터 경로&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;show data_directory;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;로그 경로&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;show log_directory;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용가능한 extension 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select * from pg_available_extensions ;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;현재 시간&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select now();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;현재 WAL 로그 파일(LSN) 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select pg_current_wal_lsn();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;아카이브 상태 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;select *  from pg_stat_archiver ;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;vacuum 로그 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SELECT relname, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze FROM pg_stat_user_tab&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>PostgreSQL</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/200</guid>
      <comments>https://rigun.tistory.com/200#entry200comment</comments>
      <pubDate>Tue, 25 Nov 2025 09:47:59 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] psql 명령어</title>
      <link>https://rigun.tistory.com/198</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;PostgreSQL의&lt;span&gt;&amp;nbsp;&lt;/span&gt;psql&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령줄 도구에서 사용할 수 있는 백슬래시(\) 명령어들의 전체 목록에 대한 설명입니다.&lt;br /&gt;각 명령은 다양한 작업을 손쉽게 수행할 수 있게 도와주는 유용한 도구일 것 같습니다&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;몇 가지 자주 쓰이는 걸 요약하자면:&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 id=&quot;mag-정보-조회-관련&quot; style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;정보 조회 관련&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\d&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 테이블, 뷰, 시퀀스 등 목록 보기&lt;/li&gt;
&lt;li&gt;\dt&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 테이블만 보기&lt;/li&gt;
&lt;li&gt;\dv&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 뷰만 보기&lt;/li&gt;
&lt;li&gt;\di&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 인덱스 목록 보기&lt;/li&gt;
&lt;li&gt;\df&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 함수 목록 보기&lt;/li&gt;
&lt;li&gt;\l&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 데이터베이스 목록 보기&lt;/li&gt;
&lt;li&gt;\du&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 역할(사용자) 목록 보기&lt;/li&gt;
&lt;li&gt;\x&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; Expanded 모드 전환 (복잡한 결과 보기 좋음)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 id=&quot;test_tube-쿼리-실행-관련&quot; style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;쿼리 실행 관련&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\g&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 현재 쿼리 실행&lt;/li&gt;
&lt;li&gt;\gx&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; Expanded 모드로 쿼리 실행&lt;/li&gt;
&lt;li&gt;\gexec&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 쿼리 결과를 다시 쿼리로 실행&lt;/li&gt;
&lt;li&gt;\gset&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 쿼리 결과를 변수로 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 id=&quot;toolbox-버퍼-파일&quot; style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;버퍼 &amp;amp; 파일&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\e&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 쿼리를 외부 편집기로 열기&lt;/li&gt;
&lt;li&gt;\p&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 현재 쿼리 버퍼 내용 보기&lt;/li&gt;
&lt;li&gt;\r&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 쿼리 버퍼 초기화&lt;/li&gt;
&lt;li&gt;\w&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 쿼리 버퍼를 파일로 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 id=&quot;open_file_folder-입출력&quot; style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;입출력&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\copy&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 로컬에서 파일로 복사&lt;/li&gt;
&lt;li&gt;\i&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; SQL 스크립트 실행&lt;/li&gt;
&lt;li&gt;\o&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 결과를 파일 또는 파이프로 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 id=&quot;arrows_counterclockwise-연결&quot; style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;연결&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\c&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 데이터베이스 연결 변경&lt;/li&gt;
&lt;li&gt;\conninfo&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 현재 연결 정보 보기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 id=&quot;clock1-타이밍-반복&quot; style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;타이밍 &amp;amp; 반복&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\timing&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 쿼리 실행 시간 측정&lt;/li&gt;
&lt;li&gt;\watch [초]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 쿼리를 주기적으로 실행 (ex. 모니터링용)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PostgreSQL</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/198</guid>
      <comments>https://rigun.tistory.com/198#entry198comment</comments>
      <pubDate>Tue, 25 Nov 2025 09:46:35 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] 패스워드 정책 설정 및 비교</title>
      <link>https://rigun.tistory.com/197</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 계정 또는 패스워드 정책 수립시&lt;br /&gt;PostgreSQL은 기본적인 설정 기능을 제공하지 않기 때문에 추가 설정이 필요합니다.&lt;br /&gt;PostgreSQL 패스워드 정책 관련 모듈은 크게 passwordcheck 및 credcheck 가 있습니다.&lt;br /&gt;아래에서는 각 모듈들에 대한 설치과정과 기능 및 장단점을 비교하여 설명합니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;01. 설치과정&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(1) PasswordCheck&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;1. 해당 모듈은 사용자 비밀번호 정책에 대한 기능을 가짐
2. PostgreSQL 설치 시 기본적으로 해당 라이브러리를 제공&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;1. shared_preload_libraries = 'passwordcheck' 추가
2. 서버 재기동&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(2) CredCheck&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;1. 해당 모듈은 사용자 계정 관련 정책을 포함하여 passwordcheck 보다 정책이 다양함
2. Tarandb 구성 시 제공하는 RPM 패키지가 있기 때문에 설치가 유용함&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;1. dnf install -y 04.tarandb_rhel_rpms_v16/490.credcheck_rpm/*.rpm
2. shared_preload_libraries = 'credcheck' 추가
3. 서버 재기동
4. create extension credcheck with schema public;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;02. 기능&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(1) PasswordCheck&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;1. 8자리 이상 사용
postgres=# create user test login password 'abcdefg';
ERROR:  password is too short

2. 숫자,문자 혼용 사용
postgres=# create user test login password 'abcdefgh';
ERROR:  password must contain both letters and nonletters

3. 유저명과 같거나 유저명을 포함하는 패스워드 사용 불가
postgres=# create user test login password 'test1234';
ERROR:  password must not contain user name&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(2) CredCheck&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;css&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;1. 유저명 관련 정책
credcheck.username_min_length 최소 길이
credcheck.username_min_special 특수문자 최소 개수
credcheck.username_min_digit 최소 숫자
credcheck.username_min_upper,lower 대,소문자의 최소 개수
credcheck.username_min_repeat 반복되는 문자 최대 허용 횟수
credcheck.username_contain_password 사용자 이름에 비밀번호 미포함 여부
credcheck.username_contain 사용자 이름에 반드시 포함되어야 하는 문자 포함 여부

2. 비밀번호 복잡도 설정
credcheck.password_min_length   최소 길이
credcheck.password_min_special  특수문자 최소 개수
credcheck.password_min_digit 최소 숫자
credcheck.password_min_upper,lower 대,소문자의 최소 개수
credcheck.password_min_repeat 반복되는 문자 최대 허용 횟수
credcheck.password_contain_username  패스워드에 비밀번호 미포함 여부
credcheck.password_contain 패스워드에 반드시 포함되어야 하는 문자 포함 여부 
credcheck.password_not_contain 패스워드에 반드시 포함되지 않아야 하는 문자 포함 여부 
credcheck.max_auth_failure 비밀번호 실패 횟수 제한

3. 비밀번호 유효기간
credcheck.password_valid_until 비밀번호 유효 기간(최소 일수) 설정
credcheck.password_valid_max  비밀번호 유효 기간(만료일) 설정

4. 비밀번호 재사용 방지 설정
credcheck.password_reuse_history  비밀번호 재사용 불가능한 비밀번호 개수 
credcheck.password_reuse_interval 비밀번호 재사용 가능한 일

5. superuser 차단 금지 설정 
credcheck.reset_superuser 로그인 실패 횟수 초과로 잠김 계정 초기화

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;03. 기본 파라미터&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;SQL&amp;gt; select name, setting from pg_settings where name like 'credcheck%';
                 name                 | setting
--------------------------------------+---------
 credcheck.auth_delay_ms              | 0
 credcheck.auth_failure_cache_size    | 1024
 credcheck.encrypted_password_allowed | off
 credcheck.history_max_size           | 65535
 credcheck.max_auth_failure           | 0
 credcheck.no_password_logging        | on
 credcheck.password_contain           |
 credcheck.password_contain_username  | on
 credcheck.password_ignore_case       | off
 credcheck.password_min_digit         | 0
 credcheck.password_min_length        | 1
 credcheck.password_min_lower         | 0
 credcheck.password_min_repeat        | 0
 credcheck.password_min_special       | 0
 credcheck.password_min_upper         | 0
 credcheck.password_not_contain       |
 credcheck.password_reuse_history     | 0
 credcheck.password_reuse_interval    | 0
 credcheck.password_valid_max         | 0
 credcheck.password_valid_until       | 0
 credcheck.reset_superuser            | off
 credcheck.username_contain           |
 credcheck.username_contain_password  | on
 credcheck.username_ignore_case       | off
 credcheck.username_min_digit         | 0
 credcheck.username_min_length        | 1
 credcheck.username_min_lower         | 0
 credcheck.username_min_repeat        | 0
 credcheck.username_min_special       | 0
 credcheck.username_min_upper         | 0
 credcheck.username_not_contain       |
 credcheck.whitelist                  |
(32 rows)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;04. 파라미터 설정&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;1. ALTER SYSTEM (시스템 전체 적용)
SQL&amp;gt; ALTER SYSTEM SET credcheck.username_min_length = 5;
ALTER SYSTEM

[tarandb@tdb-db1:/home/tarandb]
$ pg_ctl reload;
server signaled

SQL&amp;gt; SHOW credcheck.username_min_length;
 credcheck.username_min_length
-------------------------------
 5
(1 row)


2. SET (해당 세션에만 일시적으로 적용)
SQL&amp;gt; SET credcheck.username_min_length = 4;
SET

SQL&amp;gt; SHOW credcheck.username_min_length;
 credcheck.username_min_length
-------------------------------
 4
(1 row)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;05. 장단점&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(1) PasswordCheck&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;1. 패키지 및 extension 설치 필요없이 사용 가능
2. 패스워드 관련 정책 설정 기능이 단순함 &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;(2) CredCheck&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot;&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #fafafa; color: #383a42;&quot;&gt;&lt;code&gt;1. 유저명, 패스워드, 유효기간 등을 통해 보안정책 수립 용이
2. 계정별 정책 수립 및 관리 필요
3. 로그인 실패 횟수 초과로 잠길경우 계정 초기화 필요&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;06. 참고자료&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #32373f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/HexaCluster/credcheck#readme&quot;&gt;https://github.com/HexaCluster/credcheck#readme&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.postgresql.org/docs/current/passwordcheck.html&quot;&gt;https://www.postgresql.org/docs/current/passwordcheck.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>PostgreSQL</category>
      <author>리거니</author>
      <guid isPermaLink="true">https://rigun.tistory.com/197</guid>
      <comments>https://rigun.tistory.com/197#entry197comment</comments>
      <pubDate>Tue, 25 Nov 2025 09:45:19 +0900</pubDate>
    </item>
  </channel>
</rss>