<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%8A%9C%EB%8B%9D_%EC%8B%AC%ED%99%94</id>
	<title>인덱스 튜닝 심화 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%8A%9C%EB%8B%9D_%EC%8B%AC%ED%99%94"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%8A%9C%EB%8B%9D_%EC%8B%AC%ED%99%94&amp;action=history"/>
	<updated>2026-11-04T06:03:22Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%8A%9C%EB%8B%9D_%EC%8B%AC%ED%99%94&amp;diff=1993&amp;oldid=prev</id>
		<title>Dbstudy: 상단 배너를 {{타이틀 주제}} 틀로 교체</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%8A%9C%EB%8B%9D_%EC%8B%AC%ED%99%94&amp;diff=1993&amp;oldid=prev"/>
		<updated>2026-11-04T04:26:21Z</updated>

		<summary type="html">&lt;p&gt;상단 배너를 {{타이틀 주제}} 틀로 교체&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026년 11월 4일 (수) 13:26 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;1번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;1번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;div style=&amp;quot;background:linear-gradient(135deg,#0f2b46 0%,#1d4e7a 55%,#2b7bb9 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(15,43,70,0.25);&amp;quot;&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{타이틀 주제&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;div style&lt;/del&gt;=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;font-size:12px;letter-spacing:3px;opacity:0.8;margin-bottom:6px;&amp;quot;&amp;gt;&lt;/del&gt;ORACLE SQL TUNING · DEEP DIVE 1&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|부제 &lt;/ins&gt;= ORACLE SQL TUNING · DEEP DIVE 1&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;div style&lt;/del&gt;=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;font-size:28px;font-weight:700;line-height:1.3;&amp;quot;&amp;gt;&lt;/del&gt;인덱스 튜닝 심화&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|제목 &lt;/ins&gt;= 인덱스 튜닝 심화&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;div style&lt;/del&gt;=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;font-size:15px;opacity:0.92;margin-top:10px;line-height:1.7;&amp;quot;&amp;gt;&lt;/del&gt;인덱스 액세스 비용의 구조, 결합 인덱스 설계, 랜덤 액세스 최소화, 인덱스 운영 관리까지&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|설명 &lt;/ins&gt;= 인덱스 액세스 비용의 구조, 결합 인덱스 설계, 랜덤 액세스 최소화, 인덱스 운영 관리까지&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;div style&lt;/del&gt;=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;margin-top:16px;display:flex;flex-wrap:wrap;gap:8px;&amp;quot;&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|색상 &lt;/ins&gt;= &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;파랑&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;span style&lt;/del&gt;=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;background:rgba(255,255,255,0.18);border:1px solid rgba(255,255,255,0.35);padding:4px 12px;border-radius:20px;font-size:12px;&amp;quot;&amp;gt;&lt;/del&gt;선수 학습 · [[SQL 튜닝 입문]] 6장, [[실행계획 읽기 실습]]&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/span&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|배지1 &lt;/ins&gt;= 선수 학습 · [[SQL 튜닝 입문]] 6장, [[실행계획 읽기 실습]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;span style&lt;/del&gt;=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;background:rgba(255,255,255,0.18);border:1px solid rgba(255,255,255,0.35);padding:4px 12px;border-radius:20px;font-size:12px;&amp;quot;&amp;gt;&lt;/del&gt;커리큘럼 · 6~7주차&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/span&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|배지2 &lt;/ins&gt;= 커리큘럼 · 6~7주차&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;span style&lt;/del&gt;=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;background:rgba(255,255,255,0.18);border:1px solid rgba(255,255,255,0.35);padding:4px 12px;border-radius:20px;font-size:12px;&amp;quot;&amp;gt;&lt;/del&gt;난이도 · 중급&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/span&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|배지3 &lt;/ins&gt;= 난이도 · 중급&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;__TOC__&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;__TOC__&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%8A%9C%EB%8B%9D_%EC%8B%AC%ED%99%94&amp;diff=1983&amp;oldid=prev</id>
		<title>Dbstudy: 새 문서: &lt;div style=&quot;background:linear-gradient(135deg,#0f2b46 0%,#1d4e7a 55%,#2b7bb9 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(15,43,70,0.25);&quot;&gt; &lt;div style=&quot;font-size:12px;letter-spacing:3px;opacity:0.8;margin-bottom:6px;&quot;&gt;ORACLE SQL TUNING · DEEP DIVE 1&lt;/div&gt; &lt;div style=&quot;font-size:28px;font-weight:700;line-height:1.3;&quot;&gt;인덱스 튜닝 심화&lt;/div&gt; &lt;div style=&quot;font-size:15px;opacity:0.92;margin-top:10px;line-height:1.7;&quot;&gt;인...</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%8A%9C%EB%8B%9D_%EC%8B%AC%ED%99%94&amp;diff=1983&amp;oldid=prev"/>
		<updated>2026-11-04T03:55:53Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &amp;lt;div style=&amp;quot;background:linear-gradient(135deg,#0f2b46 0%,#1d4e7a 55%,#2b7bb9 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(15,43,70,0.25);&amp;quot;&amp;gt; &amp;lt;div style=&amp;quot;font-size:12px;letter-spacing:3px;opacity:0.8;margin-bottom:6px;&amp;quot;&amp;gt;ORACLE SQL TUNING · DEEP DIVE 1&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;font-size:28px;font-weight:700;line-height:1.3;&amp;quot;&amp;gt;인덱스 튜닝 심화&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;font-size:15px;opacity:0.92;margin-top:10px;line-height:1.7;&amp;quot;&amp;gt;인...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;div style=&amp;quot;background:linear-gradient(135deg,#0f2b46 0%,#1d4e7a 55%,#2b7bb9 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(15,43,70,0.25);&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:12px;letter-spacing:3px;opacity:0.8;margin-bottom:6px;&amp;quot;&amp;gt;ORACLE SQL TUNING · DEEP DIVE 1&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:28px;font-weight:700;line-height:1.3;&amp;quot;&amp;gt;인덱스 튜닝 심화&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:15px;opacity:0.92;margin-top:10px;line-height:1.7;&amp;quot;&amp;gt;인덱스 액세스 비용의 구조, 결합 인덱스 설계, 랜덤 액세스 최소화, 인덱스 운영 관리까지&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:16px;display:flex;flex-wrap:wrap;gap:8px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background:rgba(255,255,255,0.18);border:1px solid rgba(255,255,255,0.35);padding:4px 12px;border-radius:20px;font-size:12px;&amp;quot;&amp;gt;선수 학습 · [[SQL 튜닝 입문]] 6장, [[실행계획 읽기 실습]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background:rgba(255,255,255,0.18);border:1px solid rgba(255,255,255,0.35);padding:4px 12px;border-radius:20px;font-size:12px;&amp;quot;&amp;gt;커리큘럼 · 6~7주차&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background:rgba(255,255,255,0.18);border:1px solid rgba(255,255,255,0.35);padding:4px 12px;border-radius:20px;font-size:12px;&amp;quot;&amp;gt;난이도 · 중급&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. 인덱스 액세스 비용의 구조 ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex;flex-wrap:wrap;gap:10px;margin:14px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 220px;background:#eaf3fb;border-radius:10px;padding:14px;text-align:center;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;color:#2b7bb9;font-weight:700;&amp;quot;&amp;gt;① 수직적 탐색&amp;lt;/span&amp;gt;&amp;lt;br/&amp;gt;&amp;#039;&amp;#039;&amp;#039;Root → Branch → Leaf&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;color:#4a5a6a;&amp;quot;&amp;gt;BLEVEL + 1 블록 (보통 3~4)&amp;lt;br/&amp;gt;비용 거의 고정&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 220px;background:#eaf3fb;border-radius:10px;padding:14px;text-align:center;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;color:#2b7bb9;font-weight:700;&amp;quot;&amp;gt;② 수평적 스캔&amp;lt;/span&amp;gt;&amp;lt;br/&amp;gt;&amp;#039;&amp;#039;&amp;#039;Leaf 블록 범위 스캔&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;color:#4a5a6a;&amp;quot;&amp;gt;access 조건 범위에 비례&amp;lt;br/&amp;gt;Leaf당 수백 건 → 비교적 저렴&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 220px;background:#fdecea;border-radius:10px;padding:14px;text-align:center;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;color:#c0392b;font-weight:700;&amp;quot;&amp;gt;③ 테이블 랜덤 액세스&amp;lt;/span&amp;gt;&amp;lt;br/&amp;gt;&amp;#039;&amp;#039;&amp;#039;ROWID → 테이블 블록&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;color:#4a5a6a;&amp;quot;&amp;gt;건당 최대 1블록 (Single I/O)&amp;lt;br/&amp;gt;&amp;#039;&amp;#039;&amp;#039;가장 비싸다&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:5px solid #2b7bb9;background:#f1f7fc;padding:14px 20px;margin:16px 0;border-radius:0 8px 8px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;인덱스 튜닝의 두 축&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
① &amp;#039;&amp;#039;&amp;#039;인덱스 스캔 효율&amp;#039;&amp;#039;&amp;#039; — 수평 스캔 범위를 줄인다 (access 조건 최대화, 컬럼 순서)&amp;lt;br/&amp;gt;&lt;br /&gt;
② &amp;#039;&amp;#039;&amp;#039;테이블 액세스 최소화&amp;#039;&amp;#039;&amp;#039; — 테이블 방문 횟수를 줄인다 (인덱스에서 필터링, 커버링 인덱스, 클러스터링 팩터)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 1.1 인덱스 손익분기점 ===&lt;br /&gt;
* 테이블 전체의 일정 비율 이상을 읽으면 인덱스보다 &amp;#039;&amp;#039;&amp;#039;Full Table Scan&amp;#039;&amp;#039;&amp;#039;이 빠르다.&lt;br /&gt;
* 일반적으로 &amp;#039;&amp;#039;&amp;#039;수 % 이내&amp;#039;&amp;#039;&amp;#039;가 기준으로 거론되지만, 실제 손익분기점은 &amp;#039;&amp;#039;&amp;#039;클러스터링 팩터&amp;#039;&amp;#039;&amp;#039;에 크게 좌우된다 — 좋으면 수십 %까지도 인덱스가 유리하고, 나쁘면 1% 미만에서도 Full Scan이 낫다.&lt;br /&gt;
* 이유: 인덱스 랜덤 액세스는 &amp;#039;&amp;#039;&amp;#039;Single Block I/O&amp;#039;&amp;#039;&amp;#039;로 한 번에 1블록, Full Scan은 &amp;#039;&amp;#039;&amp;#039;Multi Block I/O&amp;#039;&amp;#039;&amp;#039;(+ Exadata Smart Scan, Direct Path Read)로 한 번에 다수 블록을 읽는다.&lt;br /&gt;
&lt;br /&gt;
== 2. 인덱스 스캔 효율 ==&lt;br /&gt;
=== 2.1 access 조건 vs filter 조건 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#0f2b46;color:#fff;&amp;quot;&lt;br /&gt;
! 구분 !! 인덱스 access !! 인덱스 filter !! 테이블 filter&lt;br /&gt;
|-&lt;br /&gt;
| 역할 || 스캔 &amp;#039;&amp;#039;&amp;#039;시작점과 끝점&amp;#039;&amp;#039;&amp;#039; 결정 || 스캔한 인덱스 행 중 걸러냄 || 테이블 방문 후 걸러냄&lt;br /&gt;
|-&lt;br /&gt;
| 비용 || 스캔 범위 자체를 줄임 || 테이블 방문은 줄임 || 낭비 가장 큼&lt;br /&gt;
|-&lt;br /&gt;
| 발생 조건 || 선두부터 연속된 = 조건 + 첫 범위 조건 || 범위 조건 뒤 컬럼, 선두 누락 컬럼 || 인덱스에 없는 컬럼&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 결합 인덱스 컬럼 순서 실험 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 조건: STAT_CD = &amp;#039;10&amp;#039; (99%) / ORDER_DT 1일치 (0.1%) / CUST_NO = :c (0.002%)&lt;br /&gt;
-- 인덱스 후보별 스캔 범위&lt;br /&gt;
--  A. (ORDER_DT, CUST_NO)  → access: ORDER_DT 범위, filter: CUST_NO     → 하루치 3,000건 스캔&lt;br /&gt;
--  B. (CUST_NO, ORDER_DT)  → access: CUST_NO = AND ORDER_DT 범위        → 1~2건 스캔&lt;br /&gt;
--  C. (STAT_CD, ORDER_DT)  → access: STAT_CD = AND ORDER_DT 범위        → 하루치 2,970건 스캔&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#eaf1f8;&amp;quot;&lt;br /&gt;
! 원칙 !! 설명&lt;br /&gt;
|-&lt;br /&gt;
| ① &amp;#039;&amp;#039;&amp;#039;= 조건 우선&amp;#039;&amp;#039;&amp;#039; || 선두에서 = 조건이 연속될수록 스캔 범위가 좁다&lt;br /&gt;
|-&lt;br /&gt;
| ② &amp;#039;&amp;#039;&amp;#039;범위 조건은 뒤로&amp;#039;&amp;#039;&amp;#039; || 첫 범위 조건 이후 컬럼은 access에 기여하지 못한다&lt;br /&gt;
|-&lt;br /&gt;
| ③ &amp;#039;&amp;#039;&amp;#039;항상 쓰이는 컬럼을 앞에&amp;#039;&amp;#039;&amp;#039; || 선두 컬럼이 조건에 없으면 Range Scan 불가 (Skip Scan 제외)&lt;br /&gt;
|-&lt;br /&gt;
| ④ &amp;#039;&amp;#039;&amp;#039;정렬·그룹핑 고려&amp;#039;&amp;#039;&amp;#039; || ORDER BY 순서와 일치하면 SORT 연산 제거&lt;br /&gt;
|-&lt;br /&gt;
| ⑤ &amp;#039;&amp;#039;&amp;#039;선택도는 마지막&amp;#039;&amp;#039;&amp;#039; || &amp;quot;선택도 좋은 컬럼을 앞에&amp;quot;는 = 조건끼리일 때만 의미가 있다&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #f0d9b5;background:#fffaf0;padding:12px 18px;border-radius:8px;margin:14px 0;&amp;quot;&amp;gt;&lt;br /&gt;
💡 &amp;#039;&amp;#039;&amp;#039;흔한 오해&amp;#039;&amp;#039;&amp;#039; — 두 컬럼이 모두 = 조건이면 순서에 따른 &amp;#039;&amp;#039;&amp;#039;스캔 블록 수 차이는 거의 없다&amp;#039;&amp;#039;&amp;#039;. 이때는 &amp;#039;&amp;#039;&amp;#039;다른 SQL에서도 재사용&amp;#039;&amp;#039;&amp;#039;될 수 있는 순서(더 자주 단독으로 쓰이는 컬럼을 선두)를 고른다.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.3 BETWEEN을 IN으로 — 범위 조건을 = 조건으로 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 인덱스 (ORDER_MM, CUST_NO), ORDER_MM은 &amp;#039;YYYYMM&amp;#039; 문자&lt;br /&gt;
-- Before: ORDER_MM 범위 조건 → CUST_NO는 filter&lt;br /&gt;
WHERE order_mm BETWEEN &amp;#039;202609&amp;#039; AND &amp;#039;202611&amp;#039; AND cust_no = :c&lt;br /&gt;
&lt;br /&gt;
-- After: IN-List → INLIST ITERATOR, 각 월마다 (ORDER_MM =, CUST_NO =) access&lt;br /&gt;
WHERE order_mm IN (&amp;#039;202609&amp;#039;, &amp;#039;202610&amp;#039;, &amp;#039;202611&amp;#039;) AND cust_no = :c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* IN 목록 개수가 적고, 범위 내 선행 컬럼 값 종류가 적을 때 효과적이다.&lt;br /&gt;
* 반대로 IN 목록이 길면 수직 탐색이 반복되어 오히려 불리할 수 있다.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Index Skip Scan ===&lt;br /&gt;
* 선두 컬럼 조건이 없을 때, 선두 컬럼의 &amp;#039;&amp;#039;&amp;#039;Distinct 값 수가 매우 적으면&amp;#039;&amp;#039;&amp;#039; 값별로 건너뛰며 탐색한다.&lt;br /&gt;
* 예: 인덱스 &amp;lt;code&amp;gt;(GENDER, BIRTH_DT)&amp;lt;/code&amp;gt;, 조건 &amp;lt;code&amp;gt;BIRTH_DT = :d&amp;lt;/code&amp;gt; → GENDER 값 2개 각각에 대해 탐색&lt;br /&gt;
* 실행계획에 Skip Scan이 보이면 대개 &amp;#039;&amp;#039;&amp;#039;인덱스 설계를 다시 볼 신호&amp;#039;&amp;#039;&amp;#039;다.&lt;br /&gt;
&lt;br /&gt;
== 3. 테이블 랜덤 액세스 최소화 ==&lt;br /&gt;
=== 3.1 클러스터링 팩터 (CF) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
  CF 좋음 (≈ 테이블 블록 수)              CF 나쁨 (≈ 테이블 행 수)&lt;br /&gt;
  인덱스  A A A B B B C C C               인덱스  A A A B B B C C C&lt;br /&gt;
          │ │ │ │ │ │ │ │ │                       │ │ │ │ │ │ │ │ │&lt;br /&gt;
  테이블  [블록1 ][블록2 ][블록3 ]         테이블  [1][7][3][9][2][5][8][4][6]&lt;br /&gt;
          → 3블록만 방문                          → 9블록 방문 (같은 블록 재방문 포함)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#eaf1f8;&amp;quot;&lt;br /&gt;
! 개선 방법 !! 설명 !! 주의&lt;br /&gt;
|-&lt;br /&gt;
| 테이블 재구성 (정렬 적재) || &amp;lt;code&amp;gt;CREATE TABLE … AS SELECT … ORDER BY 인덱스컬럼&amp;lt;/code&amp;gt; || 다른 인덱스의 CF는 나빠질 수 있다. 한 테이블에 CF가 모두 좋은 인덱스는 하나뿐&lt;br /&gt;
|-&lt;br /&gt;
| IOT (Index-Organized Table) || 데이터를 PK 순으로 인덱스 구조에 저장 || PK 외 접근이 많으면 불리&lt;br /&gt;
|-&lt;br /&gt;
| 파티셔닝 || 파티션 키 기준으로 물리적으로 모음 ||&lt;br /&gt;
|-&lt;br /&gt;
| 커버링 인덱스 || 테이블 방문 자체를 제거 || 아래 3.2 참고&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TABLE_CACHED_BLOCKS&amp;lt;/code&amp;gt; 통계 옵션 (12c+) || CF 계산 시 최근 방문 블록을 캐시된 것으로 간주 || 통계 값만 보정, 실제 I/O는 그대로&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 커버링 인덱스 (Covering Index) ===&lt;br /&gt;
SQL이 필요로 하는 &amp;#039;&amp;#039;&amp;#039;모든 컬럼&amp;#039;&amp;#039;&amp;#039;이 인덱스에 있으면 테이블을 방문하지 않는다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 조회: SELECT order_dt, order_amt FROM tb_order WHERE cust_no = :c AND order_dt &amp;gt;= :d&lt;br /&gt;
CREATE INDEX ix_order_cov ON tb_order (cust_no, order_dt, order_amt);&lt;br /&gt;
-- 실행계획: INDEX RANGE SCAN IX_ORDER_COV  (TABLE ACCESS BY INDEX ROWID 단계 사라짐)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 컬럼을 무작정 추가하면 인덱스가 커지고 &amp;#039;&amp;#039;&amp;#039;DML 부하&amp;#039;&amp;#039;&amp;#039;가 늘어난다. 실행 빈도가 매우 높은 핵심 SQL에 한해 적용한다.&lt;br /&gt;
&lt;br /&gt;
=== 3.3 인덱스에서 필터링 — 테이블 filter를 인덱스 filter로 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 인덱스 (CUST_NO, ORDER_DT), 조건 CUST_NO = :c AND ORDER_DT &amp;gt;= :d AND STAT_CD = &amp;#039;90&amp;#039;&lt;br /&gt;
-- STAT_CD가 인덱스에 없어 테이블 방문 후 버림 → 인덱스 끝에 STAT_CD 추가&lt;br /&gt;
CREATE INDEX ix_order_01 ON tb_order (cust_no, order_dt, stat_cd);&lt;br /&gt;
-- STAT_CD는 범위 조건 뒤라 access는 아니지만 &amp;#039;인덱스 filter&amp;#039;로 테이블 방문 전에 걸러진다&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 BATCHED ROWID 액세스 (12c+) ===&lt;br /&gt;
* &amp;lt;code&amp;gt;TABLE ACCESS BY INDEX ROWID BATCHED&amp;lt;/code&amp;gt; — ROWID를 모아 같은 블록끼리 묶어 접근 → 랜덤 I/O 감소&lt;br /&gt;
* 단, 결과가 &amp;#039;&amp;#039;&amp;#039;인덱스 순서대로 나온다는 보장이 없다&amp;#039;&amp;#039;&amp;#039;. 정렬은 반드시 &amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt;로 명시한다.&lt;br /&gt;
* 제어 힌트: &amp;lt;code&amp;gt;BATCH_TABLE_ACCESS_BY_ROWID&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;NO_BATCH_TABLE_ACCESS_BY_ROWID&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. 정렬·집계와 인덱스 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#0f2b46;color:#fff;&amp;quot;&lt;br /&gt;
! 패턴 !! 인덱스 활용 !! 실행계획&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt; = 인덱스 순서 || 정렬 생략 || SORT 단계 없음&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ORDER BY … DESC&amp;lt;/code&amp;gt; || 역순 스캔 || INDEX RANGE SCAN DESCENDING&lt;br /&gt;
|-&lt;br /&gt;
| Top-N / 페이징 || 정렬 생략 + 조기 종료 || COUNT STOPKEY, WINDOW NOSORT STOPKEY&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt; || 인덱스 한쪽 끝만 || INDEX FULL SCAN (MIN/MAX), FIRST ROW&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;COUNT(*)&amp;lt;/code&amp;gt; || NOT NULL 컬럼 인덱스로 대체 || INDEX FAST FULL SCAN&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; 인덱스 순서 || 정렬 기반 그룹핑 생략 || SORT GROUP BY NOSORT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 고객별 최근 주문 1건 — 인덱스 (CUST_NO, ORDER_DT)&lt;br /&gt;
SELECT MAX(order_dt) FROM tb_order WHERE cust_no = :c;&lt;br /&gt;
-- INDEX RANGE SCAN (MIN/MAX) + FIRST ROW → 블록 3~4개만 읽음&lt;br /&gt;
&lt;br /&gt;
-- 주의: MAX 대상 컬럼을 가공하면 최적화 불가&lt;br /&gt;
SELECT MAX(TO_CHAR(order_dt,&amp;#039;YYYYMMDD&amp;#039;)) FROM tb_order WHERE cust_no = :c;   -- 범위 전체 스캔&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. 특수 인덱스 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;font-size:13px;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#eaf1f8;&amp;quot;&lt;br /&gt;
! 종류 !! 활용 !! 예&lt;br /&gt;
|-&lt;br /&gt;
| Function-Based Index || 가공 조건을 인덱스로 || &amp;lt;code&amp;gt;CREATE INDEX ix_cust_email ON tb_customer (UPPER(email));&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NULL 포함 인덱스 || 단일 컬럼 B*Tree는 NULL 미저장 → 상수 추가 || &amp;lt;code&amp;gt;CREATE INDEX ix_loan_ret ON tb_loan (return_dt, 0);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 부분 인덱스 (FBI 응용) || 특정 값만 인덱싱해 크기 최소화 || &amp;lt;code&amp;gt;CREATE INDEX ix_err ON tb_job (CASE WHEN stat_cd=&amp;#039;E&amp;#039; THEN job_id END);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Invisible Index || 옵티마이저에서 숨겨 영향도 테스트 || &amp;lt;code&amp;gt;ALTER INDEX ix_x INVISIBLE;&amp;lt;/code&amp;gt; + 세션 &amp;lt;code&amp;gt;optimizer_use_invisible_indexes=TRUE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reverse Key || RAC 우측 블록 경합 완화 || 범위 검색 불가&lt;br /&gt;
|-&lt;br /&gt;
| Bitmap || DW 저선택도, 다중 조건 결합 || OLTP 금지 (DML 락 범위 큼)&lt;br /&gt;
|-&lt;br /&gt;
| Local Partitioned || 파티션별 독립 인덱스 || 파티션 DROP·EXCHANGE 시 관리 용이&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:5px solid #c0392b;background:#fdf1ef;padding:12px 18px;margin:14px 0;border-radius:0 8px 8px 0;&amp;quot;&amp;gt;&lt;br /&gt;
⚠ &amp;#039;&amp;#039;&amp;#039;부분 인덱스 사용 시&amp;#039;&amp;#039;&amp;#039; — 조건절이 인덱스 정의와 &amp;#039;&amp;#039;&amp;#039;정확히 같은 식&amp;#039;&amp;#039;&amp;#039;이어야 한다. &amp;lt;code&amp;gt;WHERE CASE WHEN stat_cd=&amp;#039;E&amp;#039; THEN job_id END IS NOT NULL&amp;lt;/code&amp;gt; 처럼 작성하거나, 뷰로 감싸 제공한다.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. 인덱스 설계 절차 ==&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;핵심 SQL 수집&amp;#039;&amp;#039;&amp;#039; — AWR·V$SQL에서 실행 빈도·부하 상위 SQL, 신규 개발 SQL 목록&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;액세스 패턴 분석&amp;#039;&amp;#039;&amp;#039; — 테이블별로 조건 컬럼, 연산자(= / 범위 / LIKE), 정렬·그룹핑 컬럼 정리&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;조건 분포 확인&amp;#039;&amp;#039;&amp;#039; — 컬럼 NDV, 값 편중, 조회 범위&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;후보 인덱스 도출&amp;#039;&amp;#039;&amp;#039; — 여러 SQL을 &amp;#039;&amp;#039;&amp;#039;최소 개수&amp;#039;&amp;#039;&amp;#039;의 인덱스로 커버하도록 컬럼 순서 결정&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;기존 인덱스와 비교&amp;#039;&amp;#039;&amp;#039; — 중복(선두 컬럼 포함 관계), 미사용 인덱스 정리&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;DML 영향 검토&amp;#039;&amp;#039;&amp;#039; — 인덱스 1개 추가 시 INSERT·DELETE·인덱스 컬럼 UPDATE 비용 증가&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;검증&amp;#039;&amp;#039;&amp;#039; — Invisible로 생성 → 대상 세션에서 실측 → Visible 전환&lt;br /&gt;
&lt;br /&gt;
=== 6.1 액세스 패턴 매트릭스 예 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;text-align:center;font-size:13px;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#0f2b46;color:#fff;&amp;quot;&lt;br /&gt;
! SQL !! 실행/일 !! CUST_NO !! ORDER_DT !! STAT_CD !! ORDER BY !! 후보&lt;br /&gt;
|-&lt;br /&gt;
| SQL-01 고객 주문 목록 || 50만 || = || 범위 || || ORDER_DT DESC || (CUST_NO, ORDER_DT)&lt;br /&gt;
|-&lt;br /&gt;
| SQL-02 상태별 처리 대상 || 2만 || || 범위 || = || || (STAT_CD, ORDER_DT)&lt;br /&gt;
|-&lt;br /&gt;
| SQL-03 고객 최근 주문일 || 10만 || = || MAX || || || (CUST_NO, ORDER_DT) 재사용&lt;br /&gt;
|-&lt;br /&gt;
| SQL-04 일자별 집계 (배치) || 1 || || 범위 || || || 파티션 Full Scan&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7. 인덱스 운영 관리 ==&lt;br /&gt;
=== 7.1 미사용 인덱스 찾기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 12.2+ : 인덱스 사용 추적 (기본 샘플링 방식)&lt;br /&gt;
SELECT owner, name, total_access_count, total_exec_count, last_used&lt;br /&gt;
  FROM dba_index_usage&lt;br /&gt;
 WHERE owner = &amp;#039;APP&amp;#039;&lt;br /&gt;
 ORDER BY total_access_count;&lt;br /&gt;
&lt;br /&gt;
-- 인덱스 정의와 비교해 &amp;#039;한 번도 안 쓰인&amp;#039; 인덱스&lt;br /&gt;
SELECT i.owner, i.index_name, i.table_name&lt;br /&gt;
  FROM dba_indexes i&lt;br /&gt;
 WHERE i.owner = &amp;#039;APP&amp;#039;&lt;br /&gt;
   AND NOT EXISTS (SELECT 1 FROM dba_index_usage u&lt;br /&gt;
                    WHERE u.owner = i.owner AND u.name = i.index_name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 월말·분기 배치처럼 &amp;#039;&amp;#039;&amp;#039;드물게 쓰이는 인덱스&amp;#039;&amp;#039;&amp;#039;가 있으므로, 최소 한 업무 주기 이상 관찰 후 삭제한다.&lt;br /&gt;
* 삭제 전 &amp;#039;&amp;#039;&amp;#039;INVISIBLE&amp;#039;&amp;#039;&amp;#039;로 일정 기간 운영해 영향 확인 → 문제 없으면 DROP&lt;br /&gt;
&lt;br /&gt;
=== 7.2 중복 인덱스 ===&lt;br /&gt;
* &amp;lt;code&amp;gt;(A)&amp;lt;/code&amp;gt;와 &amp;lt;code&amp;gt;(A, B)&amp;lt;/code&amp;gt;가 함께 있으면 대부분 &amp;lt;code&amp;gt;(A)&amp;lt;/code&amp;gt;는 불필요하다. (단, &amp;lt;code&amp;gt;(A)&amp;lt;/code&amp;gt;가 PK/UK·FK 용도면 예외 검토)&lt;br /&gt;
* 같은 컬럼 구성에 순서만 다른 인덱스는 각각의 SQL 패턴 근거가 있는지 확인한다.&lt;br /&gt;
&lt;br /&gt;
=== 7.3 인덱스 리빌드에 대한 오해 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#eaf1f8;&amp;quot;&lt;br /&gt;
! 오해 !! 사실&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;주기적으로 리빌드해야 성능이 유지된다&amp;quot; || B*Tree는 스스로 균형을 유지한다. 대부분 리빌드 효과는 일시적이다&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;BLEVEL이 높으면 리빌드해야 한다&amp;quot; || BLEVEL은 건수에 따라 자연스럽게 증가하며, 리빌드로 거의 줄지 않는다&lt;br /&gt;
|-&lt;br /&gt;
| 리빌드가 효과 있는 경우 || 대량 DELETE 후 &amp;#039;&amp;#039;&amp;#039;재삽입되지 않는 키 범위&amp;#039;&amp;#039;&amp;#039;(예: 과거 일자)가 비어 있는 경우, 우측 증가 키에서 좌측 리프가 희소해진 경우&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 공간 회수가 목적이면 온라인으로&lt;br /&gt;
ALTER INDEX ix_order_02 REBUILD ONLINE;&lt;br /&gt;
-- 또는 리프 블록 병합만 (락 영향 적음)&lt;br /&gt;
ALTER INDEX ix_order_02 COALESCE;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. 실습 과제 ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #d6e2ee;border-radius:10px;padding:12px 18px;margin-bottom:12px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;과제 1.&amp;#039;&amp;#039;&amp;#039; [[실행계획 읽기 실습]]의 LAB_ORDER에서 &amp;lt;code&amp;gt;WHERE stat_cd = &amp;#039;90&amp;#039; AND order_dt BETWEEN :d1 AND :d2&amp;lt;/code&amp;gt; 를 인덱스 &amp;lt;code&amp;gt;(ORDER_DT)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(ORDER_DT, STAT_CD)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(STAT_CD, ORDER_DT)&amp;lt;/code&amp;gt; 세 가지로 실행해 Buffers를 비교하라.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#34495e;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;기대 결과&amp;#039;&amp;#039;&amp;#039; (ORDER_DT) → 테이블 방문 후 filter로 대부분 버림 &amp;amp;gt; (ORDER_DT, STAT_CD) → 인덱스 filter로 테이블 방문은 줄지만 스캔 범위는 동일 &amp;amp;gt; (STAT_CD, ORDER_DT) → access 범위 자체가 1/100 수준으로 축소. &amp;#039;&amp;#039;&amp;#039;Buffers가 가장 적은 것은 세 번째&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #d6e2ee;border-radius:10px;padding:12px 18px;margin-bottom:12px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;과제 2.&amp;#039;&amp;#039;&amp;#039; LAB_ORDER를 CUST_NO 순으로 정렬해 재생성한 뒤, 두 인덱스의 클러스터링 팩터와 같은 SQL의 Buffers 변화를 비교하라.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#34495e;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;기대 결과&amp;#039;&amp;#039;&amp;#039; IX_LAB_ORDER_01(CUST_NO 선두)의 CF는 테이블 블록 수에 가깝게 좋아지고, IX_LAB_ORDER_02(ORDER_DT)의 CF는 행 수에 가깝게 나빠진다. 고객 단위 조회 SQL은 빨라지고 일자 단위 조회 SQL은 느려진다 — &amp;#039;&amp;#039;&amp;#039;CF는 트레이드오프&amp;#039;&amp;#039;&amp;#039;다.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #d6e2ee;border-radius:10px;padding:12px 18px;margin-bottom:12px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;과제 3.&amp;#039;&amp;#039;&amp;#039; 운영(또는 개발) 스키마에서 선두 컬럼이 같은 인덱스 쌍을 찾는 SQL을 작성하라.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#34495e;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT a.table_name, a.index_name AS idx_short, b.index_name AS idx_long&lt;br /&gt;
  FROM (SELECT table_owner, table_name, index_name,&lt;br /&gt;
               LISTAGG(column_name, &amp;#039;,&amp;#039;) WITHIN GROUP (ORDER BY column_position) AS cols&lt;br /&gt;
          FROM dba_ind_columns WHERE table_owner = &amp;#039;APP&amp;#039;&lt;br /&gt;
         GROUP BY table_owner, table_name, index_name) a&lt;br /&gt;
  JOIN (SELECT table_owner, table_name, index_name,&lt;br /&gt;
               LISTAGG(column_name, &amp;#039;,&amp;#039;) WITHIN GROUP (ORDER BY column_position) AS cols&lt;br /&gt;
          FROM dba_ind_columns WHERE table_owner = &amp;#039;APP&amp;#039;&lt;br /&gt;
         GROUP BY table_owner, table_name, index_name) b&lt;br /&gt;
    ON b.table_owner = a.table_owner AND b.table_name = a.table_name&lt;br /&gt;
   AND b.index_name &amp;lt;&amp;gt; a.index_name&lt;br /&gt;
   AND b.cols LIKE a.cols || &amp;#039;,%&amp;#039;&lt;br /&gt;
 ORDER BY a.table_name;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:30px;padding:14px 20px;border-top:3px solid #0f2b46;background:#f6f9fc;border-radius:0 0 10px 10px;font-size:13px;color:#4a5a6a;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;이전&amp;#039;&amp;#039;&amp;#039; ← [[SQL 튜닝 입문]] · [[실행계획 읽기 실습]] &amp;amp;nbsp;|&amp;amp;nbsp; &amp;#039;&amp;#039;&amp;#039;다음&amp;#039;&amp;#039;&amp;#039; → [[조인 튜닝 심화]] · [[AWR 리포트 분석]] &amp;amp;nbsp;|&amp;amp;nbsp; &amp;#039;&amp;#039;&amp;#039;관련&amp;#039;&amp;#039;&amp;#039; → [[Oracle 물리 설계]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[분류:SQL 튜닝]]&lt;br /&gt;
[[분류:Oracle]]&lt;br /&gt;
[[분류:인덱스]]&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
</feed>