<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dbstudy</id>
	<title>DB스터디 - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dbstudy"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/Dbstudy"/>
	<updated>2026-09-21T23:43:18Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EB%8C%80%EB%AC%B8&amp;diff=1907</id>
		<title>대문</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EB%8C%80%EB%AC%B8&amp;diff=1907"/>
		<updated>2026-09-16T09:02:38Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 오라클 LOB 원리와구조 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__notoc__&lt;br /&gt;
https://dbstudy.co.kr/w/resources/assets/dbstudy_iconx1.png &lt;br /&gt;
= Welcome To DB STUDY - {{CURRENTYEAR}}.{{CURRENTMONTHNAME}}.{{CURRENTDAY}}({{CURRENTDAYNAME}}) =&lt;br /&gt;
= 전문가가 되고 싶다면 기본에 충실 하라. (Return To Basics) =&lt;br /&gt;
* {{SERVER}}&lt;br /&gt;
* 게시글 총 : {{NUMBEROFPAGES}} 건 , 사용자 : {{NUMBEROFUSERS}} 명 , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p sizes=&amp;quot;(max-width: 600px) 480px,800px&amp;quot;&amp;gt;&lt;br /&gt;
https://dbstudy.co.kr/w/images/dbstudy_logo.jpg&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
{{틀:타이틀 라운드&lt;br /&gt;
|제목=[[:Category:oracle|오라클]]: {{PAGESINCATEGORY: oracle}} 건 ,  [[:Category:postgresql|PostgreSql]] : {{PAGESINCATEGORY: postgresql}} 건 ,  [[:Category:mysql|MySQL]]: {{PAGESINCATEGORY: mysql}} 건,  [[:Category:linux|LINUX]]: {{PAGESINCATEGORY: linux}} 건&lt;br /&gt;
|아이콘=emoji_objects&lt;br /&gt;
}}&lt;br /&gt;
----&lt;br /&gt;
= 최근 등록/수정글 =&lt;br /&gt;
{{Special:RecentChanges|days=50}}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= ORACLE =&lt;br /&gt;
== [[ORACLE SQL 튜닝]] ==&lt;br /&gt;
=== [[튜닝 개론]]===&lt;br /&gt;
:::# [[카디널리티 와 셀렉티비티|카디널리티(cardinality) 와 셀렉티비티(선택도,selectivity)]]&lt;br /&gt;
:::# [[성능을 고려한 설계]]&lt;br /&gt;
:::# [[효율적인 SQL 작성법]]&lt;br /&gt;
&lt;br /&gt;
=== [[튜닝 환경 구축]] ===&lt;br /&gt;
:::# [[DBMS_XPLAN 사용법]]&lt;br /&gt;
:::# [[REAL PLAN 사용법]]&lt;br /&gt;
:::# [[SQL 트레이스 방법]]&lt;br /&gt;
&lt;br /&gt;
=== [[인덱스 설계]] ===&lt;br /&gt;
:::# [[인덱스 아키텍처]]&lt;br /&gt;
:::# [[오라클 인덱스 종류|인덱스 종류]]&lt;br /&gt;
:::# [[엑세스 패스]]&lt;br /&gt;
&lt;br /&gt;
=== [[옵티마이져]] ===&lt;br /&gt;
==== [[JPPD(Join Predicate PushDown,조인절 PUSHDOWN)]]====&lt;br /&gt;
==== [[View pushed predicate (조건절 PUSHDOWN)]]====&lt;br /&gt;
&lt;br /&gt;
=== [[튜닝 힌트]] ===&lt;br /&gt;
:::# [[튜닝 힌트 no merge|NO_MERGE 힌트]]&lt;br /&gt;
&lt;br /&gt;
=== [[대용량 데이터 튜닝]] ===&lt;br /&gt;
==== [[병렬 쿼리 튜닝]] ====&lt;br /&gt;
=== [[ORACLE 튜닝 대상 조회]] ===&lt;br /&gt;
=== [[성능 문제 식별 방법론과 튜닝 접근법]]===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== [[ORACLE 아키텍쳐의 이해]] ==&lt;br /&gt;
=== [[테이블 조인 방식|오라클 조인 과 알고리즘 ]] ===&lt;br /&gt;
==== [[NL 조인]]====&lt;br /&gt;
==== [[HASH 조인]]====&lt;br /&gt;
==== [[MERGE 조인|SORT MERGE 조인]]====&lt;br /&gt;
==== [[세미조인]] ====&lt;br /&gt;
==== [[안티조인]] ====&lt;br /&gt;
=== [[파라미터 설계]] ===&lt;br /&gt;
=== [[오라클 테이블의 구조]]===&lt;br /&gt;
==== [[ORACLE LOB|오라클 LOB 원리와튜닝]] ====&lt;br /&gt;
&lt;br /&gt;
=== [[오라클 파티션테이블의 구조]] ===&lt;br /&gt;
=== [[데이터 블럭의 구조]] ===&lt;br /&gt;
=== [[오라클 컬럼의 구조]] ===&lt;br /&gt;
==== [[오라클 컬럼의 저장순서]] ====&lt;br /&gt;
==== [[컬럼의 순서가 변경시 ROW의 물리적 구조변화|컬럼 순서 변경시 ROW의 물리구조 변화]]====&lt;br /&gt;
==== [[오라클 컬럼저장 방식 개선 (12c 업그레이드) ]] ====&lt;br /&gt;
=== [[오라클 인덱스의 구조]] ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= [[DBA_수행_방법론_(공공/대기업_SI_프로젝트)]]=&lt;br /&gt;
== [[DBA_수행_방법론_(공공/대기업_SI_프로젝트)#개요|개요]] ==&lt;br /&gt;
== [[단계별 수행 방법론]] ==&lt;br /&gt;
=== [[분석 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
=== [[설계 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
=== [[구축 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
=== [[테스트 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
=== [[전개 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EB%8C%80%EB%AC%B8&amp;diff=1906</id>
		<title>대문</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EB%8C%80%EB%AC%B8&amp;diff=1906"/>
		<updated>2026-09-16T09:02:19Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 오라클 테이블의 구조 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__notoc__&lt;br /&gt;
https://dbstudy.co.kr/w/resources/assets/dbstudy_iconx1.png &lt;br /&gt;
= Welcome To DB STUDY - {{CURRENTYEAR}}.{{CURRENTMONTHNAME}}.{{CURRENTDAY}}({{CURRENTDAYNAME}}) =&lt;br /&gt;
= 전문가가 되고 싶다면 기본에 충실 하라. (Return To Basics) =&lt;br /&gt;
* {{SERVER}}&lt;br /&gt;
* 게시글 총 : {{NUMBEROFPAGES}} 건 , 사용자 : {{NUMBEROFUSERS}} 명 , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p sizes=&amp;quot;(max-width: 600px) 480px,800px&amp;quot;&amp;gt;&lt;br /&gt;
https://dbstudy.co.kr/w/images/dbstudy_logo.jpg&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
{{틀:타이틀 라운드&lt;br /&gt;
|제목=[[:Category:oracle|오라클]]: {{PAGESINCATEGORY: oracle}} 건 ,  [[:Category:postgresql|PostgreSql]] : {{PAGESINCATEGORY: postgresql}} 건 ,  [[:Category:mysql|MySQL]]: {{PAGESINCATEGORY: mysql}} 건,  [[:Category:linux|LINUX]]: {{PAGESINCATEGORY: linux}} 건&lt;br /&gt;
|아이콘=emoji_objects&lt;br /&gt;
}}&lt;br /&gt;
----&lt;br /&gt;
= 최근 등록/수정글 =&lt;br /&gt;
{{Special:RecentChanges|days=50}}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= ORACLE =&lt;br /&gt;
== [[ORACLE SQL 튜닝]] ==&lt;br /&gt;
=== [[튜닝 개론]]===&lt;br /&gt;
:::# [[카디널리티 와 셀렉티비티|카디널리티(cardinality) 와 셀렉티비티(선택도,selectivity)]]&lt;br /&gt;
:::# [[성능을 고려한 설계]]&lt;br /&gt;
:::# [[효율적인 SQL 작성법]]&lt;br /&gt;
&lt;br /&gt;
=== [[튜닝 환경 구축]] ===&lt;br /&gt;
:::# [[DBMS_XPLAN 사용법]]&lt;br /&gt;
:::# [[REAL PLAN 사용법]]&lt;br /&gt;
:::# [[SQL 트레이스 방법]]&lt;br /&gt;
&lt;br /&gt;
=== [[인덱스 설계]] ===&lt;br /&gt;
:::# [[인덱스 아키텍처]]&lt;br /&gt;
:::# [[오라클 인덱스 종류|인덱스 종류]]&lt;br /&gt;
:::# [[엑세스 패스]]&lt;br /&gt;
&lt;br /&gt;
=== [[옵티마이져]] ===&lt;br /&gt;
==== [[JPPD(Join Predicate PushDown,조인절 PUSHDOWN)]]====&lt;br /&gt;
==== [[View pushed predicate (조건절 PUSHDOWN)]]====&lt;br /&gt;
&lt;br /&gt;
=== [[튜닝 힌트]] ===&lt;br /&gt;
:::# [[튜닝 힌트 no merge|NO_MERGE 힌트]]&lt;br /&gt;
&lt;br /&gt;
=== [[대용량 데이터 튜닝]] ===&lt;br /&gt;
==== [[병렬 쿼리 튜닝]] ====&lt;br /&gt;
=== [[ORACLE 튜닝 대상 조회]] ===&lt;br /&gt;
=== [[성능 문제 식별 방법론과 튜닝 접근법]]===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== [[ORACLE 아키텍쳐의 이해]] ==&lt;br /&gt;
=== [[테이블 조인 방식|오라클 조인 과 알고리즘 ]] ===&lt;br /&gt;
==== [[NL 조인]]====&lt;br /&gt;
==== [[HASH 조인]]====&lt;br /&gt;
==== [[MERGE 조인|SORT MERGE 조인]]====&lt;br /&gt;
==== [[세미조인]] ====&lt;br /&gt;
==== [[안티조인]] ====&lt;br /&gt;
=== [[파라미터 설계]] ===&lt;br /&gt;
=== [[오라클 테이블의 구조]]===&lt;br /&gt;
==== [[ORACLE LOB|오라클 LOB 원리와구조]] ====&lt;br /&gt;
&lt;br /&gt;
=== [[오라클 파티션테이블의 구조]] ===&lt;br /&gt;
=== [[데이터 블럭의 구조]] ===&lt;br /&gt;
=== [[오라클 컬럼의 구조]] ===&lt;br /&gt;
==== [[오라클 컬럼의 저장순서]] ====&lt;br /&gt;
==== [[컬럼의 순서가 변경시 ROW의 물리적 구조변화|컬럼 순서 변경시 ROW의 물리구조 변화]]====&lt;br /&gt;
==== [[오라클 컬럼저장 방식 개선 (12c 업그레이드) ]] ====&lt;br /&gt;
=== [[오라클 인덱스의 구조]] ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= [[DBA_수행_방법론_(공공/대기업_SI_프로젝트)]]=&lt;br /&gt;
== [[DBA_수행_방법론_(공공/대기업_SI_프로젝트)#개요|개요]] ==&lt;br /&gt;
== [[단계별 수행 방법론]] ==&lt;br /&gt;
=== [[분석 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
=== [[설계 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
=== [[구축 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
=== [[테스트 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
=== [[전개 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1905</id>
		<title>틀:개요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1905"/>
		<updated>2026-09-16T08:59:04Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;position: inherit;&lt;br /&gt;
        top: 100px;&lt;br /&gt;
        left: 100px;&lt;br /&gt;
        width: 100%;        &lt;br /&gt;
        border: 1px solid {{{보더색|#808080}}};&lt;br /&gt;
        background-color: {{{배경색|#808080}}};&lt;br /&gt;
        margin: 1.0em 0 0.7em; padding: 0.2em 0.2em; font-size: 1.0em; line-height: 2.1em; overflow: visible; -moz-border-radius: 0.5em; -webkit-border-radius: 0.5em; border-radius: 0.5em;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;material-icons icon-image-preview&amp;quot;&lt;br /&gt;
   style=&amp;quot;display: inline-block;  transform: translate(-10%, 20%); color: {{{아이콘색색|#ffa500}}};&amp;quot;&amp;gt;&amp;amp;nbsp;{{{아이콘|list_alt}}}&amp;lt;/span&amp;gt;&amp;lt;font style=&amp;quot;color: {{{폰트색|#fffafa}}}&amp;quot;&amp;gt;{{{개요|개요를 넣으세요}}}&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1904</id>
		<title>틀:개요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1904"/>
		<updated>2026-09-16T08:58:34Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;position: inherit;&lt;br /&gt;
        top: 100px;&lt;br /&gt;
        left: 100px;&lt;br /&gt;
        width: 100%;        &lt;br /&gt;
        border: 1px solid {{{보더색|#808080}}};&lt;br /&gt;
        background-color: {{{배경색|#808080}}};&lt;br /&gt;
        margin: 1.0em 0 0.7em; padding: 0.2em 0.2em; font-size: 1.0em; line-height: 2.1em; overflow: visible; -moz-border-radius: 0.5em; -webkit-border-radius: 0.5em; border-radius: 0.5em;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;material-icons icon-image-preview&amp;quot;&lt;br /&gt;
   style=&amp;quot;display: inline-block;  transform: translate(-10%, 20%); color: {{{아이콘색색|#ffa500}}};&amp;quot;&amp;gt;&amp;amp;nbsp;{{{아이콘|list_alt}}}&amp;lt;/span&amp;gt;&amp;lt;font style=&amp;quot;color: {{{폰트색|#fffafa}}}&amp;quot;&amp;gt;{{{제목|제목을넣으세요}}}&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1903</id>
		<title>틀:개요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1903"/>
		<updated>2026-09-16T08:57:59Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: Dbstudy(토론)의 편집을 Oracle의 마지막 판으로 되돌림&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;position: inherit;&lt;br /&gt;
        top: 100px;&lt;br /&gt;
        left: 100px;&lt;br /&gt;
        width: 100%;        &lt;br /&gt;
        border: 1px solid {{{보더색|#808080}}};&lt;br /&gt;
        background-color: {{{배경색|#808080}}};&lt;br /&gt;
        margin: 1.0em 0 0.7em; padding: 0.2em 0.2em; font-size: 1.0em; line-height: 2.1em; overflow: visible; -moz-border-radius: 0.5em; -webkit-border-radius: 0.5em; border-radius: 0.5em;&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;material-icons icon-image-preview&amp;quot;&lt;br /&gt;
   style=&amp;quot;display: inline-block;  transform: translate(-10%, 20%); color: {{{아이콘색색|#ffa500}}};&amp;quot;&amp;gt;&amp;amp;nbsp;{{{아이콘|list_alt}}}&amp;lt;/i&amp;gt;&amp;lt;font style=&amp;quot;color: {{{폰트색|#fffafa}}}&amp;quot;&amp;gt;{{{제목|제목을넣으세요}}}&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1902</id>
		<title>틀:개요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1902"/>
		<updated>2026-09-16T08:57:07Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;position: inherit;&lt;br /&gt;
        top: 100px;&lt;br /&gt;
        left: 100px;&lt;br /&gt;
        width: 100%;        &lt;br /&gt;
        border: 1px solid {{{보더색|#808080}}};&lt;br /&gt;
        background-color: {{{배경색|#808080}}};&lt;br /&gt;
        margin: 1.0em 0 0.7em; &lt;br /&gt;
        padding: 0.4em 0.6em; &lt;br /&gt;
        font-size: 1.0em; &lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        overflow: visible; &lt;br /&gt;
        -moz-border-radius: 0.5em; &lt;br /&gt;
        -webkit-border-radius: 0.5em; &lt;br /&gt;
        border-radius: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;span  class=&amp;quot;material-icons icon-image-preview&amp;quot;&lt;br /&gt;
       style=&amp;quot;display: inline-flex;              align-items: center;              color: {{{아이콘색|#ffa500}}};              margin-right: 0.3em;&lt;br /&gt;
              font-size: 1.2em;&amp;quot;&amp;gt;{{{아이콘|list_alt}}}&amp;lt;/span &amp;gt;&lt;br /&gt;
    &amp;lt;i style=&amp;quot;color: {{{폰트색|#fffafa}}}; line-height: 1.4; display: inline-flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
        {{{개요|개요를 넣으세요}}}&lt;br /&gt;
    &amp;lt;/i&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1901</id>
		<title>틀:개요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1901"/>
		<updated>2026-09-16T08:56:42Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;position: inherit;&lt;br /&gt;
        top: 100px;&lt;br /&gt;
        left: 100px;&lt;br /&gt;
        width: 100%;        &lt;br /&gt;
        border: 1px solid {{{보더색|#808080}}};&lt;br /&gt;
        background-color: {{{배경색|#808080}}};&lt;br /&gt;
        margin: 1.0em 0 0.7em; &lt;br /&gt;
        padding: 0.4em 0.6em; &lt;br /&gt;
        font-size: 1.0em; &lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        overflow: visible; &lt;br /&gt;
        -moz-border-radius: 0.5em; &lt;br /&gt;
        -webkit-border-radius: 0.5em; &lt;br /&gt;
        border-radius: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;span  class=&amp;quot;material-icons icon-image-preview&amp;quot;&lt;br /&gt;
       style=&amp;quot;display: inline-flex;&lt;br /&gt;
              align-items: center;&lt;br /&gt;
              color: {{{아이콘색|#ffa500}}};&lt;br /&gt;
              margin-right: 0.3em;&lt;br /&gt;
              font-size: 1.2em;&amp;quot;&amp;gt;{{{아이콘|list_alt}}}&amp;lt;/span &amp;gt;&lt;br /&gt;
    &amp;lt;i style=&amp;quot;color: {{{폰트색|#fffafa}}}; line-height: 1.4; display: inline-flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
        {{{개요|개요를 넣으세요}}}&lt;br /&gt;
    &amp;lt;/i&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1900</id>
		<title>틀:개요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1900"/>
		<updated>2026-09-16T08:56:25Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;position: inherit;&lt;br /&gt;
        top: 100px;&lt;br /&gt;
        left: 100px;&lt;br /&gt;
        width: 100%;        &lt;br /&gt;
        border: 1px solid {{{보더색|#808080}}};&lt;br /&gt;
        background-color: {{{배경색|#808080}}};&lt;br /&gt;
        margin: 1.0em 0 0.7em; &lt;br /&gt;
        padding: 0.4em 0.6em; &lt;br /&gt;
        font-size: 1.0em; &lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        overflow: visible; &lt;br /&gt;
        -moz-border-radius: 0.5em; &lt;br /&gt;
        -webkit-border-radius: 0.5em; &lt;br /&gt;
        border-radius: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;span  class=&amp;quot;material-icons icon-image-preview&amp;quot;&lt;br /&gt;
       style=&amp;quot;display: inline-flex;&lt;br /&gt;
              align-items: center;&lt;br /&gt;
              color: {{{아이콘색|#ffa500}}};&lt;br /&gt;
              margin-right: 0.3em;&lt;br /&gt;
              font-size: 1.2em;&amp;quot;&amp;gt;{{{아이콘|list_alt}}}&amp;lt;/span &amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: {{{폰트색|#fffafa}}}; line-height: 1.4; display: inline-flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
        {{{개요|개요를 넣으세요}}}&lt;br /&gt;
    &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1899</id>
		<title>틀:개요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1899"/>
		<updated>2026-09-16T08:55:42Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;position: inherit;&lt;br /&gt;
        top: 100px;&lt;br /&gt;
        left: 100px;&lt;br /&gt;
        width: 100%;        &lt;br /&gt;
        border: 1px solid {{{보더색|#808080}}};&lt;br /&gt;
        background-color: {{{배경색|#808080}}};&lt;br /&gt;
        margin: 1.0em 0 0.7em; &lt;br /&gt;
        padding: 0.4em 0.6em; &lt;br /&gt;
        font-size: 1.0em; &lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        overflow: visible; &lt;br /&gt;
        -moz-border-radius: 0.5em; &lt;br /&gt;
        -webkit-border-radius: 0.5em; &lt;br /&gt;
        border-radius: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;span  class=&amp;quot;material-icons icon-image-preview&amp;quot;&lt;br /&gt;
       style=&amp;quot;display: inline-flex;&lt;br /&gt;
              align-items: center;&lt;br /&gt;
              color: {{{아이콘색|#ffa500}}};&lt;br /&gt;
              margin-right: 0.3em;&lt;br /&gt;
              font-size: 1.2em;&amp;quot;&amp;gt;{{{아이콘|list_alt}}}&amp;lt;/span &amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: {{{폰트색|#fffafa}}}; line-height: 1.4; display: inline-flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
        {{{개요|개요를 넣으세요}}}&lt;br /&gt;
    &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1898</id>
		<title>틀:개요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1898"/>
		<updated>2026-09-16T08:51:31Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;position: inherit;&lt;br /&gt;
        top: 100px;&lt;br /&gt;
        left: 100px;&lt;br /&gt;
        width: 100%;        &lt;br /&gt;
        border: 1px solid {{{보더색|#808080}}};&lt;br /&gt;
        background-color: {{{배경색|#808080}}};&lt;br /&gt;
        margin: 1.0em 0 0.7em; &lt;br /&gt;
        padding: 0.4em 0.6em; &lt;br /&gt;
        font-size: 1.0em; &lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        overflow: visible; &lt;br /&gt;
        -moz-border-radius: 0.5em; &lt;br /&gt;
        -webkit-border-radius: 0.5em; &lt;br /&gt;
        border-radius: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;material-icons icon-image-preview&amp;quot;&lt;br /&gt;
       style=&amp;quot;display: inline-flex;&lt;br /&gt;
              align-items: center;&lt;br /&gt;
              color: {{{아이콘색|#ffa500}}};&lt;br /&gt;
              margin-right: 0.3em;&lt;br /&gt;
              font-size: 1.2em;&amp;quot;&amp;gt;{{{아이콘|list_alt}}}&amp;lt;/i&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: {{{폰트색|#fffafa}}}; line-height: 1.4; display: inline-flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
        {{{개요|개요를 넣으세요}}}&lt;br /&gt;
    &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1897</id>
		<title>오라클 LOB 데이터 구조</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1897"/>
		<updated>2026-09-16T08:49:19Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LOB(BLOB/CLOB)대용량 데이터 ==&lt;br /&gt;
=== 개요 ===&lt;br /&gt;
{{개요&lt;br /&gt;
|개요=LOB(BLOB/CLOB)이 대용량 데이터를 저장하는 핵심 원리는 &#039;&#039;&#039;&amp;quot;포인터(로케이터) + 별도 세그먼트 분리 저장&amp;quot;&#039;&#039;&#039; 구조&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB&lt;br /&gt;
├── Internal LOB (DB 내부 저장)&lt;br /&gt;
│   ├── CLOB (Character LOB) - 문자 데이터&lt;br /&gt;
│   ├── NCLOB (National CLOB) - 다국어 문자셋&lt;br /&gt;
│   └── BLOB (Binary LOB) - 바이너리 데이터&lt;br /&gt;
└── External LOB&lt;br /&gt;
    └── BFILE - OS 파일시스템 참조 (읽기 전용)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CLOB vs VARCHAR2 근본적 차이 ====&lt;br /&gt;
::::# VARCHAR2: 최대 32767 bytes (PL/SQL , 19c 이상부터 SQL도 가능), 4000 bytes (SQL) - inline storage 강제&lt;br /&gt;
::::# CLOB: 최대 4GB * DB_BLOCK_SIZE (이론상 128TB) - out-of-line storage 가능&lt;br /&gt;
&lt;br /&gt;
=== LOB 저장 구조 (핵심) ===&lt;br /&gt;
:::&amp;lt;source&amp;gt;&lt;br /&gt;
Table Row&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB LOCATOR │ ← 테이블 로우에 실제 저장되는 것 (포인터/핸들)&lt;br /&gt;
│ (약 4KB↓)   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB INDEX   │ ← LOB 청크들을 관리하는 B-Tree 인덱스&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB SEGMENT │ ← 실제 데이터가 저장되는 세그먼트 (CHUNK 단위)&lt;br /&gt;
└─────────────┘&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 로케이터(LOCATOR) ===&lt;br /&gt;
# 테이블 로우에는 실제 데이터가 아니라 LOB 데이터를 가리키는 40바이트 내외의 로케이터(포인터)만 저장됨&lt;br /&gt;
# 실제 데이터는 별도의 LOB 세그먼트에 존재하고, 애플리케이션은 이 로케이터를 통해 스트리밍 방식(READ/WRITE by chunk)으로 데이터에 접근함&lt;br /&gt;
&lt;br /&gt;
=== In-row vs Out-of-row ===&lt;br /&gt;
:::- 데이터 크기가 작으면(기본 임계값 관련, ENABLE STORAGE IN ROW) 로우 내부에 직접 저장&lt;br /&gt;
:::- 임계값을 넘으면 별도의 LOB 세그먼트(out-of-row)에 체인 형태로 저장되고 로우에는 포인터만 남음&lt;br /&gt;
:::- 이 덕분에 4000바이트 제한을 가진 VARCHAR2/RAW와 달리 최대 4GB(BasicFile) ~ (LOB) 단위까지 저장 가능&lt;br /&gt;
::&amp;lt;source&amp;gt;&lt;br /&gt;
CLOB 데이터 크기 확인&lt;br /&gt;
    │&lt;br /&gt;
    ├── 4000 bytes 이하 (기본값)&lt;br /&gt;
    │   └── ENABLE STORAGE IN ROW&lt;br /&gt;
    │       → 로우 내부에 직접 저장 (Inline)&lt;br /&gt;
    │       → LOB Locator + 실제 데이터가 로우에 존재&lt;br /&gt;
    │&lt;br /&gt;
    └── 4000 bytes 초과 (또는 DISABLE STORAGE IN ROW)&lt;br /&gt;
        └── OUT OF ROW 강제 이동&lt;br /&gt;
            → 로우에는 LOB Locator만 존재&lt;br /&gt;
            → 실제 데이터는 별도 LOB Segment에 저장&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장 방식 확인 테스트&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
CREATE TABLE lob_test (&lt;br /&gt;
    id NUMBER,&lt;br /&gt;
    doc CLOB&lt;br /&gt;
) LOB (doc) STORE AS (&lt;br /&gt;
    ENABLE STORAGE IN ROW    -- 4000바이트 이하는 인라인&lt;br /&gt;
    CHUNK 8192                -- 청크 크기&lt;br /&gt;
    PCTVERSION 10              -- 버전 유지 비율&lt;br /&gt;
    NOCACHE                    -- 버퍼캐시 사용 안함&lt;br /&gt;
    LOGGING&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 성능 함정: 4000바이트 근처의 데이터가 빈번하게 업데이트되면 in-row ↔ out-of-row 전환이 발생하여 Row Migration과 유사한 오버헤드 발생.&lt;br /&gt;
&lt;br /&gt;
=== CHUNK 단위 저장 ===&lt;br /&gt;
:::# LOB 세그먼트는 내부적으로 CHUNK(기본 8KB, 블록 사이즈 배수) 단위로 분할 저장. &lt;br /&gt;
:::# 큰 데이터를 CHUNK들의 연결 리스트로 관리하기 때문에 부분 읽기/쓰기(random access)가 가능하고, 전체를 메모리에 올리지 않고도 스트리밍 처리가 가능.&lt;br /&gt;
&lt;br /&gt;
:::* CHUNK란?&lt;br /&gt;
:::** LOB 데이터의 최소 I/O 단위&lt;br /&gt;
:::** DB_BLOCK_SIZE의 배수여야 함 (기본값: DB_BLOCK_SIZE, 최대 32KB 권장)&lt;br /&gt;
:::** 하나의 CHUNK는 여러 Oracle Block으로 구성 가능하나, 하나의 익스텐트 내에 존재&lt;br /&gt;
==== CHUNK 설계 원칙 ====&lt;br /&gt;
::::# 소량 다건 CLOB (예: 짧은 메모, 코멘트)&lt;br /&gt;
::::#:&amp;lt;source&amp;gt; CHUNK 8192   -- DB_BLOCK_SIZE와 동일하게&amp;lt;/source&amp;gt;&lt;br /&gt;
::::# 대용량 CLOB (예: 문서, XML)&lt;br /&gt;
::::#:&amp;lt;source&amp;gt; CHUNK 32768  -- 더 크게 설정하여 I/O 효율 극대화&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 인덱스 ===&lt;br /&gt;
LOB 세그먼트의 CHUNK 위치를 추적하기 위해 별도의 LOB 인덱스가 존재합니다(B-tree 구조로 CHUNK 매핑 관리).&lt;br /&gt;
&lt;br /&gt;
* LOB 데이터가 여러 CHUNK에 걸쳐 저장될 때, 이 청크들의 순서와 위치를 관리하는 B-Tree 기반 인덱스.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
 LOB Locator (SETID + LENGTH 정보 포함)&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
LOB Index (CHUNK 순서 매핑)&lt;br /&gt;
    │&lt;br /&gt;
    ├── CHUNK 1 (위치: block#100)&lt;br /&gt;
    ├── CHUNK 2 (위치: block#105)&lt;br /&gt;
    └── CHUNK 3 (위치: block#250)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 왜 중요 한가?&lt;br /&gt;
# LOB의 부분 읽기/쓰기(Partial Read/Write) 시 이 인덱스를 통해 필요한 청크만 접근&lt;br /&gt;
# DBMS_LOB.READ(lob, amount, offset) 호출 시 인덱스를 스캔하여 offset에 해당하는 청크로 직행&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PCTVERSION과 RETENTION (읽기 일관성) ===&lt;br /&gt;
==== 일반 테이블 vs LOB의 읽기 일관성 차이 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! 일반 테이블 !! LOB&lt;br /&gt;
|-&lt;br /&gt;
| 메커니즘 || UNDO Segment || LOB 자체 버전 관리&lt;br /&gt;
|-&lt;br /&gt;
| 위치 || 별도 UNDO 테이블스페이스 || LOB Segment 내부&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 핵심: LOB은 UNDO를 사용하지 않고, 자체적으로 이전 버전 데이터를 LOB 세그먼트 내에 보관합니다.&lt;br /&gt;
&lt;br /&gt;
==== PCTVERSION vs RETENTION ====&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
-- 방식 1: 공간 비율 기반 (전통적 방식)&lt;br /&gt;
PCTVERSION 10   -- 전체 LOB 세그먼트의 10%를 old version 유지에 사용&lt;br /&gt;
                -- 초과 시 오래된 버전부터 재사용(overwrite)&lt;br /&gt;
&lt;br /&gt;
-- 방식 2: 시간 기반 (Oracle 10g 이후 권장)&lt;br /&gt;
RETENTION       -- UNDO_RETENTION 파라미터 값을 따름&lt;br /&gt;
                -- 자동 스페이스 관리(ASSM) tablespace 필요&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 실무 팁: 대용량 LOB이 빈번히 업데이트되는 시스템에서 PCTVERSION이 너무 낮으면 ORA-22924 에러(snapshot too old 유사 현상) 발생 가능.&lt;br /&gt;
&lt;br /&gt;
=== LOB 세그먼트 정보 확인 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, segment_name, index_name,&lt;br /&gt;
       chunk, pctversion, cache, logging, in_row&lt;br /&gt;
  FROM user_lobs -- dba_lobs&lt;br /&gt;
 WHERE table_name = &#039;YOUR_TABLE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SecureFile vs BasicFile ===&lt;br /&gt;
:- BasicFile: 전통적 방식, LOB 세그먼트에 체인 저장&lt;br /&gt;
:- SecureFile(11g+): ASSM 기반, 압축/중복제거/암호화 지원, 성능 개선된 구조로 대부분 권장&lt;br /&gt;
&lt;br /&gt;
즉, &amp;quot;행 안에 다 넣지 않고 별도 세그먼트에 청크 단위로 분산 저장 + 로케이터로 참조&amp;quot;하는 것이 대용량 저장의 핵심 메커니즘입니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 아키텍처 차이&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! BasicFile (Legacy) !! SecureFile (Modern)&lt;br /&gt;
|-&lt;br /&gt;
| 저장 구조 || 고정 청크 기반|| 가변 블록 + B-Tree 유사 구조&lt;br /&gt;
|-&lt;br /&gt;
| 압축 || 불가 || COMPRESS 옵션 지원&lt;br /&gt;
|-&lt;br /&gt;
| 중복제거 || 불가 || DEDUPLICATE 지원&lt;br /&gt;
|-&lt;br /&gt;
| 암호화 || 불가 || ENCRYPT 지원&lt;br /&gt;
|-&lt;br /&gt;
| 성능 || 불가  || 대폭 개선 (특히 순차 접근)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
# Oracle 19c LOB 저장 속성 정리&lt;br /&gt;
&lt;br /&gt;
## LOB STORAGE 절 기본 구조&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
LOB (column_name) STORE AS [SECUREFILE|BASICFILE] [lob_segment_name]&lt;br /&gt;
(&lt;br /&gt;
  TABLESPACE ...&lt;br /&gt;
  ENABLE|DISABLE STORAGE IN ROW&lt;br /&gt;
  CHUNK n&lt;br /&gt;
  PCTVERSION n | RETENTION [AUTO|MAX n|MIN n]&lt;br /&gt;
  FREEPOOLS n&lt;br /&gt;
  CACHE | NOCACHE | CACHE READS&lt;br /&gt;
  LOGGING | NOLOGGING&lt;br /&gt;
  COMPRESS [LOW|MEDIUM|HIGH]   -- SecureFile 전용 기능&lt;br /&gt;
  DEDUPLICATE | KEEP_DUPLICATES -- 동일 LOB 데이터 중복 제거 선택&lt;br /&gt;
  ENCRYPT ... | DECRYPT&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## 속성별 정리&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 속성 !! 설명 !! 비고 &lt;br /&gt;
|-&lt;br /&gt;
| **SECUREFILE / BASICFILE** || LOB 저장 방식 선택 || SecureFile 권장(기본값은 DB_SECUREFILE 파라미터에 따름) &lt;br /&gt;
|-&lt;br /&gt;
| **ENABLE/DISABLE STORAGE IN ROW** || 로우 내 인라인 저장 여부 || 임계값 이하 데이터는 IN ROW 저장 &lt;br /&gt;
|-&lt;br /&gt;
| **CHUNK** || LOB 저장 최소 단위(바이트) || 블록사이즈 배수, 기본 8K&lt;br /&gt;
|-&lt;br /&gt;
| **PCTVERSION** || (BasicFile 전용) 이전 버전 유지 공간 % || Undo 방식과 다른 read consistency &lt;br /&gt;
|-&lt;br /&gt;
| **RETENTION [AUTO/MAX/MIN]** || (SecureFile 전용) 버전 보존 정책 || AUTO가 일반적 &lt;br /&gt;
|-&lt;br /&gt;
| **CACHE / NOCACHE / CACHE READS** || 버퍼캐시 사용 여부 || 대용량은 보통 NOCACHE &lt;br /&gt;
|-&lt;br /&gt;
| **LOGGING / NOLOGGING** || Redo 생성 여부 || 대량 초기 적재시 NOLOGGING 고려 &lt;br /&gt;
|-&lt;br /&gt;
| **COMPRESS [LOW/MEDIUM/HIGH]** || (SecureFile 전용) 압축 레벨 || ACO(Advanced Compression) 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **DEDUPLICATE / KEEP_DUPLICATES** || (SecureFile 전용) 중복 제거 || ACO 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **ENCRYPT / DECRYPT** || (SecureFile 전용) 투명 암호화 | TDE 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **FREEPOOLS** || (SecureFile 전용) 동시성 향상용 free space pool 분리 || RAC 환경 동시 write 성능 &lt;br /&gt;
|}&lt;br /&gt;
## 🆕 19c 관련 New Feature / 변경사항&lt;br /&gt;
&lt;br /&gt;
**1. `DB_SECUREFILE` 파라미터 기본값 변경 없음, 단 SecureFile이 사실상 표준화**&lt;br /&gt;
- 12c부터 BasicFile은 &amp;quot;desupported&amp;quot;(deprecated) 상태 유지, 19c에서도 동일하게 BasicFile은 신규 개발에 비권장&lt;br /&gt;
&lt;br /&gt;
**2. LOB 관련 초기화 파라미터 정리 지속**&lt;br /&gt;
- `DB_SECUREFILE` 파라미터 값: `PERMITTED`(기본), `ALWAYS`, `FORCE`, `NEVER`, `IGNORE`&lt;br /&gt;
- 19c에서도 동일 옵션 유지, ALWAYS/FORCE 사용시 BasicFile 문법도 자동으로 SecureFile로 생성&lt;br /&gt;
&lt;br /&gt;
**3. JSON 관련 LOB 활용 강화 (19c 특징)**&lt;br /&gt;
- 19c의 확장된 JSON 지원(다중 JSON 컬럼, 부분 업데이트 등)이 내부적으로 SecureFile LOB 기반으로 동작 — LOB 자체의 새 절이라기보다는 LOB을 활용하는 상위 기능 확장&lt;br /&gt;
&lt;br /&gt;
**4. In-Memory 관련**&lt;br /&gt;
- 19c에서 `INMEMORY` 절은 LOB 자체에는 직접 적용 불가(LOB은 IM 컬럼 스토어 미지원) — 이 제약은 계속 유지됨(신규 아님, 혼동 주의사항으로 정리)&lt;br /&gt;
&lt;br /&gt;
**참고**: 19c 자체에서 LOB STORE AS 문법 자체에 **완전히 새로운 키워드가 추가된 것은 없고**, 12c~18c에서 도입된 SecureFile 관련 옵션들이 19c에서도 그대로 유지·강화되는 흐름입니다. 12c 이후 큰 변화는 없었고, 오히려 &amp;quot;BasicFile 지양, SecureFile 표준화&amp;quot;라는 정책적 방향이 19c에서 더 굳어진 것으로 보시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
특정 옵션(예: COMPRESS, DEDUPLICATE의 라이선스 조건이나 RAC FREEPOOLS 튜닝)에 대해 더 깊게 필요하시면 말씀해주세요.&lt;br /&gt;
&lt;br /&gt;
==== CACHE / NOCACHE / CACHE READS ====&lt;br /&gt;
:* 소량/빈번 접근 LOB: CACHE (예: 사용자 프로필 이미지 썸네일)&lt;br /&gt;
:* 대량/1회성 접근 LOB: NOCACHE (예: 로그 파일, 대용량 첨부파일)&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source&amp;gt;&lt;br /&gt;
-- 옵션 1: CACHE&lt;br /&gt;
-- LOB 데이터를 Buffer Cache에 정상적으로 캐싱 (일반 테이블처럼)&lt;br /&gt;
CACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 2: NOCACHE (기본값)&lt;br /&gt;
-- Direct Path I/O 사용, Buffer Cache 우회&lt;br /&gt;
-- 대용량 LOB에 적합 (캐시 오염 방지)&lt;br /&gt;
NOCACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 3: CACHE READS&lt;br /&gt;
-- 쓰기는 NOCACHE처럼, 읽기는 CACHE처럼 동작&lt;br /&gt;
CACHE READS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB과 트랜잭션 - Locator의 실체 ===&lt;br /&gt;
* LOB Locator 내부 구조 (개념적)&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB Locator = {&lt;br /&gt;
    LOB Type (CLOB/BLOB/BFILE)&lt;br /&gt;
    LOB Length&lt;br /&gt;
    Chunk Size&lt;br /&gt;
    Position (현재 커서 위치 - 세션 내에서만 유효)&lt;br /&gt;
    ... (내부 메타데이터)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 핵심 함정: LOB Locator의 생명주기&lt;br /&gt;
** 잘못된 사용 예 - LOB Locator를 커밋 후 재사용&lt;br /&gt;
**:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
DECLARE&lt;br /&gt;
    l_clob CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT doc INTO l_clob FROM lob_test WHERE id=1;&lt;br /&gt;
    COMMIT;  -- ← 이 시점 이후 l_clob 사용 시 위험할 수 있음&lt;br /&gt;
    DBMS_LOB.READ(l_clob, ...);  -- ORA-22990 가능성&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 원리: LOB Locator는 트랜잭션과 밀접하게 연관되어 있으며, 특정 상황(특히 원격 LOB이나 트랜잭션 경계를 넘는 경우)에서 무효화될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
=== LOB 실전 튜닝 포인트 ===&lt;br /&gt;
:::# Fragmentation 확인&lt;br /&gt;
:::#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT segment_name, bytes/1024/1024 MB, blocks&lt;br /&gt;
FROM dba_segments &lt;br /&gt;
WHERE segment_name IN (SELECT segment_name FROM dba_lobs WHERE table_name=&#039;X&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:::# In-row vs Out-row 비율 확인 (실제 데이터 분포)&lt;br /&gt;
:::#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
         ELSE &#039;OUT_ROW&#039; END,&lt;br /&gt;
    COUNT(*)&lt;br /&gt;
FROM lob_test&lt;br /&gt;
GROUP BY CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
              ELSE &#039;OUT_ROW&#039; END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:::# Chunk 사용 효율성 (파편화 여부)&lt;br /&gt;
:::#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, chunk &lt;br /&gt;
FROM user_lobs;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1896</id>
		<title>틀:개요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EA%B0%9C%EC%9A%94&amp;diff=1896"/>
		<updated>2026-09-16T08:49:01Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;position: inherit;&lt;br /&gt;
        top: 100px;&lt;br /&gt;
        left: 100px;&lt;br /&gt;
        width: 100%;        &lt;br /&gt;
        border: 1px solid {{{보더색|#808080}}};&lt;br /&gt;
        background-color: {{{배경색|#808080}}};&lt;br /&gt;
        margin: 1.0em 0 0.7em; padding: 0.2em 0.2em; font-size: 1.0em; line-height: 2.1em; overflow: visible; -moz-border-radius: 0.5em; -webkit-border-radius: 0.5em; border-radius: 0.5em;&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;material-icons icon-image-preview&amp;quot;&lt;br /&gt;
   style=&amp;quot;display: inline-block;  transform: translate(-10%, 20%); color: {{{아이콘색색|#ffa500}}};&amp;quot;&amp;gt;&amp;amp;nbsp;{{{아이콘|list_alt}}}&amp;lt;/i&amp;gt;&amp;lt;font style=&amp;quot;color: {{{폰트색|#fffafa}}}&amp;quot;&amp;gt;{{{개요|개요를 넣으세요}}}&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1895</id>
		<title>오라클 LOB 데이터 구조</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1895"/>
		<updated>2026-09-16T08:47:47Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LOB(BLOB/CLOB)대용량 데이터 ==&lt;br /&gt;
=== 개요 ===&lt;br /&gt;
LOB(BLOB/CLOB)이 대용량 데이터를 저장하는 핵심 원리는 &#039;&#039;&#039;&amp;quot;포인터(로케이터) + 별도 세그먼트 분리 저장&amp;quot;&#039;&#039;&#039; 구조&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB&lt;br /&gt;
├── Internal LOB (DB 내부 저장)&lt;br /&gt;
│   ├── CLOB (Character LOB) - 문자 데이터&lt;br /&gt;
│   ├── NCLOB (National CLOB) - 다국어 문자셋&lt;br /&gt;
│   └── BLOB (Binary LOB) - 바이너리 데이터&lt;br /&gt;
└── External LOB&lt;br /&gt;
    └── BFILE - OS 파일시스템 참조 (읽기 전용)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CLOB vs VARCHAR2 근본적 차이 ====&lt;br /&gt;
::::# VARCHAR2: 최대 32767 bytes (PL/SQL , 19c 이상부터 SQL도 가능), 4000 bytes (SQL) - inline storage 강제&lt;br /&gt;
::::# CLOB: 최대 4GB * DB_BLOCK_SIZE (이론상 128TB) - out-of-line storage 가능&lt;br /&gt;
&lt;br /&gt;
=== LOB 저장 구조 (핵심) ===&lt;br /&gt;
:::&amp;lt;source&amp;gt;&lt;br /&gt;
Table Row&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB LOCATOR │ ← 테이블 로우에 실제 저장되는 것 (포인터/핸들)&lt;br /&gt;
│ (약 4KB↓)   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB INDEX   │ ← LOB 청크들을 관리하는 B-Tree 인덱스&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB SEGMENT │ ← 실제 데이터가 저장되는 세그먼트 (CHUNK 단위)&lt;br /&gt;
└─────────────┘&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 로케이터(LOCATOR) ===&lt;br /&gt;
# 테이블 로우에는 실제 데이터가 아니라 LOB 데이터를 가리키는 40바이트 내외의 로케이터(포인터)만 저장됨&lt;br /&gt;
# 실제 데이터는 별도의 LOB 세그먼트에 존재하고, 애플리케이션은 이 로케이터를 통해 스트리밍 방식(READ/WRITE by chunk)으로 데이터에 접근함&lt;br /&gt;
&lt;br /&gt;
=== In-row vs Out-of-row ===&lt;br /&gt;
:::- 데이터 크기가 작으면(기본 임계값 관련, ENABLE STORAGE IN ROW) 로우 내부에 직접 저장&lt;br /&gt;
:::- 임계값을 넘으면 별도의 LOB 세그먼트(out-of-row)에 체인 형태로 저장되고 로우에는 포인터만 남음&lt;br /&gt;
:::- 이 덕분에 4000바이트 제한을 가진 VARCHAR2/RAW와 달리 최대 4GB(BasicFile) ~ (LOB) 단위까지 저장 가능&lt;br /&gt;
::&amp;lt;source&amp;gt;&lt;br /&gt;
CLOB 데이터 크기 확인&lt;br /&gt;
    │&lt;br /&gt;
    ├── 4000 bytes 이하 (기본값)&lt;br /&gt;
    │   └── ENABLE STORAGE IN ROW&lt;br /&gt;
    │       → 로우 내부에 직접 저장 (Inline)&lt;br /&gt;
    │       → LOB Locator + 실제 데이터가 로우에 존재&lt;br /&gt;
    │&lt;br /&gt;
    └── 4000 bytes 초과 (또는 DISABLE STORAGE IN ROW)&lt;br /&gt;
        └── OUT OF ROW 강제 이동&lt;br /&gt;
            → 로우에는 LOB Locator만 존재&lt;br /&gt;
            → 실제 데이터는 별도 LOB Segment에 저장&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장 방식 확인 테스트&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
CREATE TABLE lob_test (&lt;br /&gt;
    id NUMBER,&lt;br /&gt;
    doc CLOB&lt;br /&gt;
) LOB (doc) STORE AS (&lt;br /&gt;
    ENABLE STORAGE IN ROW    -- 4000바이트 이하는 인라인&lt;br /&gt;
    CHUNK 8192                -- 청크 크기&lt;br /&gt;
    PCTVERSION 10              -- 버전 유지 비율&lt;br /&gt;
    NOCACHE                    -- 버퍼캐시 사용 안함&lt;br /&gt;
    LOGGING&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 성능 함정: 4000바이트 근처의 데이터가 빈번하게 업데이트되면 in-row ↔ out-of-row 전환이 발생하여 Row Migration과 유사한 오버헤드 발생.&lt;br /&gt;
&lt;br /&gt;
=== CHUNK 단위 저장 ===&lt;br /&gt;
:::# LOB 세그먼트는 내부적으로 CHUNK(기본 8KB, 블록 사이즈 배수) 단위로 분할 저장. &lt;br /&gt;
:::# 큰 데이터를 CHUNK들의 연결 리스트로 관리하기 때문에 부분 읽기/쓰기(random access)가 가능하고, 전체를 메모리에 올리지 않고도 스트리밍 처리가 가능.&lt;br /&gt;
&lt;br /&gt;
:::* CHUNK란?&lt;br /&gt;
:::** LOB 데이터의 최소 I/O 단위&lt;br /&gt;
:::** DB_BLOCK_SIZE의 배수여야 함 (기본값: DB_BLOCK_SIZE, 최대 32KB 권장)&lt;br /&gt;
:::** 하나의 CHUNK는 여러 Oracle Block으로 구성 가능하나, 하나의 익스텐트 내에 존재&lt;br /&gt;
==== CHUNK 설계 원칙 ====&lt;br /&gt;
::::# 소량 다건 CLOB (예: 짧은 메모, 코멘트)&lt;br /&gt;
::::#:&amp;lt;source&amp;gt; CHUNK 8192   -- DB_BLOCK_SIZE와 동일하게&amp;lt;/source&amp;gt;&lt;br /&gt;
::::# 대용량 CLOB (예: 문서, XML)&lt;br /&gt;
::::#:&amp;lt;source&amp;gt; CHUNK 32768  -- 더 크게 설정하여 I/O 효율 극대화&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 인덱스 ===&lt;br /&gt;
LOB 세그먼트의 CHUNK 위치를 추적하기 위해 별도의 LOB 인덱스가 존재합니다(B-tree 구조로 CHUNK 매핑 관리).&lt;br /&gt;
&lt;br /&gt;
* LOB 데이터가 여러 CHUNK에 걸쳐 저장될 때, 이 청크들의 순서와 위치를 관리하는 B-Tree 기반 인덱스.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
 LOB Locator (SETID + LENGTH 정보 포함)&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
LOB Index (CHUNK 순서 매핑)&lt;br /&gt;
    │&lt;br /&gt;
    ├── CHUNK 1 (위치: block#100)&lt;br /&gt;
    ├── CHUNK 2 (위치: block#105)&lt;br /&gt;
    └── CHUNK 3 (위치: block#250)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 왜 중요 한가?&lt;br /&gt;
# LOB의 부분 읽기/쓰기(Partial Read/Write) 시 이 인덱스를 통해 필요한 청크만 접근&lt;br /&gt;
# DBMS_LOB.READ(lob, amount, offset) 호출 시 인덱스를 스캔하여 offset에 해당하는 청크로 직행&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PCTVERSION과 RETENTION (읽기 일관성) ===&lt;br /&gt;
==== 일반 테이블 vs LOB의 읽기 일관성 차이 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! 일반 테이블 !! LOB&lt;br /&gt;
|-&lt;br /&gt;
| 메커니즘 || UNDO Segment || LOB 자체 버전 관리&lt;br /&gt;
|-&lt;br /&gt;
| 위치 || 별도 UNDO 테이블스페이스 || LOB Segment 내부&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 핵심: LOB은 UNDO를 사용하지 않고, 자체적으로 이전 버전 데이터를 LOB 세그먼트 내에 보관합니다.&lt;br /&gt;
&lt;br /&gt;
==== PCTVERSION vs RETENTION ====&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
-- 방식 1: 공간 비율 기반 (전통적 방식)&lt;br /&gt;
PCTVERSION 10   -- 전체 LOB 세그먼트의 10%를 old version 유지에 사용&lt;br /&gt;
                -- 초과 시 오래된 버전부터 재사용(overwrite)&lt;br /&gt;
&lt;br /&gt;
-- 방식 2: 시간 기반 (Oracle 10g 이후 권장)&lt;br /&gt;
RETENTION       -- UNDO_RETENTION 파라미터 값을 따름&lt;br /&gt;
                -- 자동 스페이스 관리(ASSM) tablespace 필요&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 실무 팁: 대용량 LOB이 빈번히 업데이트되는 시스템에서 PCTVERSION이 너무 낮으면 ORA-22924 에러(snapshot too old 유사 현상) 발생 가능.&lt;br /&gt;
&lt;br /&gt;
=== LOB 세그먼트 정보 확인 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, segment_name, index_name,&lt;br /&gt;
       chunk, pctversion, cache, logging, in_row&lt;br /&gt;
  FROM user_lobs -- dba_lobs&lt;br /&gt;
 WHERE table_name = &#039;YOUR_TABLE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SecureFile vs BasicFile ===&lt;br /&gt;
:- BasicFile: 전통적 방식, LOB 세그먼트에 체인 저장&lt;br /&gt;
:- SecureFile(11g+): ASSM 기반, 압축/중복제거/암호화 지원, 성능 개선된 구조로 대부분 권장&lt;br /&gt;
&lt;br /&gt;
즉, &amp;quot;행 안에 다 넣지 않고 별도 세그먼트에 청크 단위로 분산 저장 + 로케이터로 참조&amp;quot;하는 것이 대용량 저장의 핵심 메커니즘입니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 아키텍처 차이&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! BasicFile (Legacy) !! SecureFile (Modern)&lt;br /&gt;
|-&lt;br /&gt;
| 저장 구조 || 고정 청크 기반|| 가변 블록 + B-Tree 유사 구조&lt;br /&gt;
|-&lt;br /&gt;
| 압축 || 불가 || COMPRESS 옵션 지원&lt;br /&gt;
|-&lt;br /&gt;
| 중복제거 || 불가 || DEDUPLICATE 지원&lt;br /&gt;
|-&lt;br /&gt;
| 암호화 || 불가 || ENCRYPT 지원&lt;br /&gt;
|-&lt;br /&gt;
| 성능 || 불가  || 대폭 개선 (특히 순차 접근)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
# Oracle 19c LOB 저장 속성 정리&lt;br /&gt;
&lt;br /&gt;
## LOB STORAGE 절 기본 구조&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
LOB (column_name) STORE AS [SECUREFILE|BASICFILE] [lob_segment_name]&lt;br /&gt;
(&lt;br /&gt;
  TABLESPACE ...&lt;br /&gt;
  ENABLE|DISABLE STORAGE IN ROW&lt;br /&gt;
  CHUNK n&lt;br /&gt;
  PCTVERSION n | RETENTION [AUTO|MAX n|MIN n]&lt;br /&gt;
  FREEPOOLS n&lt;br /&gt;
  CACHE | NOCACHE | CACHE READS&lt;br /&gt;
  LOGGING | NOLOGGING&lt;br /&gt;
  COMPRESS [LOW|MEDIUM|HIGH]   -- SecureFile 전용 기능&lt;br /&gt;
  DEDUPLICATE | KEEP_DUPLICATES -- 동일 LOB 데이터 중복 제거 선택&lt;br /&gt;
  ENCRYPT ... | DECRYPT&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## 속성별 정리&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 속성 !! 설명 !! 비고 &lt;br /&gt;
|-&lt;br /&gt;
| **SECUREFILE / BASICFILE** || LOB 저장 방식 선택 || SecureFile 권장(기본값은 DB_SECUREFILE 파라미터에 따름) &lt;br /&gt;
|-&lt;br /&gt;
| **ENABLE/DISABLE STORAGE IN ROW** || 로우 내 인라인 저장 여부 || 임계값 이하 데이터는 IN ROW 저장 &lt;br /&gt;
|-&lt;br /&gt;
| **CHUNK** || LOB 저장 최소 단위(바이트) || 블록사이즈 배수, 기본 8K&lt;br /&gt;
|-&lt;br /&gt;
| **PCTVERSION** || (BasicFile 전용) 이전 버전 유지 공간 % || Undo 방식과 다른 read consistency &lt;br /&gt;
|-&lt;br /&gt;
| **RETENTION [AUTO/MAX/MIN]** || (SecureFile 전용) 버전 보존 정책 || AUTO가 일반적 &lt;br /&gt;
|-&lt;br /&gt;
| **CACHE / NOCACHE / CACHE READS** || 버퍼캐시 사용 여부 || 대용량은 보통 NOCACHE &lt;br /&gt;
|-&lt;br /&gt;
| **LOGGING / NOLOGGING** || Redo 생성 여부 || 대량 초기 적재시 NOLOGGING 고려 &lt;br /&gt;
|-&lt;br /&gt;
| **COMPRESS [LOW/MEDIUM/HIGH]** || (SecureFile 전용) 압축 레벨 || ACO(Advanced Compression) 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **DEDUPLICATE / KEEP_DUPLICATES** || (SecureFile 전용) 중복 제거 || ACO 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **ENCRYPT / DECRYPT** || (SecureFile 전용) 투명 암호화 | TDE 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **FREEPOOLS** || (SecureFile 전용) 동시성 향상용 free space pool 분리 || RAC 환경 동시 write 성능 &lt;br /&gt;
|}&lt;br /&gt;
## 🆕 19c 관련 New Feature / 변경사항&lt;br /&gt;
&lt;br /&gt;
**1. `DB_SECUREFILE` 파라미터 기본값 변경 없음, 단 SecureFile이 사실상 표준화**&lt;br /&gt;
- 12c부터 BasicFile은 &amp;quot;desupported&amp;quot;(deprecated) 상태 유지, 19c에서도 동일하게 BasicFile은 신규 개발에 비권장&lt;br /&gt;
&lt;br /&gt;
**2. LOB 관련 초기화 파라미터 정리 지속**&lt;br /&gt;
- `DB_SECUREFILE` 파라미터 값: `PERMITTED`(기본), `ALWAYS`, `FORCE`, `NEVER`, `IGNORE`&lt;br /&gt;
- 19c에서도 동일 옵션 유지, ALWAYS/FORCE 사용시 BasicFile 문법도 자동으로 SecureFile로 생성&lt;br /&gt;
&lt;br /&gt;
**3. JSON 관련 LOB 활용 강화 (19c 특징)**&lt;br /&gt;
- 19c의 확장된 JSON 지원(다중 JSON 컬럼, 부분 업데이트 등)이 내부적으로 SecureFile LOB 기반으로 동작 — LOB 자체의 새 절이라기보다는 LOB을 활용하는 상위 기능 확장&lt;br /&gt;
&lt;br /&gt;
**4. In-Memory 관련**&lt;br /&gt;
- 19c에서 `INMEMORY` 절은 LOB 자체에는 직접 적용 불가(LOB은 IM 컬럼 스토어 미지원) — 이 제약은 계속 유지됨(신규 아님, 혼동 주의사항으로 정리)&lt;br /&gt;
&lt;br /&gt;
**참고**: 19c 자체에서 LOB STORE AS 문법 자체에 **완전히 새로운 키워드가 추가된 것은 없고**, 12c~18c에서 도입된 SecureFile 관련 옵션들이 19c에서도 그대로 유지·강화되는 흐름입니다. 12c 이후 큰 변화는 없었고, 오히려 &amp;quot;BasicFile 지양, SecureFile 표준화&amp;quot;라는 정책적 방향이 19c에서 더 굳어진 것으로 보시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
특정 옵션(예: COMPRESS, DEDUPLICATE의 라이선스 조건이나 RAC FREEPOOLS 튜닝)에 대해 더 깊게 필요하시면 말씀해주세요.&lt;br /&gt;
&lt;br /&gt;
==== CACHE / NOCACHE / CACHE READS ====&lt;br /&gt;
:* 소량/빈번 접근 LOB: CACHE (예: 사용자 프로필 이미지 썸네일)&lt;br /&gt;
:* 대량/1회성 접근 LOB: NOCACHE (예: 로그 파일, 대용량 첨부파일)&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source&amp;gt;&lt;br /&gt;
-- 옵션 1: CACHE&lt;br /&gt;
-- LOB 데이터를 Buffer Cache에 정상적으로 캐싱 (일반 테이블처럼)&lt;br /&gt;
CACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 2: NOCACHE (기본값)&lt;br /&gt;
-- Direct Path I/O 사용, Buffer Cache 우회&lt;br /&gt;
-- 대용량 LOB에 적합 (캐시 오염 방지)&lt;br /&gt;
NOCACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 3: CACHE READS&lt;br /&gt;
-- 쓰기는 NOCACHE처럼, 읽기는 CACHE처럼 동작&lt;br /&gt;
CACHE READS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB과 트랜잭션 - Locator의 실체 ===&lt;br /&gt;
* LOB Locator 내부 구조 (개념적)&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB Locator = {&lt;br /&gt;
    LOB Type (CLOB/BLOB/BFILE)&lt;br /&gt;
    LOB Length&lt;br /&gt;
    Chunk Size&lt;br /&gt;
    Position (현재 커서 위치 - 세션 내에서만 유효)&lt;br /&gt;
    ... (내부 메타데이터)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 핵심 함정: LOB Locator의 생명주기&lt;br /&gt;
** 잘못된 사용 예 - LOB Locator를 커밋 후 재사용&lt;br /&gt;
**:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
DECLARE&lt;br /&gt;
    l_clob CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT doc INTO l_clob FROM lob_test WHERE id=1;&lt;br /&gt;
    COMMIT;  -- ← 이 시점 이후 l_clob 사용 시 위험할 수 있음&lt;br /&gt;
    DBMS_LOB.READ(l_clob, ...);  -- ORA-22990 가능성&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 원리: LOB Locator는 트랜잭션과 밀접하게 연관되어 있으며, 특정 상황(특히 원격 LOB이나 트랜잭션 경계를 넘는 경우)에서 무효화될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
=== LOB 실전 튜닝 포인트 ===&lt;br /&gt;
:::# Fragmentation 확인&lt;br /&gt;
:::#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT segment_name, bytes/1024/1024 MB, blocks&lt;br /&gt;
FROM dba_segments &lt;br /&gt;
WHERE segment_name IN (SELECT segment_name FROM dba_lobs WHERE table_name=&#039;X&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:::# In-row vs Out-row 비율 확인 (실제 데이터 분포)&lt;br /&gt;
:::#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
         ELSE &#039;OUT_ROW&#039; END,&lt;br /&gt;
    COUNT(*)&lt;br /&gt;
FROM lob_test&lt;br /&gt;
GROUP BY CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
              ELSE &#039;OUT_ROW&#039; END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:::# Chunk 사용 효율성 (파편화 여부)&lt;br /&gt;
:::#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, chunk &lt;br /&gt;
FROM user_lobs;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1894</id>
		<title>오라클 LOB 데이터 구조</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1894"/>
		<updated>2026-09-16T08:46:29Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* LOB 실전 튜닝 포인트 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LOB(BLOB/CLOB)대용량 데이터 ==&lt;br /&gt;
=== 개요 ===&lt;br /&gt;
LOB(BLOB/CLOB)이 대용량 데이터를 저장하는 핵심 원리는 &#039;&#039;&#039;&amp;quot;포인터(로케이터) + 별도 세그먼트 분리 저장&amp;quot;&#039;&#039;&#039; 구조&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB&lt;br /&gt;
├── Internal LOB (DB 내부 저장)&lt;br /&gt;
│   ├── CLOB (Character LOB) - 문자 데이터&lt;br /&gt;
│   ├── NCLOB (National CLOB) - 다국어 문자셋&lt;br /&gt;
│   └── BLOB (Binary LOB) - 바이너리 데이터&lt;br /&gt;
└── External LOB&lt;br /&gt;
    └── BFILE - OS 파일시스템 참조 (읽기 전용)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CLOB vs VARCHAR2 근본적 차이 ====&lt;br /&gt;
::::# VARCHAR2: 최대 32767 bytes (PL/SQL , 19c 이상부터 SQL도 가능), 4000 bytes (SQL) - inline storage 강제&lt;br /&gt;
::::# CLOB: 최대 4GB * DB_BLOCK_SIZE (이론상 128TB) - out-of-line storage 가능&lt;br /&gt;
&lt;br /&gt;
=== LOB 저장 구조 (핵심) ===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Table Row&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB LOCATOR │ ← 테이블 로우에 실제 저장되는 것 (포인터/핸들)&lt;br /&gt;
│ (약 4KB↓)   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB INDEX   │ ← LOB 청크들을 관리하는 B-Tree 인덱스&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB SEGMENT │ ← 실제 데이터가 저장되는 세그먼트 (CHUNK 단위)&lt;br /&gt;
└─────────────┘&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 로케이터(LOCATOR) ===&lt;br /&gt;
# 테이블 로우에는 실제 데이터가 아니라 LOB 데이터를 가리키는 40바이트 내외의 로케이터(포인터)만 저장됨&lt;br /&gt;
# 실제 데이터는 별도의 LOB 세그먼트에 존재하고, 애플리케이션은 이 로케이터를 통해 스트리밍 방식(READ/WRITE by chunk)으로 데이터에 접근함&lt;br /&gt;
&lt;br /&gt;
=== In-row vs Out-of-row ===&lt;br /&gt;
:- 데이터 크기가 작으면(기본 임계값 관련, ENABLE STORAGE IN ROW) 로우 내부에 직접 저장&lt;br /&gt;
:- 임계값을 넘으면 별도의 LOB 세그먼트(out-of-row)에 체인 형태로 저장되고 로우에는 포인터만 남음&lt;br /&gt;
:- 이 덕분에 4000바이트 제한을 가진 VARCHAR2/RAW와 달리 최대 4GB(BasicFile) ~ (LOB) 단위까지 저장 가능&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
CLOB 데이터 크기 확인&lt;br /&gt;
    │&lt;br /&gt;
    ├── 4000 bytes 이하 (기본값)&lt;br /&gt;
    │   └── ENABLE STORAGE IN ROW&lt;br /&gt;
    │       → 로우 내부에 직접 저장 (Inline)&lt;br /&gt;
    │       → LOB Locator + 실제 데이터가 로우에 존재&lt;br /&gt;
    │&lt;br /&gt;
    └── 4000 bytes 초과 (또는 DISABLE STORAGE IN ROW)&lt;br /&gt;
        └── OUT OF ROW 강제 이동&lt;br /&gt;
            → 로우에는 LOB Locator만 존재&lt;br /&gt;
            → 실제 데이터는 별도 LOB Segment에 저장&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장 방식 확인 테스트&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
CREATE TABLE lob_test (&lt;br /&gt;
    id NUMBER,&lt;br /&gt;
    doc CLOB&lt;br /&gt;
) LOB (doc) STORE AS (&lt;br /&gt;
    ENABLE STORAGE IN ROW    -- 4000바이트 이하는 인라인&lt;br /&gt;
    CHUNK 8192                -- 청크 크기&lt;br /&gt;
    PCTVERSION 10              -- 버전 유지 비율&lt;br /&gt;
    NOCACHE                    -- 버퍼캐시 사용 안함&lt;br /&gt;
    LOGGING&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 성능 함정: 4000바이트 근처의 데이터가 빈번하게 업데이트되면 in-row ↔ out-of-row 전환이 발생하여 Row Migration과 유사한 오버헤드 발생.&lt;br /&gt;
&lt;br /&gt;
=== CHUNK 단위 저장 ===&lt;br /&gt;
# LOB 세그먼트는 내부적으로 CHUNK(기본 8KB, 블록 사이즈 배수) 단위로 분할 저장. &lt;br /&gt;
# 큰 데이터를 CHUNK들의 연결 리스트로 관리하기 때문에 부분 읽기/쓰기(random access)가 가능하고, 전체를 메모리에 올리지 않고도 스트리밍 처리가 가능.&lt;br /&gt;
&lt;br /&gt;
* CHUNK란?&lt;br /&gt;
** LOB 데이터의 최소 I/O 단위&lt;br /&gt;
** DB_BLOCK_SIZE의 배수여야 함 (기본값: DB_BLOCK_SIZE, 최대 32KB 권장)&lt;br /&gt;
** 하나의 CHUNK는 여러 Oracle Block으로 구성 가능하나, 하나의 익스텐트 내에 존재&lt;br /&gt;
==== CHUNK 설계 원칙 ====&lt;br /&gt;
&lt;br /&gt;
# 소량 다건 CLOB (예: 짧은 메모, 코멘트)&lt;br /&gt;
#:&amp;lt;source&amp;gt; CHUNK 8192   -- DB_BLOCK_SIZE와 동일하게&amp;lt;/source&amp;gt;&lt;br /&gt;
# 대용량 CLOB (예: 문서, XML)&lt;br /&gt;
#:&amp;lt;source&amp;gt; CHUNK 32768  -- 더 크게 설정하여 I/O 효율 극대화&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 인덱스 ===&lt;br /&gt;
LOB 세그먼트의 CHUNK 위치를 추적하기 위해 별도의 LOB 인덱스가 존재합니다(B-tree 구조로 CHUNK 매핑 관리).&lt;br /&gt;
&lt;br /&gt;
* LOB 데이터가 여러 CHUNK에 걸쳐 저장될 때, 이 청크들의 순서와 위치를 관리하는 B-Tree 기반 인덱스.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
 LOB Locator (SETID + LENGTH 정보 포함)&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
LOB Index (CHUNK 순서 매핑)&lt;br /&gt;
    │&lt;br /&gt;
    ├── CHUNK 1 (위치: block#100)&lt;br /&gt;
    ├── CHUNK 2 (위치: block#105)&lt;br /&gt;
    └── CHUNK 3 (위치: block#250)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 왜 중요 한가?&lt;br /&gt;
# LOB의 부분 읽기/쓰기(Partial Read/Write) 시 이 인덱스를 통해 필요한 청크만 접근&lt;br /&gt;
# DBMS_LOB.READ(lob, amount, offset) 호출 시 인덱스를 스캔하여 offset에 해당하는 청크로 직행&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PCTVERSION과 RETENTION (읽기 일관성) ===&lt;br /&gt;
==== 일반 테이블 vs LOB의 읽기 일관성 차이 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! 일반 테이블 !! LOB&lt;br /&gt;
|-&lt;br /&gt;
| 메커니즘 || UNDO Segment || LOB 자체 버전 관리&lt;br /&gt;
|-&lt;br /&gt;
| 위치 || 별도 UNDO 테이블스페이스 || LOB Segment 내부&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 핵심: LOB은 UNDO를 사용하지 않고, 자체적으로 이전 버전 데이터를 LOB 세그먼트 내에 보관합니다.&lt;br /&gt;
&lt;br /&gt;
==== PCTVERSION vs RETENTION ====&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
-- 방식 1: 공간 비율 기반 (전통적 방식)&lt;br /&gt;
PCTVERSION 10   -- 전체 LOB 세그먼트의 10%를 old version 유지에 사용&lt;br /&gt;
                -- 초과 시 오래된 버전부터 재사용(overwrite)&lt;br /&gt;
&lt;br /&gt;
-- 방식 2: 시간 기반 (Oracle 10g 이후 권장)&lt;br /&gt;
RETENTION       -- UNDO_RETENTION 파라미터 값을 따름&lt;br /&gt;
                -- 자동 스페이스 관리(ASSM) tablespace 필요&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 실무 팁: 대용량 LOB이 빈번히 업데이트되는 시스템에서 PCTVERSION이 너무 낮으면 ORA-22924 에러(snapshot too old 유사 현상) 발생 가능.&lt;br /&gt;
&lt;br /&gt;
=== LOB 세그먼트 정보 확인 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, segment_name, index_name,&lt;br /&gt;
       chunk, pctversion, cache, logging, in_row&lt;br /&gt;
  FROM user_lobs -- dba_lobs&lt;br /&gt;
 WHERE table_name = &#039;YOUR_TABLE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SecureFile vs BasicFile ===&lt;br /&gt;
:- BasicFile: 전통적 방식, LOB 세그먼트에 체인 저장&lt;br /&gt;
:- SecureFile(11g+): ASSM 기반, 압축/중복제거/암호화 지원, 성능 개선된 구조로 대부분 권장&lt;br /&gt;
&lt;br /&gt;
즉, &amp;quot;행 안에 다 넣지 않고 별도 세그먼트에 청크 단위로 분산 저장 + 로케이터로 참조&amp;quot;하는 것이 대용량 저장의 핵심 메커니즘입니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 아키텍처 차이&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! BasicFile (Legacy) !! SecureFile (Modern)&lt;br /&gt;
|-&lt;br /&gt;
| 저장 구조 || 고정 청크 기반|| 가변 블록 + B-Tree 유사 구조&lt;br /&gt;
|-&lt;br /&gt;
| 압축 || 불가 || COMPRESS 옵션 지원&lt;br /&gt;
|-&lt;br /&gt;
| 중복제거 || 불가 || DEDUPLICATE 지원&lt;br /&gt;
|-&lt;br /&gt;
| 암호화 || 불가 || ENCRYPT 지원&lt;br /&gt;
|-&lt;br /&gt;
| 성능 || 불가  || 대폭 개선 (특히 순차 접근)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
# Oracle 19c LOB 저장 속성 정리&lt;br /&gt;
&lt;br /&gt;
## LOB STORAGE 절 기본 구조&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
LOB (column_name) STORE AS [SECUREFILE|BASICFILE] [lob_segment_name]&lt;br /&gt;
(&lt;br /&gt;
  TABLESPACE ...&lt;br /&gt;
  ENABLE|DISABLE STORAGE IN ROW&lt;br /&gt;
  CHUNK n&lt;br /&gt;
  PCTVERSION n | RETENTION [AUTO|MAX n|MIN n]&lt;br /&gt;
  FREEPOOLS n&lt;br /&gt;
  CACHE | NOCACHE | CACHE READS&lt;br /&gt;
  LOGGING | NOLOGGING&lt;br /&gt;
  COMPRESS [LOW|MEDIUM|HIGH]   -- SecureFile 전용 기능&lt;br /&gt;
  DEDUPLICATE | KEEP_DUPLICATES -- 동일 LOB 데이터 중복 제거 선택&lt;br /&gt;
  ENCRYPT ... | DECRYPT&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## 속성별 정리&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 속성 !! 설명 !! 비고 &lt;br /&gt;
|-&lt;br /&gt;
| **SECUREFILE / BASICFILE** || LOB 저장 방식 선택 || SecureFile 권장(기본값은 DB_SECUREFILE 파라미터에 따름) &lt;br /&gt;
|-&lt;br /&gt;
| **ENABLE/DISABLE STORAGE IN ROW** || 로우 내 인라인 저장 여부 || 임계값 이하 데이터는 IN ROW 저장 &lt;br /&gt;
|-&lt;br /&gt;
| **CHUNK** || LOB 저장 최소 단위(바이트) || 블록사이즈 배수, 기본 8K&lt;br /&gt;
|-&lt;br /&gt;
| **PCTVERSION** || (BasicFile 전용) 이전 버전 유지 공간 % || Undo 방식과 다른 read consistency &lt;br /&gt;
|-&lt;br /&gt;
| **RETENTION [AUTO/MAX/MIN]** || (SecureFile 전용) 버전 보존 정책 || AUTO가 일반적 &lt;br /&gt;
|-&lt;br /&gt;
| **CACHE / NOCACHE / CACHE READS** || 버퍼캐시 사용 여부 || 대용량은 보통 NOCACHE &lt;br /&gt;
|-&lt;br /&gt;
| **LOGGING / NOLOGGING** || Redo 생성 여부 || 대량 초기 적재시 NOLOGGING 고려 &lt;br /&gt;
|-&lt;br /&gt;
| **COMPRESS [LOW/MEDIUM/HIGH]** || (SecureFile 전용) 압축 레벨 || ACO(Advanced Compression) 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **DEDUPLICATE / KEEP_DUPLICATES** || (SecureFile 전용) 중복 제거 || ACO 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **ENCRYPT / DECRYPT** || (SecureFile 전용) 투명 암호화 | TDE 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **FREEPOOLS** || (SecureFile 전용) 동시성 향상용 free space pool 분리 || RAC 환경 동시 write 성능 &lt;br /&gt;
|}&lt;br /&gt;
## 🆕 19c 관련 New Feature / 변경사항&lt;br /&gt;
&lt;br /&gt;
**1. `DB_SECUREFILE` 파라미터 기본값 변경 없음, 단 SecureFile이 사실상 표준화**&lt;br /&gt;
- 12c부터 BasicFile은 &amp;quot;desupported&amp;quot;(deprecated) 상태 유지, 19c에서도 동일하게 BasicFile은 신규 개발에 비권장&lt;br /&gt;
&lt;br /&gt;
**2. LOB 관련 초기화 파라미터 정리 지속**&lt;br /&gt;
- `DB_SECUREFILE` 파라미터 값: `PERMITTED`(기본), `ALWAYS`, `FORCE`, `NEVER`, `IGNORE`&lt;br /&gt;
- 19c에서도 동일 옵션 유지, ALWAYS/FORCE 사용시 BasicFile 문법도 자동으로 SecureFile로 생성&lt;br /&gt;
&lt;br /&gt;
**3. JSON 관련 LOB 활용 강화 (19c 특징)**&lt;br /&gt;
- 19c의 확장된 JSON 지원(다중 JSON 컬럼, 부분 업데이트 등)이 내부적으로 SecureFile LOB 기반으로 동작 — LOB 자체의 새 절이라기보다는 LOB을 활용하는 상위 기능 확장&lt;br /&gt;
&lt;br /&gt;
**4. In-Memory 관련**&lt;br /&gt;
- 19c에서 `INMEMORY` 절은 LOB 자체에는 직접 적용 불가(LOB은 IM 컬럼 스토어 미지원) — 이 제약은 계속 유지됨(신규 아님, 혼동 주의사항으로 정리)&lt;br /&gt;
&lt;br /&gt;
**참고**: 19c 자체에서 LOB STORE AS 문법 자체에 **완전히 새로운 키워드가 추가된 것은 없고**, 12c~18c에서 도입된 SecureFile 관련 옵션들이 19c에서도 그대로 유지·강화되는 흐름입니다. 12c 이후 큰 변화는 없었고, 오히려 &amp;quot;BasicFile 지양, SecureFile 표준화&amp;quot;라는 정책적 방향이 19c에서 더 굳어진 것으로 보시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
특정 옵션(예: COMPRESS, DEDUPLICATE의 라이선스 조건이나 RAC FREEPOOLS 튜닝)에 대해 더 깊게 필요하시면 말씀해주세요.&lt;br /&gt;
&lt;br /&gt;
==== CACHE / NOCACHE / CACHE READS ====&lt;br /&gt;
:* 소량/빈번 접근 LOB: CACHE (예: 사용자 프로필 이미지 썸네일)&lt;br /&gt;
:* 대량/1회성 접근 LOB: NOCACHE (예: 로그 파일, 대용량 첨부파일)&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source&amp;gt;&lt;br /&gt;
-- 옵션 1: CACHE&lt;br /&gt;
-- LOB 데이터를 Buffer Cache에 정상적으로 캐싱 (일반 테이블처럼)&lt;br /&gt;
CACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 2: NOCACHE (기본값)&lt;br /&gt;
-- Direct Path I/O 사용, Buffer Cache 우회&lt;br /&gt;
-- 대용량 LOB에 적합 (캐시 오염 방지)&lt;br /&gt;
NOCACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 3: CACHE READS&lt;br /&gt;
-- 쓰기는 NOCACHE처럼, 읽기는 CACHE처럼 동작&lt;br /&gt;
CACHE READS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB과 트랜잭션 - Locator의 실체 ===&lt;br /&gt;
* LOB Locator 내부 구조 (개념적)&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB Locator = {&lt;br /&gt;
    LOB Type (CLOB/BLOB/BFILE)&lt;br /&gt;
    LOB Length&lt;br /&gt;
    Chunk Size&lt;br /&gt;
    Position (현재 커서 위치 - 세션 내에서만 유효)&lt;br /&gt;
    ... (내부 메타데이터)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 핵심 함정: LOB Locator의 생명주기&lt;br /&gt;
** 잘못된 사용 예 - LOB Locator를 커밋 후 재사용&lt;br /&gt;
**:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
DECLARE&lt;br /&gt;
    l_clob CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT doc INTO l_clob FROM lob_test WHERE id=1;&lt;br /&gt;
    COMMIT;  -- ← 이 시점 이후 l_clob 사용 시 위험할 수 있음&lt;br /&gt;
    DBMS_LOB.READ(l_clob, ...);  -- ORA-22990 가능성&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 원리: LOB Locator는 트랜잭션과 밀접하게 연관되어 있으며, 특정 상황(특히 원격 LOB이나 트랜잭션 경계를 넘는 경우)에서 무효화될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
=== LOB 실전 튜닝 포인트 ===&lt;br /&gt;
:::# Fragmentation 확인&lt;br /&gt;
:::#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT segment_name, bytes/1024/1024 MB, blocks&lt;br /&gt;
FROM dba_segments &lt;br /&gt;
WHERE segment_name IN (SELECT segment_name FROM dba_lobs WHERE table_name=&#039;X&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:::# In-row vs Out-row 비율 확인 (실제 데이터 분포)&lt;br /&gt;
:::#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
         ELSE &#039;OUT_ROW&#039; END,&lt;br /&gt;
    COUNT(*)&lt;br /&gt;
FROM lob_test&lt;br /&gt;
GROUP BY CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
              ELSE &#039;OUT_ROW&#039; END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:::# Chunk 사용 효율성 (파편화 여부)&lt;br /&gt;
:::#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, chunk &lt;br /&gt;
FROM user_lobs;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1893</id>
		<title>오라클 LOB 데이터 구조</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1893"/>
		<updated>2026-09-16T08:46:08Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* LOB 실전 튜닝 포인트 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LOB(BLOB/CLOB)대용량 데이터 ==&lt;br /&gt;
=== 개요 ===&lt;br /&gt;
LOB(BLOB/CLOB)이 대용량 데이터를 저장하는 핵심 원리는 &#039;&#039;&#039;&amp;quot;포인터(로케이터) + 별도 세그먼트 분리 저장&amp;quot;&#039;&#039;&#039; 구조&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB&lt;br /&gt;
├── Internal LOB (DB 내부 저장)&lt;br /&gt;
│   ├── CLOB (Character LOB) - 문자 데이터&lt;br /&gt;
│   ├── NCLOB (National CLOB) - 다국어 문자셋&lt;br /&gt;
│   └── BLOB (Binary LOB) - 바이너리 데이터&lt;br /&gt;
└── External LOB&lt;br /&gt;
    └── BFILE - OS 파일시스템 참조 (읽기 전용)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CLOB vs VARCHAR2 근본적 차이 ====&lt;br /&gt;
::::# VARCHAR2: 최대 32767 bytes (PL/SQL , 19c 이상부터 SQL도 가능), 4000 bytes (SQL) - inline storage 강제&lt;br /&gt;
::::# CLOB: 최대 4GB * DB_BLOCK_SIZE (이론상 128TB) - out-of-line storage 가능&lt;br /&gt;
&lt;br /&gt;
=== LOB 저장 구조 (핵심) ===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Table Row&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB LOCATOR │ ← 테이블 로우에 실제 저장되는 것 (포인터/핸들)&lt;br /&gt;
│ (약 4KB↓)   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB INDEX   │ ← LOB 청크들을 관리하는 B-Tree 인덱스&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB SEGMENT │ ← 실제 데이터가 저장되는 세그먼트 (CHUNK 단위)&lt;br /&gt;
└─────────────┘&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 로케이터(LOCATOR) ===&lt;br /&gt;
# 테이블 로우에는 실제 데이터가 아니라 LOB 데이터를 가리키는 40바이트 내외의 로케이터(포인터)만 저장됨&lt;br /&gt;
# 실제 데이터는 별도의 LOB 세그먼트에 존재하고, 애플리케이션은 이 로케이터를 통해 스트리밍 방식(READ/WRITE by chunk)으로 데이터에 접근함&lt;br /&gt;
&lt;br /&gt;
=== In-row vs Out-of-row ===&lt;br /&gt;
:- 데이터 크기가 작으면(기본 임계값 관련, ENABLE STORAGE IN ROW) 로우 내부에 직접 저장&lt;br /&gt;
:- 임계값을 넘으면 별도의 LOB 세그먼트(out-of-row)에 체인 형태로 저장되고 로우에는 포인터만 남음&lt;br /&gt;
:- 이 덕분에 4000바이트 제한을 가진 VARCHAR2/RAW와 달리 최대 4GB(BasicFile) ~ (LOB) 단위까지 저장 가능&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
CLOB 데이터 크기 확인&lt;br /&gt;
    │&lt;br /&gt;
    ├── 4000 bytes 이하 (기본값)&lt;br /&gt;
    │   └── ENABLE STORAGE IN ROW&lt;br /&gt;
    │       → 로우 내부에 직접 저장 (Inline)&lt;br /&gt;
    │       → LOB Locator + 실제 데이터가 로우에 존재&lt;br /&gt;
    │&lt;br /&gt;
    └── 4000 bytes 초과 (또는 DISABLE STORAGE IN ROW)&lt;br /&gt;
        └── OUT OF ROW 강제 이동&lt;br /&gt;
            → 로우에는 LOB Locator만 존재&lt;br /&gt;
            → 실제 데이터는 별도 LOB Segment에 저장&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장 방식 확인 테스트&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
CREATE TABLE lob_test (&lt;br /&gt;
    id NUMBER,&lt;br /&gt;
    doc CLOB&lt;br /&gt;
) LOB (doc) STORE AS (&lt;br /&gt;
    ENABLE STORAGE IN ROW    -- 4000바이트 이하는 인라인&lt;br /&gt;
    CHUNK 8192                -- 청크 크기&lt;br /&gt;
    PCTVERSION 10              -- 버전 유지 비율&lt;br /&gt;
    NOCACHE                    -- 버퍼캐시 사용 안함&lt;br /&gt;
    LOGGING&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 성능 함정: 4000바이트 근처의 데이터가 빈번하게 업데이트되면 in-row ↔ out-of-row 전환이 발생하여 Row Migration과 유사한 오버헤드 발생.&lt;br /&gt;
&lt;br /&gt;
=== CHUNK 단위 저장 ===&lt;br /&gt;
# LOB 세그먼트는 내부적으로 CHUNK(기본 8KB, 블록 사이즈 배수) 단위로 분할 저장. &lt;br /&gt;
# 큰 데이터를 CHUNK들의 연결 리스트로 관리하기 때문에 부분 읽기/쓰기(random access)가 가능하고, 전체를 메모리에 올리지 않고도 스트리밍 처리가 가능.&lt;br /&gt;
&lt;br /&gt;
* CHUNK란?&lt;br /&gt;
** LOB 데이터의 최소 I/O 단위&lt;br /&gt;
** DB_BLOCK_SIZE의 배수여야 함 (기본값: DB_BLOCK_SIZE, 최대 32KB 권장)&lt;br /&gt;
** 하나의 CHUNK는 여러 Oracle Block으로 구성 가능하나, 하나의 익스텐트 내에 존재&lt;br /&gt;
==== CHUNK 설계 원칙 ====&lt;br /&gt;
&lt;br /&gt;
# 소량 다건 CLOB (예: 짧은 메모, 코멘트)&lt;br /&gt;
#:&amp;lt;source&amp;gt; CHUNK 8192   -- DB_BLOCK_SIZE와 동일하게&amp;lt;/source&amp;gt;&lt;br /&gt;
# 대용량 CLOB (예: 문서, XML)&lt;br /&gt;
#:&amp;lt;source&amp;gt; CHUNK 32768  -- 더 크게 설정하여 I/O 효율 극대화&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 인덱스 ===&lt;br /&gt;
LOB 세그먼트의 CHUNK 위치를 추적하기 위해 별도의 LOB 인덱스가 존재합니다(B-tree 구조로 CHUNK 매핑 관리).&lt;br /&gt;
&lt;br /&gt;
* LOB 데이터가 여러 CHUNK에 걸쳐 저장될 때, 이 청크들의 순서와 위치를 관리하는 B-Tree 기반 인덱스.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
 LOB Locator (SETID + LENGTH 정보 포함)&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
LOB Index (CHUNK 순서 매핑)&lt;br /&gt;
    │&lt;br /&gt;
    ├── CHUNK 1 (위치: block#100)&lt;br /&gt;
    ├── CHUNK 2 (위치: block#105)&lt;br /&gt;
    └── CHUNK 3 (위치: block#250)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 왜 중요 한가?&lt;br /&gt;
# LOB의 부분 읽기/쓰기(Partial Read/Write) 시 이 인덱스를 통해 필요한 청크만 접근&lt;br /&gt;
# DBMS_LOB.READ(lob, amount, offset) 호출 시 인덱스를 스캔하여 offset에 해당하는 청크로 직행&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PCTVERSION과 RETENTION (읽기 일관성) ===&lt;br /&gt;
==== 일반 테이블 vs LOB의 읽기 일관성 차이 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! 일반 테이블 !! LOB&lt;br /&gt;
|-&lt;br /&gt;
| 메커니즘 || UNDO Segment || LOB 자체 버전 관리&lt;br /&gt;
|-&lt;br /&gt;
| 위치 || 별도 UNDO 테이블스페이스 || LOB Segment 내부&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 핵심: LOB은 UNDO를 사용하지 않고, 자체적으로 이전 버전 데이터를 LOB 세그먼트 내에 보관합니다.&lt;br /&gt;
&lt;br /&gt;
==== PCTVERSION vs RETENTION ====&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
-- 방식 1: 공간 비율 기반 (전통적 방식)&lt;br /&gt;
PCTVERSION 10   -- 전체 LOB 세그먼트의 10%를 old version 유지에 사용&lt;br /&gt;
                -- 초과 시 오래된 버전부터 재사용(overwrite)&lt;br /&gt;
&lt;br /&gt;
-- 방식 2: 시간 기반 (Oracle 10g 이후 권장)&lt;br /&gt;
RETENTION       -- UNDO_RETENTION 파라미터 값을 따름&lt;br /&gt;
                -- 자동 스페이스 관리(ASSM) tablespace 필요&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 실무 팁: 대용량 LOB이 빈번히 업데이트되는 시스템에서 PCTVERSION이 너무 낮으면 ORA-22924 에러(snapshot too old 유사 현상) 발생 가능.&lt;br /&gt;
&lt;br /&gt;
=== LOB 세그먼트 정보 확인 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, segment_name, index_name,&lt;br /&gt;
       chunk, pctversion, cache, logging, in_row&lt;br /&gt;
  FROM user_lobs -- dba_lobs&lt;br /&gt;
 WHERE table_name = &#039;YOUR_TABLE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SecureFile vs BasicFile ===&lt;br /&gt;
:- BasicFile: 전통적 방식, LOB 세그먼트에 체인 저장&lt;br /&gt;
:- SecureFile(11g+): ASSM 기반, 압축/중복제거/암호화 지원, 성능 개선된 구조로 대부분 권장&lt;br /&gt;
&lt;br /&gt;
즉, &amp;quot;행 안에 다 넣지 않고 별도 세그먼트에 청크 단위로 분산 저장 + 로케이터로 참조&amp;quot;하는 것이 대용량 저장의 핵심 메커니즘입니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 아키텍처 차이&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! BasicFile (Legacy) !! SecureFile (Modern)&lt;br /&gt;
|-&lt;br /&gt;
| 저장 구조 || 고정 청크 기반|| 가변 블록 + B-Tree 유사 구조&lt;br /&gt;
|-&lt;br /&gt;
| 압축 || 불가 || COMPRESS 옵션 지원&lt;br /&gt;
|-&lt;br /&gt;
| 중복제거 || 불가 || DEDUPLICATE 지원&lt;br /&gt;
|-&lt;br /&gt;
| 암호화 || 불가 || ENCRYPT 지원&lt;br /&gt;
|-&lt;br /&gt;
| 성능 || 불가  || 대폭 개선 (특히 순차 접근)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
# Oracle 19c LOB 저장 속성 정리&lt;br /&gt;
&lt;br /&gt;
## LOB STORAGE 절 기본 구조&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
LOB (column_name) STORE AS [SECUREFILE|BASICFILE] [lob_segment_name]&lt;br /&gt;
(&lt;br /&gt;
  TABLESPACE ...&lt;br /&gt;
  ENABLE|DISABLE STORAGE IN ROW&lt;br /&gt;
  CHUNK n&lt;br /&gt;
  PCTVERSION n | RETENTION [AUTO|MAX n|MIN n]&lt;br /&gt;
  FREEPOOLS n&lt;br /&gt;
  CACHE | NOCACHE | CACHE READS&lt;br /&gt;
  LOGGING | NOLOGGING&lt;br /&gt;
  COMPRESS [LOW|MEDIUM|HIGH]   -- SecureFile 전용 기능&lt;br /&gt;
  DEDUPLICATE | KEEP_DUPLICATES -- 동일 LOB 데이터 중복 제거 선택&lt;br /&gt;
  ENCRYPT ... | DECRYPT&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## 속성별 정리&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 속성 !! 설명 !! 비고 &lt;br /&gt;
|-&lt;br /&gt;
| **SECUREFILE / BASICFILE** || LOB 저장 방식 선택 || SecureFile 권장(기본값은 DB_SECUREFILE 파라미터에 따름) &lt;br /&gt;
|-&lt;br /&gt;
| **ENABLE/DISABLE STORAGE IN ROW** || 로우 내 인라인 저장 여부 || 임계값 이하 데이터는 IN ROW 저장 &lt;br /&gt;
|-&lt;br /&gt;
| **CHUNK** || LOB 저장 최소 단위(바이트) || 블록사이즈 배수, 기본 8K&lt;br /&gt;
|-&lt;br /&gt;
| **PCTVERSION** || (BasicFile 전용) 이전 버전 유지 공간 % || Undo 방식과 다른 read consistency &lt;br /&gt;
|-&lt;br /&gt;
| **RETENTION [AUTO/MAX/MIN]** || (SecureFile 전용) 버전 보존 정책 || AUTO가 일반적 &lt;br /&gt;
|-&lt;br /&gt;
| **CACHE / NOCACHE / CACHE READS** || 버퍼캐시 사용 여부 || 대용량은 보통 NOCACHE &lt;br /&gt;
|-&lt;br /&gt;
| **LOGGING / NOLOGGING** || Redo 생성 여부 || 대량 초기 적재시 NOLOGGING 고려 &lt;br /&gt;
|-&lt;br /&gt;
| **COMPRESS [LOW/MEDIUM/HIGH]** || (SecureFile 전용) 압축 레벨 || ACO(Advanced Compression) 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **DEDUPLICATE / KEEP_DUPLICATES** || (SecureFile 전용) 중복 제거 || ACO 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **ENCRYPT / DECRYPT** || (SecureFile 전용) 투명 암호화 | TDE 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **FREEPOOLS** || (SecureFile 전용) 동시성 향상용 free space pool 분리 || RAC 환경 동시 write 성능 &lt;br /&gt;
|}&lt;br /&gt;
## 🆕 19c 관련 New Feature / 변경사항&lt;br /&gt;
&lt;br /&gt;
**1. `DB_SECUREFILE` 파라미터 기본값 변경 없음, 단 SecureFile이 사실상 표준화**&lt;br /&gt;
- 12c부터 BasicFile은 &amp;quot;desupported&amp;quot;(deprecated) 상태 유지, 19c에서도 동일하게 BasicFile은 신규 개발에 비권장&lt;br /&gt;
&lt;br /&gt;
**2. LOB 관련 초기화 파라미터 정리 지속**&lt;br /&gt;
- `DB_SECUREFILE` 파라미터 값: `PERMITTED`(기본), `ALWAYS`, `FORCE`, `NEVER`, `IGNORE`&lt;br /&gt;
- 19c에서도 동일 옵션 유지, ALWAYS/FORCE 사용시 BasicFile 문법도 자동으로 SecureFile로 생성&lt;br /&gt;
&lt;br /&gt;
**3. JSON 관련 LOB 활용 강화 (19c 특징)**&lt;br /&gt;
- 19c의 확장된 JSON 지원(다중 JSON 컬럼, 부분 업데이트 등)이 내부적으로 SecureFile LOB 기반으로 동작 — LOB 자체의 새 절이라기보다는 LOB을 활용하는 상위 기능 확장&lt;br /&gt;
&lt;br /&gt;
**4. In-Memory 관련**&lt;br /&gt;
- 19c에서 `INMEMORY` 절은 LOB 자체에는 직접 적용 불가(LOB은 IM 컬럼 스토어 미지원) — 이 제약은 계속 유지됨(신규 아님, 혼동 주의사항으로 정리)&lt;br /&gt;
&lt;br /&gt;
**참고**: 19c 자체에서 LOB STORE AS 문법 자체에 **완전히 새로운 키워드가 추가된 것은 없고**, 12c~18c에서 도입된 SecureFile 관련 옵션들이 19c에서도 그대로 유지·강화되는 흐름입니다. 12c 이후 큰 변화는 없었고, 오히려 &amp;quot;BasicFile 지양, SecureFile 표준화&amp;quot;라는 정책적 방향이 19c에서 더 굳어진 것으로 보시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
특정 옵션(예: COMPRESS, DEDUPLICATE의 라이선스 조건이나 RAC FREEPOOLS 튜닝)에 대해 더 깊게 필요하시면 말씀해주세요.&lt;br /&gt;
&lt;br /&gt;
==== CACHE / NOCACHE / CACHE READS ====&lt;br /&gt;
:* 소량/빈번 접근 LOB: CACHE (예: 사용자 프로필 이미지 썸네일)&lt;br /&gt;
:* 대량/1회성 접근 LOB: NOCACHE (예: 로그 파일, 대용량 첨부파일)&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source&amp;gt;&lt;br /&gt;
-- 옵션 1: CACHE&lt;br /&gt;
-- LOB 데이터를 Buffer Cache에 정상적으로 캐싱 (일반 테이블처럼)&lt;br /&gt;
CACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 2: NOCACHE (기본값)&lt;br /&gt;
-- Direct Path I/O 사용, Buffer Cache 우회&lt;br /&gt;
-- 대용량 LOB에 적합 (캐시 오염 방지)&lt;br /&gt;
NOCACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 3: CACHE READS&lt;br /&gt;
-- 쓰기는 NOCACHE처럼, 읽기는 CACHE처럼 동작&lt;br /&gt;
CACHE READS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB과 트랜잭션 - Locator의 실체 ===&lt;br /&gt;
* LOB Locator 내부 구조 (개념적)&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB Locator = {&lt;br /&gt;
    LOB Type (CLOB/BLOB/BFILE)&lt;br /&gt;
    LOB Length&lt;br /&gt;
    Chunk Size&lt;br /&gt;
    Position (현재 커서 위치 - 세션 내에서만 유효)&lt;br /&gt;
    ... (내부 메타데이터)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 핵심 함정: LOB Locator의 생명주기&lt;br /&gt;
** 잘못된 사용 예 - LOB Locator를 커밋 후 재사용&lt;br /&gt;
**:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
DECLARE&lt;br /&gt;
    l_clob CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT doc INTO l_clob FROM lob_test WHERE id=1;&lt;br /&gt;
    COMMIT;  -- ← 이 시점 이후 l_clob 사용 시 위험할 수 있음&lt;br /&gt;
    DBMS_LOB.READ(l_clob, ...);  -- ORA-22990 가능성&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 원리: LOB Locator는 트랜잭션과 밀접하게 연관되어 있으며, 특정 상황(특히 원격 LOB이나 트랜잭션 경계를 넘는 경우)에서 무효화될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
=== LOB 실전 튜닝 포인트 ===&lt;br /&gt;
:::# Fragmentation 확인&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT segment_name, bytes/1024/1024 MB, blocks&lt;br /&gt;
FROM dba_segments &lt;br /&gt;
WHERE segment_name IN (SELECT segment_name FROM dba_lobs WHERE table_name=&#039;X&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:::# In-row vs Out-row 비율 확인 (실제 데이터 분포)&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
         ELSE &#039;OUT_ROW&#039; END,&lt;br /&gt;
    COUNT(*)&lt;br /&gt;
FROM lob_test&lt;br /&gt;
GROUP BY CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
              ELSE &#039;OUT_ROW&#039; END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:::# Chunk 사용 효율성 (파편화 여부)&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, chunk &lt;br /&gt;
FROM user_lobs;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1892</id>
		<title>오라클 LOB 데이터 구조</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1892"/>
		<updated>2026-09-16T08:45:44Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* LOB 실전 튜닝 포인트 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LOB(BLOB/CLOB)대용량 데이터 ==&lt;br /&gt;
=== 개요 ===&lt;br /&gt;
LOB(BLOB/CLOB)이 대용량 데이터를 저장하는 핵심 원리는 &#039;&#039;&#039;&amp;quot;포인터(로케이터) + 별도 세그먼트 분리 저장&amp;quot;&#039;&#039;&#039; 구조&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB&lt;br /&gt;
├── Internal LOB (DB 내부 저장)&lt;br /&gt;
│   ├── CLOB (Character LOB) - 문자 데이터&lt;br /&gt;
│   ├── NCLOB (National CLOB) - 다국어 문자셋&lt;br /&gt;
│   └── BLOB (Binary LOB) - 바이너리 데이터&lt;br /&gt;
└── External LOB&lt;br /&gt;
    └── BFILE - OS 파일시스템 참조 (읽기 전용)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CLOB vs VARCHAR2 근본적 차이 ====&lt;br /&gt;
::::# VARCHAR2: 최대 32767 bytes (PL/SQL , 19c 이상부터 SQL도 가능), 4000 bytes (SQL) - inline storage 강제&lt;br /&gt;
::::# CLOB: 최대 4GB * DB_BLOCK_SIZE (이론상 128TB) - out-of-line storage 가능&lt;br /&gt;
&lt;br /&gt;
=== LOB 저장 구조 (핵심) ===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Table Row&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB LOCATOR │ ← 테이블 로우에 실제 저장되는 것 (포인터/핸들)&lt;br /&gt;
│ (약 4KB↓)   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB INDEX   │ ← LOB 청크들을 관리하는 B-Tree 인덱스&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB SEGMENT │ ← 실제 데이터가 저장되는 세그먼트 (CHUNK 단위)&lt;br /&gt;
└─────────────┘&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 로케이터(LOCATOR) ===&lt;br /&gt;
# 테이블 로우에는 실제 데이터가 아니라 LOB 데이터를 가리키는 40바이트 내외의 로케이터(포인터)만 저장됨&lt;br /&gt;
# 실제 데이터는 별도의 LOB 세그먼트에 존재하고, 애플리케이션은 이 로케이터를 통해 스트리밍 방식(READ/WRITE by chunk)으로 데이터에 접근함&lt;br /&gt;
&lt;br /&gt;
=== In-row vs Out-of-row ===&lt;br /&gt;
:- 데이터 크기가 작으면(기본 임계값 관련, ENABLE STORAGE IN ROW) 로우 내부에 직접 저장&lt;br /&gt;
:- 임계값을 넘으면 별도의 LOB 세그먼트(out-of-row)에 체인 형태로 저장되고 로우에는 포인터만 남음&lt;br /&gt;
:- 이 덕분에 4000바이트 제한을 가진 VARCHAR2/RAW와 달리 최대 4GB(BasicFile) ~ (LOB) 단위까지 저장 가능&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
CLOB 데이터 크기 확인&lt;br /&gt;
    │&lt;br /&gt;
    ├── 4000 bytes 이하 (기본값)&lt;br /&gt;
    │   └── ENABLE STORAGE IN ROW&lt;br /&gt;
    │       → 로우 내부에 직접 저장 (Inline)&lt;br /&gt;
    │       → LOB Locator + 실제 데이터가 로우에 존재&lt;br /&gt;
    │&lt;br /&gt;
    └── 4000 bytes 초과 (또는 DISABLE STORAGE IN ROW)&lt;br /&gt;
        └── OUT OF ROW 강제 이동&lt;br /&gt;
            → 로우에는 LOB Locator만 존재&lt;br /&gt;
            → 실제 데이터는 별도 LOB Segment에 저장&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장 방식 확인 테스트&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
CREATE TABLE lob_test (&lt;br /&gt;
    id NUMBER,&lt;br /&gt;
    doc CLOB&lt;br /&gt;
) LOB (doc) STORE AS (&lt;br /&gt;
    ENABLE STORAGE IN ROW    -- 4000바이트 이하는 인라인&lt;br /&gt;
    CHUNK 8192                -- 청크 크기&lt;br /&gt;
    PCTVERSION 10              -- 버전 유지 비율&lt;br /&gt;
    NOCACHE                    -- 버퍼캐시 사용 안함&lt;br /&gt;
    LOGGING&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 성능 함정: 4000바이트 근처의 데이터가 빈번하게 업데이트되면 in-row ↔ out-of-row 전환이 발생하여 Row Migration과 유사한 오버헤드 발생.&lt;br /&gt;
&lt;br /&gt;
=== CHUNK 단위 저장 ===&lt;br /&gt;
# LOB 세그먼트는 내부적으로 CHUNK(기본 8KB, 블록 사이즈 배수) 단위로 분할 저장. &lt;br /&gt;
# 큰 데이터를 CHUNK들의 연결 리스트로 관리하기 때문에 부분 읽기/쓰기(random access)가 가능하고, 전체를 메모리에 올리지 않고도 스트리밍 처리가 가능.&lt;br /&gt;
&lt;br /&gt;
* CHUNK란?&lt;br /&gt;
** LOB 데이터의 최소 I/O 단위&lt;br /&gt;
** DB_BLOCK_SIZE의 배수여야 함 (기본값: DB_BLOCK_SIZE, 최대 32KB 권장)&lt;br /&gt;
** 하나의 CHUNK는 여러 Oracle Block으로 구성 가능하나, 하나의 익스텐트 내에 존재&lt;br /&gt;
==== CHUNK 설계 원칙 ====&lt;br /&gt;
&lt;br /&gt;
# 소량 다건 CLOB (예: 짧은 메모, 코멘트)&lt;br /&gt;
#:&amp;lt;source&amp;gt; CHUNK 8192   -- DB_BLOCK_SIZE와 동일하게&amp;lt;/source&amp;gt;&lt;br /&gt;
# 대용량 CLOB (예: 문서, XML)&lt;br /&gt;
#:&amp;lt;source&amp;gt; CHUNK 32768  -- 더 크게 설정하여 I/O 효율 극대화&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 인덱스 ===&lt;br /&gt;
LOB 세그먼트의 CHUNK 위치를 추적하기 위해 별도의 LOB 인덱스가 존재합니다(B-tree 구조로 CHUNK 매핑 관리).&lt;br /&gt;
&lt;br /&gt;
* LOB 데이터가 여러 CHUNK에 걸쳐 저장될 때, 이 청크들의 순서와 위치를 관리하는 B-Tree 기반 인덱스.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
 LOB Locator (SETID + LENGTH 정보 포함)&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
LOB Index (CHUNK 순서 매핑)&lt;br /&gt;
    │&lt;br /&gt;
    ├── CHUNK 1 (위치: block#100)&lt;br /&gt;
    ├── CHUNK 2 (위치: block#105)&lt;br /&gt;
    └── CHUNK 3 (위치: block#250)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 왜 중요 한가?&lt;br /&gt;
# LOB의 부분 읽기/쓰기(Partial Read/Write) 시 이 인덱스를 통해 필요한 청크만 접근&lt;br /&gt;
# DBMS_LOB.READ(lob, amount, offset) 호출 시 인덱스를 스캔하여 offset에 해당하는 청크로 직행&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PCTVERSION과 RETENTION (읽기 일관성) ===&lt;br /&gt;
==== 일반 테이블 vs LOB의 읽기 일관성 차이 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! 일반 테이블 !! LOB&lt;br /&gt;
|-&lt;br /&gt;
| 메커니즘 || UNDO Segment || LOB 자체 버전 관리&lt;br /&gt;
|-&lt;br /&gt;
| 위치 || 별도 UNDO 테이블스페이스 || LOB Segment 내부&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 핵심: LOB은 UNDO를 사용하지 않고, 자체적으로 이전 버전 데이터를 LOB 세그먼트 내에 보관합니다.&lt;br /&gt;
&lt;br /&gt;
==== PCTVERSION vs RETENTION ====&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
-- 방식 1: 공간 비율 기반 (전통적 방식)&lt;br /&gt;
PCTVERSION 10   -- 전체 LOB 세그먼트의 10%를 old version 유지에 사용&lt;br /&gt;
                -- 초과 시 오래된 버전부터 재사용(overwrite)&lt;br /&gt;
&lt;br /&gt;
-- 방식 2: 시간 기반 (Oracle 10g 이후 권장)&lt;br /&gt;
RETENTION       -- UNDO_RETENTION 파라미터 값을 따름&lt;br /&gt;
                -- 자동 스페이스 관리(ASSM) tablespace 필요&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 실무 팁: 대용량 LOB이 빈번히 업데이트되는 시스템에서 PCTVERSION이 너무 낮으면 ORA-22924 에러(snapshot too old 유사 현상) 발생 가능.&lt;br /&gt;
&lt;br /&gt;
=== LOB 세그먼트 정보 확인 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, segment_name, index_name,&lt;br /&gt;
       chunk, pctversion, cache, logging, in_row&lt;br /&gt;
  FROM user_lobs -- dba_lobs&lt;br /&gt;
 WHERE table_name = &#039;YOUR_TABLE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SecureFile vs BasicFile ===&lt;br /&gt;
:- BasicFile: 전통적 방식, LOB 세그먼트에 체인 저장&lt;br /&gt;
:- SecureFile(11g+): ASSM 기반, 압축/중복제거/암호화 지원, 성능 개선된 구조로 대부분 권장&lt;br /&gt;
&lt;br /&gt;
즉, &amp;quot;행 안에 다 넣지 않고 별도 세그먼트에 청크 단위로 분산 저장 + 로케이터로 참조&amp;quot;하는 것이 대용량 저장의 핵심 메커니즘입니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 아키텍처 차이&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! BasicFile (Legacy) !! SecureFile (Modern)&lt;br /&gt;
|-&lt;br /&gt;
| 저장 구조 || 고정 청크 기반|| 가변 블록 + B-Tree 유사 구조&lt;br /&gt;
|-&lt;br /&gt;
| 압축 || 불가 || COMPRESS 옵션 지원&lt;br /&gt;
|-&lt;br /&gt;
| 중복제거 || 불가 || DEDUPLICATE 지원&lt;br /&gt;
|-&lt;br /&gt;
| 암호화 || 불가 || ENCRYPT 지원&lt;br /&gt;
|-&lt;br /&gt;
| 성능 || 불가  || 대폭 개선 (특히 순차 접근)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
# Oracle 19c LOB 저장 속성 정리&lt;br /&gt;
&lt;br /&gt;
## LOB STORAGE 절 기본 구조&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
LOB (column_name) STORE AS [SECUREFILE|BASICFILE] [lob_segment_name]&lt;br /&gt;
(&lt;br /&gt;
  TABLESPACE ...&lt;br /&gt;
  ENABLE|DISABLE STORAGE IN ROW&lt;br /&gt;
  CHUNK n&lt;br /&gt;
  PCTVERSION n | RETENTION [AUTO|MAX n|MIN n]&lt;br /&gt;
  FREEPOOLS n&lt;br /&gt;
  CACHE | NOCACHE | CACHE READS&lt;br /&gt;
  LOGGING | NOLOGGING&lt;br /&gt;
  COMPRESS [LOW|MEDIUM|HIGH]   -- SecureFile 전용 기능&lt;br /&gt;
  DEDUPLICATE | KEEP_DUPLICATES -- 동일 LOB 데이터 중복 제거 선택&lt;br /&gt;
  ENCRYPT ... | DECRYPT&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## 속성별 정리&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 속성 !! 설명 !! 비고 &lt;br /&gt;
|-&lt;br /&gt;
| **SECUREFILE / BASICFILE** || LOB 저장 방식 선택 || SecureFile 권장(기본값은 DB_SECUREFILE 파라미터에 따름) &lt;br /&gt;
|-&lt;br /&gt;
| **ENABLE/DISABLE STORAGE IN ROW** || 로우 내 인라인 저장 여부 || 임계값 이하 데이터는 IN ROW 저장 &lt;br /&gt;
|-&lt;br /&gt;
| **CHUNK** || LOB 저장 최소 단위(바이트) || 블록사이즈 배수, 기본 8K&lt;br /&gt;
|-&lt;br /&gt;
| **PCTVERSION** || (BasicFile 전용) 이전 버전 유지 공간 % || Undo 방식과 다른 read consistency &lt;br /&gt;
|-&lt;br /&gt;
| **RETENTION [AUTO/MAX/MIN]** || (SecureFile 전용) 버전 보존 정책 || AUTO가 일반적 &lt;br /&gt;
|-&lt;br /&gt;
| **CACHE / NOCACHE / CACHE READS** || 버퍼캐시 사용 여부 || 대용량은 보통 NOCACHE &lt;br /&gt;
|-&lt;br /&gt;
| **LOGGING / NOLOGGING** || Redo 생성 여부 || 대량 초기 적재시 NOLOGGING 고려 &lt;br /&gt;
|-&lt;br /&gt;
| **COMPRESS [LOW/MEDIUM/HIGH]** || (SecureFile 전용) 압축 레벨 || ACO(Advanced Compression) 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **DEDUPLICATE / KEEP_DUPLICATES** || (SecureFile 전용) 중복 제거 || ACO 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **ENCRYPT / DECRYPT** || (SecureFile 전용) 투명 암호화 | TDE 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **FREEPOOLS** || (SecureFile 전용) 동시성 향상용 free space pool 분리 || RAC 환경 동시 write 성능 &lt;br /&gt;
|}&lt;br /&gt;
## 🆕 19c 관련 New Feature / 변경사항&lt;br /&gt;
&lt;br /&gt;
**1. `DB_SECUREFILE` 파라미터 기본값 변경 없음, 단 SecureFile이 사실상 표준화**&lt;br /&gt;
- 12c부터 BasicFile은 &amp;quot;desupported&amp;quot;(deprecated) 상태 유지, 19c에서도 동일하게 BasicFile은 신규 개발에 비권장&lt;br /&gt;
&lt;br /&gt;
**2. LOB 관련 초기화 파라미터 정리 지속**&lt;br /&gt;
- `DB_SECUREFILE` 파라미터 값: `PERMITTED`(기본), `ALWAYS`, `FORCE`, `NEVER`, `IGNORE`&lt;br /&gt;
- 19c에서도 동일 옵션 유지, ALWAYS/FORCE 사용시 BasicFile 문법도 자동으로 SecureFile로 생성&lt;br /&gt;
&lt;br /&gt;
**3. JSON 관련 LOB 활용 강화 (19c 특징)**&lt;br /&gt;
- 19c의 확장된 JSON 지원(다중 JSON 컬럼, 부분 업데이트 등)이 내부적으로 SecureFile LOB 기반으로 동작 — LOB 자체의 새 절이라기보다는 LOB을 활용하는 상위 기능 확장&lt;br /&gt;
&lt;br /&gt;
**4. In-Memory 관련**&lt;br /&gt;
- 19c에서 `INMEMORY` 절은 LOB 자체에는 직접 적용 불가(LOB은 IM 컬럼 스토어 미지원) — 이 제약은 계속 유지됨(신규 아님, 혼동 주의사항으로 정리)&lt;br /&gt;
&lt;br /&gt;
**참고**: 19c 자체에서 LOB STORE AS 문법 자체에 **완전히 새로운 키워드가 추가된 것은 없고**, 12c~18c에서 도입된 SecureFile 관련 옵션들이 19c에서도 그대로 유지·강화되는 흐름입니다. 12c 이후 큰 변화는 없었고, 오히려 &amp;quot;BasicFile 지양, SecureFile 표준화&amp;quot;라는 정책적 방향이 19c에서 더 굳어진 것으로 보시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
특정 옵션(예: COMPRESS, DEDUPLICATE의 라이선스 조건이나 RAC FREEPOOLS 튜닝)에 대해 더 깊게 필요하시면 말씀해주세요.&lt;br /&gt;
&lt;br /&gt;
==== CACHE / NOCACHE / CACHE READS ====&lt;br /&gt;
:* 소량/빈번 접근 LOB: CACHE (예: 사용자 프로필 이미지 썸네일)&lt;br /&gt;
:* 대량/1회성 접근 LOB: NOCACHE (예: 로그 파일, 대용량 첨부파일)&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source&amp;gt;&lt;br /&gt;
-- 옵션 1: CACHE&lt;br /&gt;
-- LOB 데이터를 Buffer Cache에 정상적으로 캐싱 (일반 테이블처럼)&lt;br /&gt;
CACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 2: NOCACHE (기본값)&lt;br /&gt;
-- Direct Path I/O 사용, Buffer Cache 우회&lt;br /&gt;
-- 대용량 LOB에 적합 (캐시 오염 방지)&lt;br /&gt;
NOCACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 3: CACHE READS&lt;br /&gt;
-- 쓰기는 NOCACHE처럼, 읽기는 CACHE처럼 동작&lt;br /&gt;
CACHE READS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB과 트랜잭션 - Locator의 실체 ===&lt;br /&gt;
* LOB Locator 내부 구조 (개념적)&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB Locator = {&lt;br /&gt;
    LOB Type (CLOB/BLOB/BFILE)&lt;br /&gt;
    LOB Length&lt;br /&gt;
    Chunk Size&lt;br /&gt;
    Position (현재 커서 위치 - 세션 내에서만 유효)&lt;br /&gt;
    ... (내부 메타데이터)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 핵심 함정: LOB Locator의 생명주기&lt;br /&gt;
** 잘못된 사용 예 - LOB Locator를 커밋 후 재사용&lt;br /&gt;
**:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
DECLARE&lt;br /&gt;
    l_clob CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT doc INTO l_clob FROM lob_test WHERE id=1;&lt;br /&gt;
    COMMIT;  -- ← 이 시점 이후 l_clob 사용 시 위험할 수 있음&lt;br /&gt;
    DBMS_LOB.READ(l_clob, ...);  -- ORA-22990 가능성&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 원리: LOB Locator는 트랜잭션과 밀접하게 연관되어 있으며, 특정 상황(특히 원격 LOB이나 트랜잭션 경계를 넘는 경우)에서 무효화될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
=== LOB 실전 튜닝 포인트 ===&lt;br /&gt;
:::# Fragmentation 확인&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT segment_name, bytes/1024/1024 MB, blocks&lt;br /&gt;
FROM dba_segments &lt;br /&gt;
WHERE segment_name IN (SELECT segment_name FROM dba_lobs WHERE table_name=&#039;X&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. In-row vs Out-row 비율 확인 (실제 데이터 분포)&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
         ELSE &#039;OUT_ROW&#039; END,&lt;br /&gt;
    COUNT(*)&lt;br /&gt;
FROM lob_test&lt;br /&gt;
GROUP BY CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
              ELSE &#039;OUT_ROW&#039; END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Chunk 사용 효율성 (파편화 여부)&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, chunk &lt;br /&gt;
FROM user_lobs;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1891</id>
		<title>ORACLE LOB</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1891"/>
		<updated>2026-09-16T08:45:10Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* LOB의 구조와 원리 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[오라클 LOB 데이터 구조|LOB의 구조와 원리]] ==&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#개요|개요]] &lt;br /&gt;
::## [[오라클 LOB 데이터 구조#CLOB vs VARCHAR2 근본적 차이| CLOB vs VARCHAR2 근본적 차이 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB 저장 구조 (핵심)| LOB 저장 구조 (핵심) ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB 로케이터(LOCATOR)| LOB 로케이터(LOCATOR) ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#In-row vs Out-of-row| In-row vs Out-of-row ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#CHUNK 단위 저장| CHUNK 단위 저장 ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조#CHUNK 설계 원칙| CHUNK 설계 원칙 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB 인덱스| LOB 인덱스 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#PCTVERSION과 RETENTION (읽기 일관성)| PCTVERSION과 RETENTION (읽기 일관성) ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조#일반 테이블 vs LOB의 읽기 일관성 차이| 일반 테이블 vs LOB의 읽기 일관성 차이 ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조#PCTVERSION vs RETENTION| PCTVERSION vs RETENTION ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB 세그먼트 정보 확인| LOB 세그먼트 정보 확인 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#SecureFile vs BasicFile| SecureFile vs BasicFile ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조#CACHE / NOCACHE / CACHE READS| CACHE / NOCACHE / CACHE READS ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB과 트랜잭션 - Locator의 실체|LOB과 트랜잭션 - Locator의 실체 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB 실전 튜닝 포인트|LOB 실전 튜닝 포인트 ]]&lt;br /&gt;
=== [[Lob 테스트|LOB 테스트(storage in row)]] ===&lt;br /&gt;
=== [[Lob chunk size 최적화 테스트]] ===&lt;br /&gt;
&lt;br /&gt;
== [[RAC환경 lob 튜닝]] ==&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1890</id>
		<title>오라클 LOB 데이터 구조</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%98%A4%EB%9D%BC%ED%81%B4_LOB_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B5%AC%EC%A1%B0&amp;diff=1890"/>
		<updated>2026-09-16T08:42:53Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* CLOB vs VARCHAR2 근본적 차이 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LOB(BLOB/CLOB)대용량 데이터 ==&lt;br /&gt;
=== 개요 ===&lt;br /&gt;
LOB(BLOB/CLOB)이 대용량 데이터를 저장하는 핵심 원리는 &#039;&#039;&#039;&amp;quot;포인터(로케이터) + 별도 세그먼트 분리 저장&amp;quot;&#039;&#039;&#039; 구조&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB&lt;br /&gt;
├── Internal LOB (DB 내부 저장)&lt;br /&gt;
│   ├── CLOB (Character LOB) - 문자 데이터&lt;br /&gt;
│   ├── NCLOB (National CLOB) - 다국어 문자셋&lt;br /&gt;
│   └── BLOB (Binary LOB) - 바이너리 데이터&lt;br /&gt;
└── External LOB&lt;br /&gt;
    └── BFILE - OS 파일시스템 참조 (읽기 전용)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CLOB vs VARCHAR2 근본적 차이 ====&lt;br /&gt;
::::# VARCHAR2: 최대 32767 bytes (PL/SQL , 19c 이상부터 SQL도 가능), 4000 bytes (SQL) - inline storage 강제&lt;br /&gt;
::::# CLOB: 최대 4GB * DB_BLOCK_SIZE (이론상 128TB) - out-of-line storage 가능&lt;br /&gt;
&lt;br /&gt;
=== LOB 저장 구조 (핵심) ===&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Table Row&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB LOCATOR │ ← 테이블 로우에 실제 저장되는 것 (포인터/핸들)&lt;br /&gt;
│ (약 4KB↓)   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB INDEX   │ ← LOB 청크들을 관리하는 B-Tree 인덱스&lt;br /&gt;
└─────────────┘&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ LOB SEGMENT │ ← 실제 데이터가 저장되는 세그먼트 (CHUNK 단위)&lt;br /&gt;
└─────────────┘&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 로케이터(LOCATOR) ===&lt;br /&gt;
# 테이블 로우에는 실제 데이터가 아니라 LOB 데이터를 가리키는 40바이트 내외의 로케이터(포인터)만 저장됨&lt;br /&gt;
# 실제 데이터는 별도의 LOB 세그먼트에 존재하고, 애플리케이션은 이 로케이터를 통해 스트리밍 방식(READ/WRITE by chunk)으로 데이터에 접근함&lt;br /&gt;
&lt;br /&gt;
=== In-row vs Out-of-row ===&lt;br /&gt;
:- 데이터 크기가 작으면(기본 임계값 관련, ENABLE STORAGE IN ROW) 로우 내부에 직접 저장&lt;br /&gt;
:- 임계값을 넘으면 별도의 LOB 세그먼트(out-of-row)에 체인 형태로 저장되고 로우에는 포인터만 남음&lt;br /&gt;
:- 이 덕분에 4000바이트 제한을 가진 VARCHAR2/RAW와 달리 최대 4GB(BasicFile) ~ (LOB) 단위까지 저장 가능&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
CLOB 데이터 크기 확인&lt;br /&gt;
    │&lt;br /&gt;
    ├── 4000 bytes 이하 (기본값)&lt;br /&gt;
    │   └── ENABLE STORAGE IN ROW&lt;br /&gt;
    │       → 로우 내부에 직접 저장 (Inline)&lt;br /&gt;
    │       → LOB Locator + 실제 데이터가 로우에 존재&lt;br /&gt;
    │&lt;br /&gt;
    └── 4000 bytes 초과 (또는 DISABLE STORAGE IN ROW)&lt;br /&gt;
        └── OUT OF ROW 강제 이동&lt;br /&gt;
            → 로우에는 LOB Locator만 존재&lt;br /&gt;
            → 실제 데이터는 별도 LOB Segment에 저장&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 저장 방식 확인 테스트&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
CREATE TABLE lob_test (&lt;br /&gt;
    id NUMBER,&lt;br /&gt;
    doc CLOB&lt;br /&gt;
) LOB (doc) STORE AS (&lt;br /&gt;
    ENABLE STORAGE IN ROW    -- 4000바이트 이하는 인라인&lt;br /&gt;
    CHUNK 8192                -- 청크 크기&lt;br /&gt;
    PCTVERSION 10              -- 버전 유지 비율&lt;br /&gt;
    NOCACHE                    -- 버퍼캐시 사용 안함&lt;br /&gt;
    LOGGING&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 성능 함정: 4000바이트 근처의 데이터가 빈번하게 업데이트되면 in-row ↔ out-of-row 전환이 발생하여 Row Migration과 유사한 오버헤드 발생.&lt;br /&gt;
&lt;br /&gt;
=== CHUNK 단위 저장 ===&lt;br /&gt;
# LOB 세그먼트는 내부적으로 CHUNK(기본 8KB, 블록 사이즈 배수) 단위로 분할 저장. &lt;br /&gt;
# 큰 데이터를 CHUNK들의 연결 리스트로 관리하기 때문에 부분 읽기/쓰기(random access)가 가능하고, 전체를 메모리에 올리지 않고도 스트리밍 처리가 가능.&lt;br /&gt;
&lt;br /&gt;
* CHUNK란?&lt;br /&gt;
** LOB 데이터의 최소 I/O 단위&lt;br /&gt;
** DB_BLOCK_SIZE의 배수여야 함 (기본값: DB_BLOCK_SIZE, 최대 32KB 권장)&lt;br /&gt;
** 하나의 CHUNK는 여러 Oracle Block으로 구성 가능하나, 하나의 익스텐트 내에 존재&lt;br /&gt;
==== CHUNK 설계 원칙 ====&lt;br /&gt;
&lt;br /&gt;
# 소량 다건 CLOB (예: 짧은 메모, 코멘트)&lt;br /&gt;
#:&amp;lt;source&amp;gt; CHUNK 8192   -- DB_BLOCK_SIZE와 동일하게&amp;lt;/source&amp;gt;&lt;br /&gt;
# 대용량 CLOB (예: 문서, XML)&lt;br /&gt;
#:&amp;lt;source&amp;gt; CHUNK 32768  -- 더 크게 설정하여 I/O 효율 극대화&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB 인덱스 ===&lt;br /&gt;
LOB 세그먼트의 CHUNK 위치를 추적하기 위해 별도의 LOB 인덱스가 존재합니다(B-tree 구조로 CHUNK 매핑 관리).&lt;br /&gt;
&lt;br /&gt;
* LOB 데이터가 여러 CHUNK에 걸쳐 저장될 때, 이 청크들의 순서와 위치를 관리하는 B-Tree 기반 인덱스.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
 LOB Locator (SETID + LENGTH 정보 포함)&lt;br /&gt;
    │&lt;br /&gt;
    ▼&lt;br /&gt;
LOB Index (CHUNK 순서 매핑)&lt;br /&gt;
    │&lt;br /&gt;
    ├── CHUNK 1 (위치: block#100)&lt;br /&gt;
    ├── CHUNK 2 (위치: block#105)&lt;br /&gt;
    └── CHUNK 3 (위치: block#250)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 왜 중요 한가?&lt;br /&gt;
# LOB의 부분 읽기/쓰기(Partial Read/Write) 시 이 인덱스를 통해 필요한 청크만 접근&lt;br /&gt;
# DBMS_LOB.READ(lob, amount, offset) 호출 시 인덱스를 스캔하여 offset에 해당하는 청크로 직행&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PCTVERSION과 RETENTION (읽기 일관성) ===&lt;br /&gt;
==== 일반 테이블 vs LOB의 읽기 일관성 차이 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! 일반 테이블 !! LOB&lt;br /&gt;
|-&lt;br /&gt;
| 메커니즘 || UNDO Segment || LOB 자체 버전 관리&lt;br /&gt;
|-&lt;br /&gt;
| 위치 || 별도 UNDO 테이블스페이스 || LOB Segment 내부&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 핵심: LOB은 UNDO를 사용하지 않고, 자체적으로 이전 버전 데이터를 LOB 세그먼트 내에 보관합니다.&lt;br /&gt;
&lt;br /&gt;
==== PCTVERSION vs RETENTION ====&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
-- 방식 1: 공간 비율 기반 (전통적 방식)&lt;br /&gt;
PCTVERSION 10   -- 전체 LOB 세그먼트의 10%를 old version 유지에 사용&lt;br /&gt;
                -- 초과 시 오래된 버전부터 재사용(overwrite)&lt;br /&gt;
&lt;br /&gt;
-- 방식 2: 시간 기반 (Oracle 10g 이후 권장)&lt;br /&gt;
RETENTION       -- UNDO_RETENTION 파라미터 값을 따름&lt;br /&gt;
                -- 자동 스페이스 관리(ASSM) tablespace 필요&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 실무 팁: 대용량 LOB이 빈번히 업데이트되는 시스템에서 PCTVERSION이 너무 낮으면 ORA-22924 에러(snapshot too old 유사 현상) 발생 가능.&lt;br /&gt;
&lt;br /&gt;
=== LOB 세그먼트 정보 확인 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, segment_name, index_name,&lt;br /&gt;
       chunk, pctversion, cache, logging, in_row&lt;br /&gt;
  FROM user_lobs -- dba_lobs&lt;br /&gt;
 WHERE table_name = &#039;YOUR_TABLE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SecureFile vs BasicFile ===&lt;br /&gt;
:- BasicFile: 전통적 방식, LOB 세그먼트에 체인 저장&lt;br /&gt;
:- SecureFile(11g+): ASSM 기반, 압축/중복제거/암호화 지원, 성능 개선된 구조로 대부분 권장&lt;br /&gt;
&lt;br /&gt;
즉, &amp;quot;행 안에 다 넣지 않고 별도 세그먼트에 청크 단위로 분산 저장 + 로케이터로 참조&amp;quot;하는 것이 대용량 저장의 핵심 메커니즘입니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 아키텍처 차이&lt;br /&gt;
|-&lt;br /&gt;
! 구분 !! BasicFile (Legacy) !! SecureFile (Modern)&lt;br /&gt;
|-&lt;br /&gt;
| 저장 구조 || 고정 청크 기반|| 가변 블록 + B-Tree 유사 구조&lt;br /&gt;
|-&lt;br /&gt;
| 압축 || 불가 || COMPRESS 옵션 지원&lt;br /&gt;
|-&lt;br /&gt;
| 중복제거 || 불가 || DEDUPLICATE 지원&lt;br /&gt;
|-&lt;br /&gt;
| 암호화 || 불가 || ENCRYPT 지원&lt;br /&gt;
|-&lt;br /&gt;
| 성능 || 불가  || 대폭 개선 (특히 순차 접근)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
# Oracle 19c LOB 저장 속성 정리&lt;br /&gt;
&lt;br /&gt;
## LOB STORAGE 절 기본 구조&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
LOB (column_name) STORE AS [SECUREFILE|BASICFILE] [lob_segment_name]&lt;br /&gt;
(&lt;br /&gt;
  TABLESPACE ...&lt;br /&gt;
  ENABLE|DISABLE STORAGE IN ROW&lt;br /&gt;
  CHUNK n&lt;br /&gt;
  PCTVERSION n | RETENTION [AUTO|MAX n|MIN n]&lt;br /&gt;
  FREEPOOLS n&lt;br /&gt;
  CACHE | NOCACHE | CACHE READS&lt;br /&gt;
  LOGGING | NOLOGGING&lt;br /&gt;
  COMPRESS [LOW|MEDIUM|HIGH]   -- SecureFile 전용 기능&lt;br /&gt;
  DEDUPLICATE | KEEP_DUPLICATES -- 동일 LOB 데이터 중복 제거 선택&lt;br /&gt;
  ENCRYPT ... | DECRYPT&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## 속성별 정리&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
! 속성 !! 설명 !! 비고 &lt;br /&gt;
|-&lt;br /&gt;
| **SECUREFILE / BASICFILE** || LOB 저장 방식 선택 || SecureFile 권장(기본값은 DB_SECUREFILE 파라미터에 따름) &lt;br /&gt;
|-&lt;br /&gt;
| **ENABLE/DISABLE STORAGE IN ROW** || 로우 내 인라인 저장 여부 || 임계값 이하 데이터는 IN ROW 저장 &lt;br /&gt;
|-&lt;br /&gt;
| **CHUNK** || LOB 저장 최소 단위(바이트) || 블록사이즈 배수, 기본 8K&lt;br /&gt;
|-&lt;br /&gt;
| **PCTVERSION** || (BasicFile 전용) 이전 버전 유지 공간 % || Undo 방식과 다른 read consistency &lt;br /&gt;
|-&lt;br /&gt;
| **RETENTION [AUTO/MAX/MIN]** || (SecureFile 전용) 버전 보존 정책 || AUTO가 일반적 &lt;br /&gt;
|-&lt;br /&gt;
| **CACHE / NOCACHE / CACHE READS** || 버퍼캐시 사용 여부 || 대용량은 보통 NOCACHE &lt;br /&gt;
|-&lt;br /&gt;
| **LOGGING / NOLOGGING** || Redo 생성 여부 || 대량 초기 적재시 NOLOGGING 고려 &lt;br /&gt;
|-&lt;br /&gt;
| **COMPRESS [LOW/MEDIUM/HIGH]** || (SecureFile 전용) 압축 레벨 || ACO(Advanced Compression) 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **DEDUPLICATE / KEEP_DUPLICATES** || (SecureFile 전용) 중복 제거 || ACO 라이선스 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **ENCRYPT / DECRYPT** || (SecureFile 전용) 투명 암호화 | TDE 필요 &lt;br /&gt;
|-&lt;br /&gt;
| **FREEPOOLS** || (SecureFile 전용) 동시성 향상용 free space pool 분리 || RAC 환경 동시 write 성능 &lt;br /&gt;
|}&lt;br /&gt;
## 🆕 19c 관련 New Feature / 변경사항&lt;br /&gt;
&lt;br /&gt;
**1. `DB_SECUREFILE` 파라미터 기본값 변경 없음, 단 SecureFile이 사실상 표준화**&lt;br /&gt;
- 12c부터 BasicFile은 &amp;quot;desupported&amp;quot;(deprecated) 상태 유지, 19c에서도 동일하게 BasicFile은 신규 개발에 비권장&lt;br /&gt;
&lt;br /&gt;
**2. LOB 관련 초기화 파라미터 정리 지속**&lt;br /&gt;
- `DB_SECUREFILE` 파라미터 값: `PERMITTED`(기본), `ALWAYS`, `FORCE`, `NEVER`, `IGNORE`&lt;br /&gt;
- 19c에서도 동일 옵션 유지, ALWAYS/FORCE 사용시 BasicFile 문법도 자동으로 SecureFile로 생성&lt;br /&gt;
&lt;br /&gt;
**3. JSON 관련 LOB 활용 강화 (19c 특징)**&lt;br /&gt;
- 19c의 확장된 JSON 지원(다중 JSON 컬럼, 부분 업데이트 등)이 내부적으로 SecureFile LOB 기반으로 동작 — LOB 자체의 새 절이라기보다는 LOB을 활용하는 상위 기능 확장&lt;br /&gt;
&lt;br /&gt;
**4. In-Memory 관련**&lt;br /&gt;
- 19c에서 `INMEMORY` 절은 LOB 자체에는 직접 적용 불가(LOB은 IM 컬럼 스토어 미지원) — 이 제약은 계속 유지됨(신규 아님, 혼동 주의사항으로 정리)&lt;br /&gt;
&lt;br /&gt;
**참고**: 19c 자체에서 LOB STORE AS 문법 자체에 **완전히 새로운 키워드가 추가된 것은 없고**, 12c~18c에서 도입된 SecureFile 관련 옵션들이 19c에서도 그대로 유지·강화되는 흐름입니다. 12c 이후 큰 변화는 없었고, 오히려 &amp;quot;BasicFile 지양, SecureFile 표준화&amp;quot;라는 정책적 방향이 19c에서 더 굳어진 것으로 보시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
특정 옵션(예: COMPRESS, DEDUPLICATE의 라이선스 조건이나 RAC FREEPOOLS 튜닝)에 대해 더 깊게 필요하시면 말씀해주세요.&lt;br /&gt;
&lt;br /&gt;
==== CACHE / NOCACHE / CACHE READS ====&lt;br /&gt;
:* 소량/빈번 접근 LOB: CACHE (예: 사용자 프로필 이미지 썸네일)&lt;br /&gt;
:* 대량/1회성 접근 LOB: NOCACHE (예: 로그 파일, 대용량 첨부파일)&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source&amp;gt;&lt;br /&gt;
-- 옵션 1: CACHE&lt;br /&gt;
-- LOB 데이터를 Buffer Cache에 정상적으로 캐싱 (일반 테이블처럼)&lt;br /&gt;
CACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 2: NOCACHE (기본값)&lt;br /&gt;
-- Direct Path I/O 사용, Buffer Cache 우회&lt;br /&gt;
-- 대용량 LOB에 적합 (캐시 오염 방지)&lt;br /&gt;
NOCACHE&lt;br /&gt;
&lt;br /&gt;
-- 옵션 3: CACHE READS&lt;br /&gt;
-- 쓰기는 NOCACHE처럼, 읽기는 CACHE처럼 동작&lt;br /&gt;
CACHE READS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOB과 트랜잭션 - Locator의 실체 ===&lt;br /&gt;
* LOB Locator 내부 구조 (개념적)&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
LOB Locator = {&lt;br /&gt;
    LOB Type (CLOB/BLOB/BFILE)&lt;br /&gt;
    LOB Length&lt;br /&gt;
    Chunk Size&lt;br /&gt;
    Position (현재 커서 위치 - 세션 내에서만 유효)&lt;br /&gt;
    ... (내부 메타데이터)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 핵심 함정: LOB Locator의 생명주기&lt;br /&gt;
** 잘못된 사용 예 - LOB Locator를 커밋 후 재사용&lt;br /&gt;
**:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
DECLARE&lt;br /&gt;
    l_clob CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT doc INTO l_clob FROM lob_test WHERE id=1;&lt;br /&gt;
    COMMIT;  -- ← 이 시점 이후 l_clob 사용 시 위험할 수 있음&lt;br /&gt;
    DBMS_LOB.READ(l_clob, ...);  -- ORA-22990 가능성&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 원리: LOB Locator는 트랜잭션과 밀접하게 연관되어 있으며, 특정 상황(특히 원격 LOB이나 트랜잭션 경계를 넘는 경우)에서 무효화될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
=== LOB 실전 튜닝 포인트 ===&lt;br /&gt;
1. Fragmentation 확인&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT segment_name, bytes/1024/1024 MB, blocks&lt;br /&gt;
FROM dba_segments &lt;br /&gt;
WHERE segment_name IN (SELECT segment_name FROM dba_lobs WHERE table_name=&#039;X&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. In-row vs Out-row 비율 확인 (실제 데이터 분포)&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
         ELSE &#039;OUT_ROW&#039; END,&lt;br /&gt;
    COUNT(*)&lt;br /&gt;
FROM lob_test&lt;br /&gt;
GROUP BY CASE WHEN LENGTHB(doc) &amp;lt;= 4000 THEN &#039;IN_ROW_CANDIDATE&#039; &lt;br /&gt;
              ELSE &#039;OUT_ROW&#039; END;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Chunk 사용 효율성 (파편화 여부)&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT table_name, column_name, chunk &lt;br /&gt;
FROM user_lobs;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1889</id>
		<title>ORACLE LOB</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1889"/>
		<updated>2026-09-16T08:42:32Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* LOB의 구조와 원리 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[오라클 LOB 데이터 구조|LOB의 구조와 원리]] ==&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#개요|개요]] &lt;br /&gt;
::## [[오라클 LOB 데이터 구조#CLOB vs VARCHAR2 근본적 차이| CLOB vs VARCHAR2 근본적 차이 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB 저장 구조 (핵심)| LOB 저장 구조 (핵심) ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB 로케이터(LOCATOR)| LOB 로케이터(LOCATOR) ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#In-row vs Out-of-row| In-row vs Out-of-row ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#CHUNK 단위 저장| CHUNK 단위 저장 ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조#CHUNK 설계 원칙| CHUNK 설계 원칙 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB 인덱스| LOB 인덱스 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#PCTVERSION과 RETENTION (읽기 일관성)| PCTVERSION과 RETENTION (읽기 일관성) ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조#일반 테이블 vs LOB의 읽기 일관성 차이| 일반 테이블 vs LOB의 읽기 일관성 차이 ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조#PCTVERSION vs RETENTION| PCTVERSION vs RETENTION ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#LOB 세그먼트 정보 확인| LOB 세그먼트 정보 확인 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#SecureFile vs BasicFile| SecureFile vs BasicFile ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조#CACHE / NOCACHE / CACHE READS| CACHE / NOCACHE / CACHE READS ]]&lt;br /&gt;
# LOB과 트랜잭션 - Locator의 실체 &lt;br /&gt;
# LOB 실전 튜닝 포인트 &lt;br /&gt;
=== [[Lob 테스트|LOB 테스트(storage in row)]] ===&lt;br /&gt;
=== [[Lob chunk size 최적화 테스트]] ===&lt;br /&gt;
&lt;br /&gt;
== [[RAC환경 lob 튜닝]] ==&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1888</id>
		<title>ORACLE LOB</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1888"/>
		<updated>2026-09-16T08:41:55Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* LOB의 구조와 원리 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[오라클 LOB 데이터 구조|LOB의 구조와 원리]] ==&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#개요|개요]] &lt;br /&gt;
::## [[오라클 LOB 데이터 구조# CLOB vs VARCHAR2 근본적 차이| CLOB vs VARCHAR2 근본적 차이 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조# LOB 저장 구조 (핵심)| LOB 저장 구조 (핵심) ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조# LOB 로케이터(LOCATOR)| LOB 로케이터(LOCATOR) ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조# In-row vs Out-of-row| In-row vs Out-of-row ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조# CHUNK 단위 저장| CHUNK 단위 저장 ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조# CHUNK 설계 원칙| CHUNK 설계 원칙 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조# LOB 인덱스| LOB 인덱스 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조# PCTVERSION과 RETENTION (읽기 일관성)| PCTVERSION과 RETENTION (읽기 일관성) ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조# 일반 테이블 vs LOB의 읽기 일관성 차이| 일반 테이블 vs LOB의 읽기 일관성 차이 ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조# PCTVERSION vs RETENTION| PCTVERSION vs RETENTION ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조# LOB 세그먼트 정보 확인| LOB 세그먼트 정보 확인 ]]&lt;br /&gt;
::# [[오라클 LOB 데이터 구조# SecureFile vs BasicFile| SecureFile vs BasicFile ]]&lt;br /&gt;
::## [[오라클 LOB 데이터 구조# CACHE / NOCACHE / CACHE READS| CACHE / NOCACHE / CACHE READS ]]&lt;br /&gt;
# LOB과 트랜잭션 - Locator의 실체 &lt;br /&gt;
# LOB 실전 튜닝 포인트 &lt;br /&gt;
=== [[Lob 테스트|LOB 테스트(storage in row)]] ===&lt;br /&gt;
=== [[Lob chunk size 최적화 테스트]] ===&lt;br /&gt;
&lt;br /&gt;
== [[RAC환경 lob 튜닝]] ==&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1887</id>
		<title>ORACLE LOB</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1887"/>
		<updated>2026-09-16T08:40:18Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[오라클 LOB 데이터 구조|LOB의 구조와 원리]] ==&lt;br /&gt;
::# [[오라클 LOB 데이터 구조#개요|개요]] &lt;br /&gt;
## CLOB vs VARCHAR2 근본적 차이 &lt;br /&gt;
# LOB 저장 구조 (핵심) &lt;br /&gt;
# LOB 로케이터(LOCATOR) &lt;br /&gt;
# In-row vs Out-of-row &lt;br /&gt;
# CHUNK 단위 저장 &lt;br /&gt;
## CHUNK 설계 원칙 &lt;br /&gt;
# LOB 인덱스 &lt;br /&gt;
# PCTVERSION과 RETENTION (읽기 일관성) &lt;br /&gt;
## 일반 테이블 vs LOB의 읽기 일관성 차이 &lt;br /&gt;
## PCTVERSION vs RETENTION &lt;br /&gt;
# LOB 세그먼트 정보 확인 &lt;br /&gt;
# SecureFile vs BasicFile &lt;br /&gt;
## CACHE / NOCACHE / CACHE READS &lt;br /&gt;
# LOB과 트랜잭션 - Locator의 실체 &lt;br /&gt;
# LOB 실전 튜닝 포인트 &lt;br /&gt;
=== [[Lob 테스트|LOB 테스트(storage in row)]] ===&lt;br /&gt;
=== [[Lob chunk size 최적화 테스트]] ===&lt;br /&gt;
== [[RAC환경 lob 튜닝]] ==&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1886</id>
		<title>ORACLE LOB</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1886"/>
		<updated>2026-09-16T08:39:50Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[오라클 LOB 데이터 구조|LOB의 구조와 원리]] ==&lt;br /&gt;
::# 개요 &lt;br /&gt;
## CLOB vs VARCHAR2 근본적 차이 &lt;br /&gt;
# LOB 저장 구조 (핵심) &lt;br /&gt;
# LOB 로케이터(LOCATOR) &lt;br /&gt;
# In-row vs Out-of-row &lt;br /&gt;
# CHUNK 단위 저장 &lt;br /&gt;
## CHUNK 설계 원칙 &lt;br /&gt;
# LOB 인덱스 &lt;br /&gt;
# PCTVERSION과 RETENTION (읽기 일관성) &lt;br /&gt;
## 일반 테이블 vs LOB의 읽기 일관성 차이 &lt;br /&gt;
## PCTVERSION vs RETENTION &lt;br /&gt;
# LOB 세그먼트 정보 확인 &lt;br /&gt;
# SecureFile vs BasicFile &lt;br /&gt;
## CACHE / NOCACHE / CACHE READS &lt;br /&gt;
# LOB과 트랜잭션 - Locator의 실체 &lt;br /&gt;
# LOB 실전 튜닝 포인트 &lt;br /&gt;
=== [[Lob 테스트|LOB 테스트(storage in row)]] ===&lt;br /&gt;
=== [[Lob chunk size 최적화 테스트]] ===&lt;br /&gt;
== [[RAC환경 lob 튜닝]] ==&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1885</id>
		<title>ORACLE LOB</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=ORACLE_LOB&amp;diff=1885"/>
		<updated>2026-09-16T08:39:32Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[오라클 LOB 데이터 구조|LOB의 구조와 원리]] ==&lt;br /&gt;
# 개요 &lt;br /&gt;
## CLOB vs VARCHAR2 근본적 차이 &lt;br /&gt;
# LOB 저장 구조 (핵심) &lt;br /&gt;
# LOB 로케이터(LOCATOR) &lt;br /&gt;
# In-row vs Out-of-row &lt;br /&gt;
# CHUNK 단위 저장 &lt;br /&gt;
## CHUNK 설계 원칙 &lt;br /&gt;
# LOB 인덱스 &lt;br /&gt;
# PCTVERSION과 RETENTION (읽기 일관성) &lt;br /&gt;
## 일반 테이블 vs LOB의 읽기 일관성 차이 &lt;br /&gt;
## PCTVERSION vs RETENTION &lt;br /&gt;
# LOB 세그먼트 정보 확인 &lt;br /&gt;
# SecureFile vs BasicFile &lt;br /&gt;
## CACHE / NOCACHE / CACHE READS &lt;br /&gt;
# LOB과 트랜잭션 - Locator의 실체 &lt;br /&gt;
# LOB 실전 튜닝 포인트 &lt;br /&gt;
=== [[Lob 테스트|LOB 테스트(storage in row)]] ===&lt;br /&gt;
=== [[Lob chunk size 최적화 테스트]] ===&lt;br /&gt;
== [[RAC환경 lob 튜닝]] ==&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EC%A4%91%EC%9A%94&amp;diff=1884</id>
		<title>틀:중요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EC%A4%91%EC%9A%94&amp;diff=1884"/>
		<updated>2026-09-16T08:36:32Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;libre-notice {{{속성|}}}&amp;quot; {{#if:{{{id|}}}|id=&amp;quot;{{{id}}}&amp;quot;}} style=&amp;quot;margin: 8px 0; padding: 8px; border-style: solid; border-width: 2px 0; background-color: {{{배경색|#23272f}}}; border-width: {{{선굵기|2px 0}}}; border-color: {{{테두리색|#fffafa}}}; width: {{{사이즈|100%}}}; border-radius: {{{둥굴기|0px}}}; border-style: {{{스타일|solid}}}; clear: both;&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;{{{아이콘색|orangered}}}&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;material-icons icon-image-preview&amp;quot; style=&amp;quot;display: inline-block;transform: translate(10%, 25%);&amp;quot;&amp;gt;{{{아이콘이름|blur_on}}}&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font style=&amp;quot;color: {{{폰트색|#fffafa}}}&amp;quot;&amp;gt;{{{내용|{{{1&amp;lt;noinclude&amp;gt;|[[{{SITENAME}}]] 중요 스타일 입니다.&amp;lt;/noinclude&amp;gt;}}}}}}&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EC%A4%91%EC%9A%94&amp;diff=1883</id>
		<title>틀:중요</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%8B%80:%EC%A4%91%EC%9A%94&amp;diff=1883"/>
		<updated>2026-09-16T08:36:11Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;libre-notice {{{속성|}}}&amp;quot; {{#if:{{{id|}}}|id=&amp;quot;{{{id}}}&amp;quot;}} style=&amp;quot;margin: 8px 0; padding: 8px; border-style: solid; border-width: 2px 0; background-color: {{{배경색|#23272f}}}; border-width: {{{선굵기|2px 0}}}; border-color: {{{테두리색|#fffafa}}}; width: {{{사이즈|100%}}}; border-radius: {{{둥굴기|0px}}}; border-style: {{{스타일|solid}}}; clear: both;&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;{{{아이콘색|orangered}}}&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;material-icons icon-image-preview&amp;quot; style=&amp;quot;display: inline-block;transform: translate(10%, 25%);&amp;quot;&amp;gt;{{{아이콘이름|blur_on}}}&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font style=&amp;quot;color: {{{폰트색|#fffafa}}}&amp;quot;&amp;gt;{{{내용|{{{1&amp;lt;noinclude&amp;gt;|[[{{SITENAME}}]] 알림 스타일입니다.&amp;lt;/noinclude&amp;gt;}}}}}}&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1882</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1882"/>
		<updated>2026-09-16T08:31:20Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{결론&lt;br /&gt;
|내용= [결론] Cardinality   vs. Selectivity&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 미친다.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1881</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1881"/>
		<updated>2026-09-16T08:31:04Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{결론&lt;br /&gt;
|내용= [결론] &lt;br /&gt;
Cardinality   vs. Selectivity&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 미친다.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1880</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1880"/>
		<updated>2026-09-16T08:30:36Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{결론&lt;br /&gt;
|내용= [결론] Cardinality   vs. Selectivity&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 미친다.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1879</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1879"/>
		<updated>2026-09-16T08:30:12Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{결론&lt;br /&gt;
|내용= Cardinality   vs. Selectivity&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 미친다.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1878</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1878"/>
		<updated>2026-09-16T08:29:30Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{결론&lt;br /&gt;
|내용= Cardinality   vs. Selectivity&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 미친다.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1877</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1877"/>
		<updated>2026-09-16T08:27:58Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{결론&lt;br /&gt;
|내용= ***&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1876</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1876"/>
		<updated>2026-09-16T08:27:36Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{결론&lt;br /&gt;
|내용=&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1875</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1875"/>
		<updated>2026-09-16T08:26:50Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{결론&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1874</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1874"/>
		<updated>2026-09-16T08:26:05Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:결론&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1873</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1873"/>
		<updated>2026-09-16T08:25:43Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1872</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1872"/>
		<updated>2026-09-16T08:25:26Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 핵심 차이점 요약 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 핵심 차이점 요약&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1871</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1871"/>
		<updated>2026-09-16T08:24:49Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::# 통계 정확도 확인&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::# 결과:&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1870</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1870"/>
		<updated>2026-09-16T08:24:09Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::#: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: * 결과:&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1869</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1869"/>
		<updated>2026-09-16T08:24:00Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: * 결과:&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1868</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1868"/>
		<updated>2026-09-16T08:23:51Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::# 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: * 결과:&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1867</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1867"/>
		<updated>2026-09-16T08:23:34Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::# 인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: * 결과:&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1866</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1866"/>
		<updated>2026-09-16T08:23:27Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
# 인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: * 결과:&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1865</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1865"/>
		<updated>2026-09-16T08:23:13Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
#:::  인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: * 결과:&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1864</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1864"/>
		<updated>2026-09-16T08:23:02Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::: # 인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: * 결과:&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1863</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1863"/>
		<updated>2026-09-16T08:22:43Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무에서의 중요성 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
::: 1. 인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::: 3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: * 결과:&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1862</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1862"/>
		<updated>2026-09-16T08:21:57Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무 예제 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::::-- Query 1&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
::::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 2&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
::::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
::::-- Query 3&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
::::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
&lt;br /&gt;
1. 인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1861</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1861"/>
		<updated>2026-09-16T08:21:25Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실행 계획 확인 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::-- Query 1&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
:::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
:::-- Query 2&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
:::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
:::-- Query 3&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
:::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::*실행 계획 결과:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
&lt;br /&gt;
1. 인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1860</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1860"/>
		<updated>2026-09-16T08:21:06Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::-- Query 1&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
:::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
:::-- Query 2&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
:::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
:::-- Query 3&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
:::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*실행 계획 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
&lt;br /&gt;
1. 인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1859</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1859"/>
		<updated>2026-09-16T08:20:32Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무 예제 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::-- Query 1&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
:::* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
:::-- Query 2&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
:::* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
:::-- Query 3&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
:::* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*실행 계획 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
&lt;br /&gt;
1. 인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1858</id>
		<title>카디널리티 와 셀렉티비티</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0_%EC%99%80_%EC%85%80%EB%A0%89%ED%8B%B0%EB%B9%84%ED%8B%B0&amp;diff=1858"/>
		<updated>2026-09-16T08:20:05Z</updated>

		<summary type="html">&lt;p&gt;Dbstudy: /* 실무 예제 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cardinality (카디널리티) 와 Selectivity (선택도) ==&lt;br /&gt;
{{핵심&lt;br /&gt;
|제목= &amp;lt;big&amp;gt;&#039;&#039;&#039;핵심: High Cardinality = Low Selectivity = 인덱스 효과적 = 성능 좋음&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cardinality (카디널리티,고유값 수)&#039;&#039;&#039;&lt;br /&gt;
** 특정 연산이나 조건에서 반환되는 예상 행의 개수&lt;br /&gt;
** 절대적인 수치 (행 개수)&lt;br /&gt;
** 실행 계획의 “Rows” 컬럼에 표시됨&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별 컬럼: Cardinality = 2 (남, 여)&lt;br /&gt;
     주민번호 컬럼: Cardinality = 1,000,000 (100만 명이면 100만)&lt;br /&gt;
&lt;br /&gt;
::* &#039;&#039;&#039;Selectivity (선택도)&#039;&#039;&#039;&lt;br /&gt;
** 전체 행 중에서 조건을 만족하는 행의 비율 (선택된 row 수 / 전체 row 수)&lt;br /&gt;
** 상대적인 비율 (0 ~ 1 사이의 값, 또는 0% ~ 100%)&lt;br /&gt;
** 조건의 “선택적” 정도를 나타냄&lt;br /&gt;
:: 예시:&lt;br /&gt;
     성별=&#039;남&#039;: Selectivity = 0.5 (50%)&lt;br /&gt;
     특정 주민번호: Selectivity = 0.000001 (0.0001%)&lt;br /&gt;
&lt;br /&gt;
|내용 =실무에서 사용하는 방식&lt;br /&gt;
&lt;br /&gt;
&amp;quot;이 컬럼 카디널리티가 높아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
= &amp;quot;이 컬럼 고유값이 많아서 인덱스 효과 좋을 거야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;성별 컬럼은 카디널리티가 2야&amp;quot;&lt;br /&gt;
= &amp;quot;성별 컬럼은 고유값이 2개야&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;카디널리티 체크해봐&amp;quot;= &amp;quot;고유값 개수 확인해봐&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
Cardinality = Total Rows × Selectivity&lt;br /&gt;
&lt;br /&gt;
Selectivity = Cardinality / Total Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무 예제 ===&lt;br /&gt;
&lt;br /&gt;
:::* 예제 1: 단순 테이블&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 직원 테이블&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id NUMBER,&lt;br /&gt;
    dept_id NUMBER,&lt;br /&gt;
    salary NUMBER,&lt;br /&gt;
    status VARCHAR2(20)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 통계 정보&lt;br /&gt;
-- Total Rows: 10,000명&lt;br /&gt;
-- dept_id = 10: 500명&lt;br /&gt;
-- salary &amp;gt; 5000: 3,000명&lt;br /&gt;
-- status = &#039;ACTIVE&#039;: 9,000명&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Query 1&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Selectivity = 500 / 10,000 = 0.05 (5%)&lt;br /&gt;
* Cardinality = 500 (행)&lt;br /&gt;
&lt;br /&gt;
-- Query 2&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE salary &amp;gt; 5000;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Selectivity = 3,000 / 10,000 = 0.3 (30%)&lt;br /&gt;
* Cardinality = 3,000 (행)&lt;br /&gt;
&lt;br /&gt;
-- Query 3&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM employees WHERE status = &#039;ACTIVE&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Selectivity = 9,000 / 10,000 = 0.9 (90%)&lt;br /&gt;
* Cardinality = 9,000 (행)&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 확인 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(&#039;SCOTT&#039;, &#039;EMPLOYEES&#039;);&lt;br /&gt;
&lt;br /&gt;
-- 실행 계획 확인&lt;br /&gt;
EXPLAIN PLAN FOR&lt;br /&gt;
SELECT * FROM employees WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*실행 계획 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
|   0 | SELECT STATEMENT  |           |   500 |  5000 |    10   (0)|&lt;br /&gt;
|*  1 |  TABLE ACCESS FULL| EMPLOYEES |   500 |  5000 |    10   (0)|&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   1 - filter(&amp;quot;DEPT_ID&amp;quot;=10)&lt;br /&gt;
&lt;br /&gt;
Rows = 500  ← 이것이 Cardinality&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Selectivity 계산 공식===&lt;br /&gt;
:::1. 등호(=) 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column = value&lt;br /&gt;
&lt;br /&gt;
Selectivity = 1 / NUM_DISTINCT&lt;br /&gt;
&lt;br /&gt;
예: dept_id의 distinct 값이 20개&lt;br /&gt;
Selectivity = 1 / 20 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::2. 범위 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column &amp;gt; value&lt;br /&gt;
&lt;br /&gt;
Selectivity = (MAX_VALUE - value) / (MAX_VALUE - MIN_VALUE)&lt;br /&gt;
&lt;br /&gt;
예: salary BETWEEN 3000 AND 10000&lt;br /&gt;
    조건: salary &amp;gt; 5000&lt;br /&gt;
Selectivity = (10000 - 5000) / (10000 - 3000) = 5000/7000 ≈ 0.71&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::3. NULL 조건&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE column IS NULL&lt;br /&gt;
&lt;br /&gt;
Selectivity = NUM_NULLS / NUM_ROWS&lt;br /&gt;
&lt;br /&gt;
예: 10,000행 중 500개가 NULL&lt;br /&gt;
Selectivity = 500 / 10,000 = 0.05&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::4. 복합 조건 (AND)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 AND col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Selectivity(col1) × Selectivity(col2)&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 × 0.1 = 0.005 (0.5%)&lt;br /&gt;
Cardinality = 10,000 × 0.005 = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::5. 복합 조건 (OR)&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- WHERE col1 = 10 OR col2 = &#039;A&#039;&lt;br /&gt;
&lt;br /&gt;
Selectivity = Sel(col1) + Sel(col2) - (Sel(col1) × Sel(col2))&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
Selectivity(col1) = 0.05&lt;br /&gt;
Selectivity(col2) = 0.1&lt;br /&gt;
Total Selectivity = 0.05 + 0.1 - (0.05 × 0.1) = 0.145&lt;br /&gt;
Cardinality = 10,000 × 0.145 = 1,450&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 통계 정보에서 확인 ===&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity 관련 통계&lt;br /&gt;
SELECT table_name, &lt;br /&gt;
       column_name,&lt;br /&gt;
       num_distinct,     -- distinct 값 개수&lt;br /&gt;
       num_nulls,        -- NULL 개수&lt;br /&gt;
       density,          -- 1/num_distinct (Selectivity)&lt;br /&gt;
       num_rows          -- 전체 행 수&lt;br /&gt;
FROM user_tab_col_statistics&lt;br /&gt;
WHERE table_name = &#039;EMPLOYEES&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::* 결과 예시:&lt;br /&gt;
:::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
COLUMN_NAME  NUM_DISTINCT  NUM_NULLS  DENSITY   NUM_ROWS&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
EMP_ID       10000         0          0.0001    10000&lt;br /&gt;
DEPT_ID      20            0          0.05      10000  ← Selectivity&lt;br /&gt;
SALARY       500           100        0.002     10000&lt;br /&gt;
STATUS       2             0          0.5       10000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실무에서의 중요성 ===&lt;br /&gt;
&lt;br /&gt;
1. 인덱스 생성 판단&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Selectivity가 낮을수록 (선택적일수록) 인덱스 효과 좋음&lt;br /&gt;
&lt;br /&gt;
-- 좋은 경우 (Selectivity: 0.001%)&lt;br /&gt;
CREATE INDEX idx_emp_id ON employees(emp_id);&lt;br /&gt;
-- emp_id는 고유값, 조회 시 1-2건만 반환&lt;br /&gt;
&lt;br /&gt;
-- 나쁜 경우 (Selectivity: 90%)&lt;br /&gt;
CREATE INDEX idx_status ON employees(status);&lt;br /&gt;
-- status는 ACTIVE/INACTIVE 2개 값, 조회 시 9000건 반환&lt;br /&gt;
-- Full Table Scan이 더 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. 조인 순서 결정&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Cardinality가 작은 테이블을 먼저 처리&lt;br /&gt;
&lt;br /&gt;
SELECT /*+ LEADING(d e) */ *&lt;br /&gt;
FROM departments d&lt;br /&gt;
JOIN employees e ON d.dept_id = e.dept_id&lt;br /&gt;
WHERE d.location = &#039;SEOUL&#039;;&lt;br /&gt;
&lt;br /&gt;
-- d 테이블의 Cardinality: 10 (Selectivity 1%)&lt;br /&gt;
-- e 테이블의 Cardinality: 10000 (Selectivity 100%)&lt;br /&gt;
-- → departments를 먼저 필터링하는 것이 효율적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. 통계 정확도 확인&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 실제 Cardinality vs 예상 Cardinality&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
FROM employees&lt;br /&gt;
WHERE dept_id = 10;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=&amp;gt;&#039;ALLSTATS LAST&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
| Id | Operation         | Name | Starts | E-Rows | A-Rows | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT  |      |      1 |        |    520 | ...&lt;br /&gt;
|* 1 | TABLE ACCESS FULL | EMP  |      1 |    500 |    520 | ...&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
E-Rows: 500  ← 예상 Cardinality (Estimated)&lt;br /&gt;
A-Rows: 520  ← 실제 Cardinality (Actual)&lt;br /&gt;
차이: 4% (통계가 정확함)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 핵심 차이점 요약 ===&lt;br /&gt;
:::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 캡션 텍스트&lt;br /&gt;
|-&lt;br /&gt;
!구분     !! Cardinality   !! Selectivity&lt;br /&gt;
|-&lt;br /&gt;
|의미 ||반환되는 행의 개수   ||선택되는 행의 비율 &lt;br /&gt;
|-&lt;br /&gt;
|단위 ||행 (rows)      ||비율 (0~1)   &lt;br /&gt;
|-&lt;br /&gt;
|타입 ||절대값           ||상대값        &lt;br /&gt;
|-&lt;br /&gt;
|사용처||실행 계획, Cost 계산||조건 효율성 판단  &lt;br /&gt;
|-&lt;br /&gt;
|예시 ||500 rows      ||5% (0.05)  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 실무 팁: Selectivity가 5% 이하일 때 인덱스 사용이 효과적이고, Cardinality는 조인 순서와 메모리 할당에 영향을 줍니다!​​​​​​​​​​​​​​​​&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
</feed>