<?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%8B%A4%ED%96%89%EA%B3%84%ED%9A%8D_%EC%9D%BD%EA%B8%B0_%EC%8B%A4%EC%8A%B5</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%8B%A4%ED%96%89%EA%B3%84%ED%9A%8D_%EC%9D%BD%EA%B8%B0_%EC%8B%A4%EC%8A%B5"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%8B%A4%ED%96%89%EA%B3%84%ED%9A%8D_%EC%9D%BD%EA%B8%B0_%EC%8B%A4%EC%8A%B5&amp;action=history"/>
	<updated>2026-11-04T06:06:03Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%8B%A4%ED%96%89%EA%B3%84%ED%9A%8D_%EC%9D%BD%EA%B8%B0_%EC%8B%A4%EC%8A%B5&amp;diff=1992&amp;oldid=prev</id>
		<title>Dbstudy: 상단 배너를 {{타이틀 주제}} 틀로 교체</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%8B%A4%ED%96%89%EA%B3%84%ED%9A%8D_%EC%9D%BD%EA%B8%B0_%EC%8B%A4%EC%8A%B5&amp;diff=1992&amp;oldid=prev"/>
		<updated>2026-11-04T04:26:20Z</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,#6e2c00 0%,#a04000 55%,#d35400 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(110,44,0,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 · HANDS-ON LAB 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 · HANDS-ON LAB 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;DBMS_XPLAN 포맷부터 오퍼레이션 해석, 병목 단계 찾기까지 — 10개 실습으로 익히는 실행계획&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;= DBMS_XPLAN 포맷부터 오퍼레이션 해석, 병목 단계 찾기까지 — 10개 실습으로 익히는 실행계획&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 튜닝 입문]] 4~5장&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 튜닝 입문]] 4~5장&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;커리큘럼 · 5주차&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;= 커리큘럼 · 5주차&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;기준 · Oracle 19c&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;= 기준 · Oracle 19c&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%8B%A4%ED%96%89%EA%B3%84%ED%9A%8D_%EC%9D%BD%EA%B8%B0_%EC%8B%A4%EC%8A%B5&amp;diff=1982&amp;oldid=prev</id>
		<title>Dbstudy: 새 문서: &lt;div style=&quot;background:linear-gradient(135deg,#6e2c00 0%,#a04000 55%,#d35400 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(110,44,0,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 · HANDS-ON LAB 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...</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%8B%A4%ED%96%89%EA%B3%84%ED%9A%8D_%EC%9D%BD%EA%B8%B0_%EC%8B%A4%EC%8A%B5&amp;diff=1982&amp;oldid=prev"/>
		<updated>2026-11-04T03:55:03Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &amp;lt;div style=&amp;quot;background:linear-gradient(135deg,#6e2c00 0%,#a04000 55%,#d35400 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(110,44,0,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 · HANDS-ON LAB 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...&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,#6e2c00 0%,#a04000 55%,#d35400 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(110,44,0,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 · HANDS-ON LAB 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;DBMS_XPLAN 포맷부터 오퍼레이션 해석, 병목 단계 찾기까지 — 10개 실습으로 익히는 실행계획&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 튜닝 입문]] 4~5장&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;커리큘럼 · 5주차&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;기준 · Oracle 19c&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;
=== 1.1 권한과 환경 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- DISPLAY_CURSOR에 필요한 권한 (DBA가 부여)&lt;br /&gt;
GRANT SELECT ON V_$SQL_PLAN              TO lab_user;&lt;br /&gt;
GRANT SELECT ON V_$SQL_PLAN_STATISTICS_ALL TO lab_user;&lt;br /&gt;
GRANT SELECT ON V_$SQL                   TO lab_user;&lt;br /&gt;
GRANT SELECT ON V_$SESSION               TO lab_user;&lt;br /&gt;
-- 또는 GRANT SELECT_CATALOG_ROLE TO lab_user;&lt;br /&gt;
&lt;br /&gt;
-- SQL*Plus 출력 설정&lt;br /&gt;
SET LINESIZE 200 PAGESIZE 0 SERVEROUTPUT OFF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;lt;code&amp;gt;SERVEROUTPUT ON&amp;lt;/code&amp;gt; 상태에서는 SQL*Plus가 실행 후 &amp;lt;code&amp;gt;DBMS_OUTPUT.GET_LINES&amp;lt;/code&amp;gt;를 호출하므로, &amp;lt;code&amp;gt;DISPLAY_CURSOR(NULL, NULL)&amp;lt;/code&amp;gt;이 &amp;#039;&amp;#039;&amp;#039;방금 실행한 SQL이 아닌 그 호출의 계획&amp;#039;&amp;#039;&amp;#039;을 보여준다. 반드시 &amp;lt;code&amp;gt;SERVEROUTPUT OFF&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 1.2 실습 테이블 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE lab_cust NOLOGGING AS&lt;br /&gt;
SELECT &amp;#039;C&amp;#039; || LPAD(LEVEL, 6, &amp;#039;0&amp;#039;)                         AS cust_no,&lt;br /&gt;
       &amp;#039;CUST_&amp;#039; || LEVEL                                   AS cust_nm,&lt;br /&gt;
       DECODE(MOD(LEVEL, 10), 0, &amp;#039;VIP&amp;#039;, &amp;#039;NORMAL&amp;#039;)         AS grade_cd,&lt;br /&gt;
       DECODE(MOD(LEVEL, 5), 0, &amp;#039;서울&amp;#039;, 1, &amp;#039;부산&amp;#039;, 2, &amp;#039;대구&amp;#039;, 3, &amp;#039;광주&amp;#039;, &amp;#039;대전&amp;#039;) AS region&lt;br /&gt;
  FROM dual CONNECT BY LEVEL &amp;lt;= 50000;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE lab_order NOLOGGING AS&lt;br /&gt;
SELECT &amp;#039;O&amp;#039; || LPAD(LEVEL, 10, &amp;#039;0&amp;#039;)                        AS order_no,&lt;br /&gt;
       DATE &amp;#039;2024-01-01&amp;#039; + MOD(LEVEL, 1000)               AS order_dt,&lt;br /&gt;
       &amp;#039;C&amp;#039; || LPAD(MOD(LEVEL, 50000) + 1, 6, &amp;#039;0&amp;#039;)          AS cust_no,&lt;br /&gt;
       DECODE(MOD(LEVEL, 100), 0, &amp;#039;90&amp;#039;, 1, &amp;#039;30&amp;#039;, &amp;#039;10&amp;#039;)    AS stat_cd,&lt;br /&gt;
       ROUND(DBMS_RANDOM.VALUE(1000, 500000))              AS order_amt&lt;br /&gt;
  FROM dual CONNECT BY LEVEL &amp;lt;= 3000000;&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE lab_cust  ADD CONSTRAINT pk_lab_cust  PRIMARY KEY (cust_no);&lt;br /&gt;
ALTER TABLE lab_order ADD CONSTRAINT pk_lab_order PRIMARY KEY (order_no);&lt;br /&gt;
CREATE INDEX ix_lab_order_01 ON lab_order (cust_no, order_dt);&lt;br /&gt;
CREATE INDEX ix_lab_order_02 ON lab_order (order_dt);&lt;br /&gt;
&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, &amp;#039;LAB_CUST&amp;#039;);&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, &amp;#039;LAB_ORDER&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. DBMS_XPLAN 완전 정복 ==&lt;br /&gt;
=== 2.1 함수 종류 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#6e2c00;color:#fff;&amp;quot;&lt;br /&gt;
! 함수 !! 소스 !! 용도&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY&amp;lt;/code&amp;gt; || PLAN_TABLE (EXPLAIN PLAN) || 예상 계획 확인&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY_CURSOR&amp;lt;/code&amp;gt; || V$SQL_PLAN (Library Cache) || &amp;#039;&amp;#039;&amp;#039;실제 실행된 계획 + 실측 통계&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY_AWR&amp;lt;/code&amp;gt; || DBA_HIST_SQL_PLAN || 과거 계획 이력, 계획 변경 추적&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY_SQL_PLAN_BASELINE&amp;lt;/code&amp;gt; || SPM || 고정된 Baseline 계획 확인&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY_SQLSET&amp;lt;/code&amp;gt; || SQL Tuning Set || STS에 저장된 계획&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 포맷 옵션 ===&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:#fbeee6;&amp;quot;&lt;br /&gt;
! 포맷 !! 보여주는 것 !! 언제&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BASIC&amp;lt;/code&amp;gt; || Id, Operation, Name만 || 구조만 빠르게&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TYPICAL&amp;lt;/code&amp;gt; (기본) || + Rows, Bytes, Cost, Time, Predicate || 일반 확인&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ALL&amp;lt;/code&amp;gt; || + Query Block, Column Projection || 컬럼 흐름 추적&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADVANCED&amp;lt;/code&amp;gt; || ALL + Outline + Peeked Binds || 계획 재현·힌트 추출&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ALLSTATS LAST&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;&amp;#039;Starts, E-Rows, A-Rows, A-Time, Buffers, Reads&amp;#039;&amp;#039;&amp;#039;, 메모리 사용 || &amp;#039;&amp;#039;&amp;#039;튜닝 시 기본&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;+PEEKED_BINDS&amp;lt;/code&amp;gt; || 하드 파싱 시 엿본 바인드 값 || 바인드 영향 분석&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;+OUTLINE&amp;lt;/code&amp;gt; || 계획을 재현하는 전체 힌트 세트 || 힌트 작성 참고&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;+ADAPTIVE&amp;lt;/code&amp;gt; || 적응적 계획에서 비활성 단계(-)까지 표시 || 12c+ Adaptive Plan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;+NOTE&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;-NOTE&amp;lt;/code&amp;gt; || Dynamic Sampling, SPM, Profile 사용 여부 || 계획 결정 근거&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 실측 통계 수집 방법 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 방법 1: 힌트 (해당 SQL만)&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ ... ;&lt;br /&gt;
&lt;br /&gt;
-- 방법 2: 세션 단위 (여러 SQL을 연속 분석할 때)&lt;br /&gt;
ALTER SESSION SET statistics_level = ALL;&lt;br /&gt;
&lt;br /&gt;
-- 확인&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, &amp;#039;ALLSTATS LAST&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
-- 다른 세션 SQL은 SQL_ID와 CHILD_NUMBER 지정&lt;br /&gt;
SELECT sql_id, child_number, plan_hash_value, executions&lt;br /&gt;
  FROM v$sql WHERE sql_text LIKE &amp;#039;%찾을 문자열%&amp;#039; AND sql_text NOT LIKE &amp;#039;%v$sql%&amp;#039;;&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(&amp;#039;&amp;amp;sql_id&amp;#039;, &amp;amp;child_no, &amp;#039;ALLSTATS LAST +PEEKED_BINDS&amp;#039;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;ALLSTATS vs ALLSTATS LAST&amp;#039;&amp;#039;&amp;#039; — &amp;lt;code&amp;gt;LAST&amp;lt;/code&amp;gt; 없이 쓰면 &amp;#039;&amp;#039;&amp;#039;모든 실행의 누적값&amp;#039;&amp;#039;&amp;#039;이 나온다. 튜닝 전후 비교는 항상 &amp;lt;code&amp;gt;LAST&amp;lt;/code&amp;gt;로 &amp;#039;&amp;#039;&amp;#039;마지막 1회&amp;#039;&amp;#039;&amp;#039;를 본다.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. 실행계획 컬럼 해석 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#6e2c00;color:#fff;&amp;quot;&lt;br /&gt;
! 컬럼 !! 의미 !! 주의&lt;br /&gt;
|-&lt;br /&gt;
| Id || 단계 번호. &amp;#039;&amp;#039;&amp;#039;*&amp;#039;&amp;#039;&amp;#039; 표시는 Predicate가 있는 단계 || Predicate 섹션과 매칭&lt;br /&gt;
|-&lt;br /&gt;
| Operation / Name || 오퍼레이션과 대상 객체 || 들여쓰기가 부모-자식 관계&lt;br /&gt;
|-&lt;br /&gt;
| Starts || 이 단계가 시작된 횟수 || NL Inner, FILTER 서브쿼리에서 크게 증가&lt;br /&gt;
|-&lt;br /&gt;
| E-Rows || 예상 행 수 (&amp;#039;&amp;#039;&amp;#039;1회 실행 기준&amp;#039;&amp;#039;&amp;#039;) || A-Rows와 비교 시 &amp;#039;&amp;#039;&amp;#039;E-Rows × Starts&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| A-Rows || 실제 반환 행 수 (&amp;#039;&amp;#039;&amp;#039;전체 누적&amp;#039;&amp;#039;&amp;#039;) ||&lt;br /&gt;
|-&lt;br /&gt;
| A-Time || 실제 경과 시간 (&amp;#039;&amp;#039;&amp;#039;자식 포함 누적&amp;#039;&amp;#039;&amp;#039;) || 자식 시간을 빼야 순수 단계 시간&lt;br /&gt;
|-&lt;br /&gt;
| Buffers || Logical Read (&amp;#039;&amp;#039;&amp;#039;자식 포함 누적&amp;#039;&amp;#039;&amp;#039;) || 부모 − 자식 = 해당 단계 자체 I/O&lt;br /&gt;
|-&lt;br /&gt;
| Reads / Writes || Physical Read / Write || Writes는 Temp 사용 의미&lt;br /&gt;
|-&lt;br /&gt;
| OMem / 1Mem / Used-Mem || 최적 / One-Pass / 실사용 PGA || Used-Tmp가 있으면 디스크 정렬·해시&lt;br /&gt;
|-&lt;br /&gt;
| Pstart / Pstop || 접근한 파티션 범위 || KEY = 실행 시 결정, 숫자 = 파싱 시 결정&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. 주요 오퍼레이션 사전 ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%;font-size:13px;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#fbeee6;&amp;quot;&lt;br /&gt;
! 오퍼레이션 !! 의미 !! 체크 포인트&lt;br /&gt;
|-&lt;br /&gt;
| TABLE ACCESS FULL || 테이블 전체 Multi Block 스캔 || 대량 처리면 정상, 소량 결과면 인덱스 검토&lt;br /&gt;
|-&lt;br /&gt;
| TABLE ACCESS BY INDEX ROWID || ROWID로 테이블 단건 접근 || 인덱스 A-Rows 대비 버려지는 비율&lt;br /&gt;
|-&lt;br /&gt;
| TABLE ACCESS BY INDEX ROWID BATCHED || ROWID를 모아 블록 단위로 일괄 접근 (12c+) || 랜덤 I/O 감소, 정렬 순서 보장 안 됨&lt;br /&gt;
|-&lt;br /&gt;
| INDEX UNIQUE SCAN || 1건 탐색 ||&lt;br /&gt;
|-&lt;br /&gt;
| INDEX RANGE SCAN || 범위 탐색 || access 조건 범위가 좁은가&lt;br /&gt;
|-&lt;br /&gt;
| INDEX RANGE SCAN DESCENDING || 역순 범위 탐색 || ORDER BY DESC 정렬 대체&lt;br /&gt;
|-&lt;br /&gt;
| INDEX FULL SCAN (MIN/MAX) || 인덱스 한쪽 끝만 읽음 || MIN/MAX 최적화&lt;br /&gt;
|-&lt;br /&gt;
| INDEX FAST FULL SCAN || 인덱스 전체 Multi Block || 필요한 컬럼이 인덱스에 모두 있을 때&lt;br /&gt;
|-&lt;br /&gt;
| INDEX SKIP SCAN || 선두 컬럼 건너뛰기 || 대개 인덱스 설계 개선 신호&lt;br /&gt;
|-&lt;br /&gt;
| INLIST ITERATOR || IN 목록 값마다 인덱스 탐색 반복 ||&lt;br /&gt;
|-&lt;br /&gt;
| NESTED LOOPS / HASH JOIN / MERGE JOIN || 조인 방식 || [[조인 튜닝 심화]] 참고&lt;br /&gt;
|-&lt;br /&gt;
| HASH JOIN SEMI / ANTI || EXISTS / NOT EXISTS 변환 ||&lt;br /&gt;
|-&lt;br /&gt;
| FILTER || 조건 필터, 또는 &amp;#039;&amp;#039;&amp;#039;서브쿼리를 메인 행마다 실행&amp;#039;&amp;#039;&amp;#039; || 자식 2개면 서브쿼리 Filter 방식&lt;br /&gt;
|-&lt;br /&gt;
| VIEW || 인라인 뷰·뷰가 병합되지 않고 독립 처리 || 뷰 병합 실패 여부&lt;br /&gt;
|-&lt;br /&gt;
| SORT ORDER BY / GROUP BY || 정렬 / 정렬 기반 그룹핑 || Used-Tmp 여부&lt;br /&gt;
|-&lt;br /&gt;
| HASH GROUP BY / HASH UNIQUE || 해시 기반 그룹핑 / DISTINCT ||&lt;br /&gt;
|-&lt;br /&gt;
| SORT ORDER BY STOPKEY || Top-N 정렬 (N건만 유지) || 페이징&lt;br /&gt;
|-&lt;br /&gt;
| COUNT STOPKEY || &amp;lt;code&amp;gt;ROWNUM &amp;lt;= n&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;FETCH FIRST&amp;lt;/code&amp;gt; 조기 종료 || 부분 범위 처리&lt;br /&gt;
|-&lt;br /&gt;
| WINDOW SORT / WINDOW BUFFER || 분석 함수 처리 ||&lt;br /&gt;
|-&lt;br /&gt;
| PARTITION RANGE SINGLE / ITERATOR / ALL || 파티션 1개 / 일부 / 전체 || ALL이면 프루닝 실패&lt;br /&gt;
|-&lt;br /&gt;
| PX COORDINATOR / PX SEND / PX RECEIVE || 병렬 처리 || 병렬 분배 방식(HASH, BROADCAST)&lt;br /&gt;
|-&lt;br /&gt;
| STATISTICS COLLECTOR || 적응적 계획의 전환 판단 지점 (12c+) || +ADAPTIVE로 확인&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 5. 실습 문제 ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:13px;color:#6b5a4a;margin-bottom:10px;&amp;quot;&amp;gt;각 실습의 실행계획은 학습용으로 단순화한 예시이다. 본인 환경에서 직접 실행해 수치를 비교해 보자. 해설은 클릭하면 펼쳐진다.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 1. 읽는 순서 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
| Id | Operation                     | Name            | Starts | A-Rows | Buffers |&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT              |                 |      1 |     20 |      67 |&lt;br /&gt;
|  1 |  NESTED LOOPS                 |                 |      1 |     20 |      67 |&lt;br /&gt;
|  2 |   NESTED LOOPS                |                 |      1 |     20 |      47 |&lt;br /&gt;
|  3 |    TABLE ACCESS BY INDEX ROWID| LAB_ORDER       |      1 |     20 |      23 |&lt;br /&gt;
|* 4 |     INDEX RANGE SCAN          | IX_LAB_ORDER_01 |      1 |     20 |       3 |&lt;br /&gt;
|* 5 |    INDEX UNIQUE SCAN          | PK_LAB_CUST     |     20 |     20 |      24 |&lt;br /&gt;
|  6 |   TABLE ACCESS BY INDEX ROWID | LAB_CUST        |     20 |     20 |      20 |&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; 실행 순서를 Id로 나열하고, 각 단계의 순수 Buffers를 구하라.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
* 순서: &amp;#039;&amp;#039;&amp;#039;4 → 3 → 5 → 2 → 6 → 1 → 0&amp;#039;&amp;#039;&amp;#039; (NL은 Outer(3) 1행마다 Inner(5→6) 수행)&lt;br /&gt;
* 순수 Buffers: 4 = 3, 3 = 23 − 3 = &amp;#039;&amp;#039;&amp;#039;20&amp;#039;&amp;#039;&amp;#039;, 5 = &amp;#039;&amp;#039;&amp;#039;24&amp;#039;&amp;#039;&amp;#039;, 2 = 47 − 23 − 24 = 0, 6 = &amp;#039;&amp;#039;&amp;#039;20&amp;#039;&amp;#039;&amp;#039;, 1 = 67 − 47 − 20 = 0&lt;br /&gt;
* 20건에 67블록 — 건당 약 3.3블록으로 양호하다.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 2. 카디널리티 오류 찾기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------------------------&lt;br /&gt;
| Id | Operation                     | Name            | Starts | E-Rows | A-Rows | Buffers |&lt;br /&gt;
--------------------------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT              |                 |      1 |        |  29700 |  187K   |&lt;br /&gt;
|  1 |  NESTED LOOPS                 |                 |      1 |     30 |  29700 |  187K   |&lt;br /&gt;
|  2 |   TABLE ACCESS BY INDEX ROWID | LAB_ORDER       |      1 |     30 |  29700 |  29812  |&lt;br /&gt;
|* 3 |    INDEX RANGE SCAN           | IX_LAB_ORDER_02 |      1 |     30 |  29700 |     84  |&lt;br /&gt;
|  4 |   TABLE ACCESS BY INDEX ROWID | LAB_CUST        |  29700 |      1 |  29700 |  157K   |&lt;br /&gt;
|* 5 |    INDEX UNIQUE SCAN          | PK_LAB_CUST     |  29700 |      1 |  29700 |  59400  |&lt;br /&gt;
--------------------------------------------------------------------------------------&lt;br /&gt;
   3 - access(&amp;quot;ORDER_DT&amp;quot;=:B1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; 문제 단계와 원인, 개선 방향은?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Id 3&amp;#039;&amp;#039;&amp;#039;: E-Rows 30 vs A-Rows 29,700 — &amp;#039;&amp;#039;&amp;#039;약 1,000배&amp;#039;&amp;#039;&amp;#039; 과소 추정&lt;br /&gt;
* 옵티마이저는 30건으로 보고 NL을 선택했지만 실제로는 29,700번 Inner를 반복하여 Buffers 18만 블록 소모&lt;br /&gt;
* 원인 후보: 통계 오래됨(Stale), 바인드 값 분포 편중(Bind Peeking 시점 값과 현재 값 차이), 히스토그램 부재&lt;br /&gt;
* 개선: 통계 재수집 → 계획 재확인. 대량이 정상이라면 &amp;lt;code&amp;gt;LEAD&amp;lt;/code&amp;gt; 순서 유지 + &amp;#039;&amp;#039;&amp;#039;Hash Join&amp;#039;&amp;#039;&amp;#039; (LAB_CUST Full Scan, 약 300블록 수준)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 3. access vs filter ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS INDEX(o ix_lab_order_01) */ *&lt;br /&gt;
  FROM lab_order o&lt;br /&gt;
 WHERE o.order_dt BETWEEN DATE &amp;#039;2026-01-01&amp;#039; AND DATE &amp;#039;2026-01-31&amp;#039;&lt;br /&gt;
   AND o.cust_no  = &amp;#039;C000123&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
|* 2 |   INDEX RANGE SCAN | IX_LAB_ORDER_01 |  1 |  2 |  2 |  3 |&lt;br /&gt;
Predicate Information:&lt;br /&gt;
   2 - access(&amp;quot;CUST_NO&amp;quot;=&amp;#039;C000123&amp;#039; AND &amp;quot;ORDER_DT&amp;quot;&amp;gt;=... AND &amp;quot;ORDER_DT&amp;quot;&amp;lt;=...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; 인덱스를 &amp;lt;code&amp;gt;(ORDER_DT, CUST_NO)&amp;lt;/code&amp;gt;로 바꾸면 Predicate가 어떻게 달라지는가?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;access(&amp;quot;ORDER_DT&amp;quot;&amp;gt;=... AND &amp;quot;ORDER_DT&amp;quot;&amp;lt;=...)&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;filter(&amp;quot;CUST_NO&amp;quot;=&amp;#039;C000123&amp;#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* 선두 컬럼이 &amp;#039;&amp;#039;&amp;#039;범위 조건&amp;#039;&amp;#039;&amp;#039;이면 그 뒤 컬럼은 스캔 범위를 줄이지 못하고 filter가 된다 → 한 달치 인덱스 리프(약 9만 건)를 모두 스캔&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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 4. 테이블 랜덤 액세스 낭비 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
|  1 |  TABLE ACCESS BY INDEX ROWID BATCHED | LAB_ORDER       | 1 |    12 |  45210 |&lt;br /&gt;
|* 2 |   INDEX RANGE SCAN                   | IX_LAB_ORDER_02 | 1 | 45000 |    130 |&lt;br /&gt;
Predicate:&lt;br /&gt;
   1 - filter(&amp;quot;STAT_CD&amp;quot;=&amp;#039;90&amp;#039;)&lt;br /&gt;
   2 - access(&amp;quot;ORDER_DT&amp;quot;&amp;gt;=... AND &amp;quot;ORDER_DT&amp;quot;&amp;lt;...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; 무엇이 비효율이고 어떻게 개선하는가?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
* 인덱스에서 45,000건을 찾아 테이블을 45,000번 방문했지만 &amp;lt;code&amp;gt;STAT_CD&amp;lt;/code&amp;gt; filter로 &amp;#039;&amp;#039;&amp;#039;12건&amp;#039;&amp;#039;&amp;#039;만 남았다 (99.97% 버림)&lt;br /&gt;
* 테이블 단계 순수 Buffers ≈ 45,080&lt;br /&gt;
* 개선: 인덱스 &amp;lt;code&amp;gt;(STAT_CD, ORDER_DT)&amp;lt;/code&amp;gt; 또는 기존 인덱스에 STAT_CD 추가 → 인덱스 단계에서 걸러 테이블 접근 12회&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 5. FILTER 서브쿼리 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
|  0 | SELECT STATEMENT     |            |      1 |   5000 |  60230 |&lt;br /&gt;
|* 1 |  FILTER              |            |      1 |   5000 |  60230 |&lt;br /&gt;
|  2 |   TABLE ACCESS FULL  | LAB_CUST   |      1 |  50000 |    310 |&lt;br /&gt;
|* 3 |   INDEX RANGE SCAN   | IX_LAB_ORDER_01 |  50000 |   5000 |  59920 |&lt;br /&gt;
   1 - filter( EXISTS (SELECT 0 FROM &amp;quot;LAB_ORDER&amp;quot; ... ))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; 이 계획의 처리 방식은? 개선 방법은?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
* FILTER의 자식이 2개 → 서브쿼리를 &amp;#039;&amp;#039;&amp;#039;메인 행마다 실행&amp;#039;&amp;#039;&amp;#039;하는 Filter 방식 (Starts 50,000)&lt;br /&gt;
* 입력값(CUST_NO)이 모두 달라 서브쿼리 캐싱 효과가 없음&lt;br /&gt;
* 개선: 서브쿼리 Unnesting → &amp;lt;code&amp;gt;HASH JOIN SEMI&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;/*+ UNNEST HASH_SJ */&amp;lt;/code&amp;gt;) 또는 조건 추가로 메인 집합 축소&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 6. 정렬과 Temp 사용 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
| Id | Operation          | Name      | A-Rows | Buffers | Reads | Writes | OMem | 1Mem | Used-Mem | Used-Tmp |&lt;br /&gt;
|  1 |  SORT ORDER BY     |           |  3000K |  15420  | 21540 | 21540  | 189M | 4.8M |  25M (1) |    172M  |&lt;br /&gt;
|  2 |   TABLE ACCESS FULL| LAB_ORDER |  3000K |  15420  |     0 |     0  |      |      |          |          |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; Used-Mem 옆의 &amp;lt;code&amp;gt;(1)&amp;lt;/code&amp;gt;과 Used-Tmp는 무엇을 뜻하는가?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
* 최적(OMem) 189MB가 필요했지만 PGA가 부족해 &amp;#039;&amp;#039;&amp;#039;One-Pass&amp;#039;&amp;#039;&amp;#039; 정렬 수행 — &amp;lt;code&amp;gt;(0)&amp;lt;/code&amp;gt; Optimal, &amp;lt;code&amp;gt;(1)&amp;lt;/code&amp;gt; One-Pass, &amp;lt;code&amp;gt;(n)&amp;lt;/code&amp;gt; Multi-Pass&lt;br /&gt;
* Temp 172MB 사용, Reads/Writes는 Temp I/O&lt;br /&gt;
* 개선 순서: ① 정렬이 정말 필요한가 (인덱스로 정렬 대체, Top-N) ② 정렬 대상 컬럼 최소화 ③ PGA(&amp;lt;code&amp;gt;PGA_AGGREGATE_TARGET&amp;lt;/code&amp;gt;) 검토&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 7. 페이징 — STOPKEY ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT /*+ GATHER_PLAN_STATISTICS */ *&lt;br /&gt;
  FROM lab_order&lt;br /&gt;
 WHERE cust_no = &amp;#039;C000123&amp;#039;&lt;br /&gt;
 ORDER BY order_dt DESC&lt;br /&gt;
 FETCH FIRST 10 ROWS ONLY;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
|  1 |  VIEW                          |                 | 1 | 10 |  13 |&lt;br /&gt;
|* 2 |   WINDOW NOSORT STOPKEY        |                 | 1 | 10 |  13 |&lt;br /&gt;
|  3 |    TABLE ACCESS BY INDEX ROWID | LAB_ORDER       | 1 | 11 |  13 |&lt;br /&gt;
|  4 |     INDEX RANGE SCAN DESCENDING| IX_LAB_ORDER_01 | 1 | 11 |   3 |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; 정렬(SORT)이 없는 이유와, 부분 범위 처리가 깨지는 경우는?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
* 인덱스 &amp;lt;code&amp;gt;(CUST_NO, ORDER_DT)&amp;lt;/code&amp;gt;가 이미 정렬되어 있어 &amp;#039;&amp;#039;&amp;#039;DESCENDING 스캔&amp;#039;&amp;#039;&amp;#039;으로 정렬 대체 → &amp;lt;code&amp;gt;NOSORT STOPKEY&amp;lt;/code&amp;gt;로 11건만 읽고 종료&lt;br /&gt;
* 깨지는 경우: ORDER BY 컬럼이 인덱스 순서와 다름, 인덱스에 없는 컬럼으로 정렬, 조건 컬럼 가공, 중간에 GROUP BY·DISTINCT·Hash Join 존재&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 8. 파티션 프루닝 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
| Id | Operation                   | Name      | Pstart | Pstop | A-Rows | Buffers |&lt;br /&gt;
|  1 |  PARTITION RANGE ALL        |           |      1 |    36 |   3000 |  158K   |&lt;br /&gt;
|* 2 |   TABLE ACCESS FULL         | TB_ORDER  |      1 |    36 |   3000 |  158K   |&lt;br /&gt;
   2 - filter(TO_CHAR(&amp;quot;ORDER_DT&amp;quot;,&amp;#039;YYYYMM&amp;#039;)=&amp;#039;202611&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; 왜 36개 파티션을 모두 읽었는가?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
* 파티션 키 &amp;lt;code&amp;gt;ORDER_DT&amp;lt;/code&amp;gt;를 &amp;#039;&amp;#039;&amp;#039;가공&amp;#039;&amp;#039;&amp;#039;하여 프루닝 실패 → &amp;lt;code&amp;gt;PARTITION RANGE ALL&amp;lt;/code&amp;gt;&lt;br /&gt;
* 개선: &amp;lt;code&amp;gt;ORDER_DT &amp;gt;= DATE &amp;#039;2026-11-01&amp;#039; AND ORDER_DT &amp;lt; DATE &amp;#039;2026-12-01&amp;#039;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;PARTITION RANGE SINGLE&amp;lt;/code&amp;gt;, Pstart=Pstop&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 9. 계획 변경 추적 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 같은 SQL의 과거 계획 이력 (Diagnostics Pack 필요)&lt;br /&gt;
SELECT snap_id, plan_hash_value,&lt;br /&gt;
       executions_delta AS execs,&lt;br /&gt;
       ROUND(buffer_gets_delta / NULLIF(executions_delta,0)) AS gets_per_exec,&lt;br /&gt;
       ROUND(elapsed_time_delta / NULLIF(executions_delta,0) / 1000, 1) AS ms_per_exec&lt;br /&gt;
  FROM dba_hist_sqlstat&lt;br /&gt;
 WHERE sql_id = &amp;#039;&amp;amp;sql_id&amp;#039;&lt;br /&gt;
 ORDER BY snap_id;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR(&amp;#039;&amp;amp;sql_id&amp;#039;, &amp;amp;plan_hash_value, NULL, &amp;#039;TYPICAL&amp;#039;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; &amp;quot;어제까지 빨랐는데 오늘 갑자기 느려졌다&amp;quot;를 어떻게 확인하는가?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
* 위 쿼리로 &amp;#039;&amp;#039;&amp;#039;PLAN_HASH_VALUE가 바뀐 시점&amp;#039;&amp;#039;&amp;#039;과 gets_per_exec 변화를 찾는다&lt;br /&gt;
* 계획 변경 원인 후보: 통계 재수집, 바인드 피킹 값 변화, 인덱스 추가·삭제, 파라미터·패치 변경&lt;br /&gt;
* 긴급 조치: 좋은 계획을 &amp;#039;&amp;#039;&amp;#039;SQL Plan Baseline&amp;#039;&amp;#039;&amp;#039;으로 고정 (&amp;lt;code&amp;gt;DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE&amp;lt;/code&amp;gt; 또는 AWR에서 로드)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실습 10. 종합 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
---------------------------------------------------------------------------------------------&lt;br /&gt;
| Id | Operation                       | Name            | Starts | E-Rows | A-Rows | Buffers |&lt;br /&gt;
---------------------------------------------------------------------------------------------&lt;br /&gt;
|  0 | SELECT STATEMENT                |                 |      1 |        |     50 |  412K   |&lt;br /&gt;
|  1 |  SORT ORDER BY                  |                 |      1 |     12 |     50 |  412K   |&lt;br /&gt;
|  2 |   HASH GROUP BY                 |                 |      1 |     12 |     50 |  412K   |&lt;br /&gt;
|  3 |    NESTED LOOPS                 |                 |      1 |   1200 |   102K |  412K   |&lt;br /&gt;
|* 4 |     TABLE ACCESS FULL           | LAB_CUST        |      1 |    100 |   5000 |    310  |&lt;br /&gt;
|* 5 |     TABLE ACCESS BY INDEX ROWID | LAB_ORDER       |   5000 |     12 |   102K |  411K   |&lt;br /&gt;
|* 6 |      INDEX RANGE SCAN           | IX_LAB_ORDER_01 |   5000 |     60 |   306K |  15200  |&lt;br /&gt;
---------------------------------------------------------------------------------------------&lt;br /&gt;
   4 - filter(&amp;quot;C&amp;quot;.&amp;quot;GRADE_CD&amp;quot;=&amp;#039;VIP&amp;#039;)&lt;br /&gt;
   5 - filter(&amp;quot;O&amp;quot;.&amp;quot;STAT_CD&amp;quot;=&amp;#039;10&amp;#039;)&lt;br /&gt;
   6 - access(&amp;quot;O&amp;quot;.&amp;quot;CUST_NO&amp;quot;=&amp;quot;C&amp;quot;.&amp;quot;CUST_NO&amp;quot; AND &amp;quot;O&amp;quot;.&amp;quot;ORDER_DT&amp;quot;&amp;gt;=:B1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:10px 16px;margin-bottom:16px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Q.&amp;#039;&amp;#039;&amp;#039; 문제점을 모두 찾고 개선안을 제시하라.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Id 4 카디널리티 오류&amp;#039;&amp;#039;&amp;#039;: VIP E-Rows 100 vs A-Rows 5,000 (50배) → GRADE_CD 히스토그램 확인&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Id 5 랜덤 액세스 낭비&amp;#039;&amp;#039;&amp;#039;: 인덱스 306K건 → 테이블 방문 306K회 → filter 후 102K건. 테이블 단계 순수 Buffers 약 396K로 &amp;#039;&amp;#039;&amp;#039;전체의 96%&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;조인 방식&amp;#039;&amp;#039;&amp;#039;: Outer 5,000건 × 반복 → 결과가 대량이므로 Hash Join이 유리할 수 있음&lt;br /&gt;
* 개선안 A: 인덱스 &amp;lt;code&amp;gt;(CUST_NO, STAT_CD, ORDER_DT)&amp;lt;/code&amp;gt; + 집계 컬럼 포함 시 테이블 접근 제거&lt;br /&gt;
* 개선안 B: &amp;lt;code&amp;gt;LEADING(c) USE_HASH(o)&amp;lt;/code&amp;gt; + LAB_ORDER Full Scan (약 15K 블록) → 412K → 약 16K&lt;br /&gt;
* 두 안을 실측 비교하고, 실행 빈도(OLTP/배치)에 따라 결정&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. 실행계획 분석 체크리스트 ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #f0d9b5;background:#fffaf0;border-radius:10px;padding:14px 22px;line-height:1.9;&amp;quot;&amp;gt;&lt;br /&gt;
□ &amp;#039;&amp;#039;&amp;#039;실측 계획&amp;#039;&amp;#039;&amp;#039;(ALLSTATS LAST)인가, 예상 계획인가&amp;lt;br/&amp;gt;&lt;br /&gt;
□ 전체 Buffers 중 &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;E-Rows × Starts&amp;#039;&amp;#039;&amp;#039; 와 &amp;#039;&amp;#039;&amp;#039;A-Rows&amp;#039;&amp;#039;&amp;#039;가 10배 이상 차이 나는 단계가 있는가&amp;lt;br/&amp;gt;&lt;br /&gt;
□ &amp;#039;&amp;#039;&amp;#039;filter&amp;#039;&amp;#039;&amp;#039;로 대량의 행이 버려지는 단계가 있는가 (특히 테이블 액세스 단계)&amp;lt;br/&amp;gt;&lt;br /&gt;
□ NL Inner 단계의 &amp;#039;&amp;#039;&amp;#039;Starts&amp;#039;&amp;#039;&amp;#039;가 과도하지 않은가&amp;lt;br/&amp;gt;&lt;br /&gt;
□ &amp;#039;&amp;#039;&amp;#039;Used-Tmp&amp;#039;&amp;#039;&amp;#039; (디스크 정렬·해시)가 발생하는가&amp;lt;br/&amp;gt;&lt;br /&gt;
□ 파티션 테이블에서 &amp;#039;&amp;#039;&amp;#039;PARTITION RANGE ALL&amp;#039;&amp;#039;&amp;#039;이 나오는가&amp;lt;br/&amp;gt;&lt;br /&gt;
□ Note 섹션에 dynamic sampling, SQL profile, baseline 사용이 표시되는가&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 #6e2c00;background:#fdf7f2;border-radius:0 0 10px 10px;font-size:13px;color:#5a4a3a;&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 리포트 분석]]&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>