Query execution plan

쿼리 실행 계획

A plan shows how the database scans, joins, and sorts to answer a query.

···
html
<div class="demo"><div class="head"><b>EXPLAIN</b><span>WHERE id = 42</span></div><div class="stage plans"><div class="route"><strong>Seq Scan</strong><div class="track" id="wide"></div><small>all rows</small></div><div class="route"><strong>Index Scan</strong><div class="track" id="narrow"></div><small>candidate rows</small></div></div><div class="foot"><span id="planstep">reading rows</span><span>same SQL</span></div></div>
css
*{box-sizing:border-box}.demo{width:min(96vw,820px);height:min(94vh,350px);padding:clamp(8px,2vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(5px,1.5vmin,12px);font:600 clamp(12px,3.5vmin,15px)/1.25 var(--font-sans),sans-serif;overflow:hidden}.head,.foot,.row{display:flex;justify-content:space-between;align-items:center;gap:8px}.head b{color:var(--accent)}.head span,.foot,.muted{color:var(--muted)}.stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:8px}.cell,.pill{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(4px,1.2vmin,9px);text-align:center}.pill{border-radius:999px}.on{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 17%,var(--surface))!important;color:var(--fg)!important}.bad{border-color:#e16a5d!important;background:color-mix(in srgb,#e16a5d 18%,var(--surface))!important}.foot{font-size:clamp(12px,3vmin,14px)}.plans{flex-direction:column;align-items:stretch;justify-content:center}.route{display:grid;grid-template-columns:85px 1fr 95px;align-items:center;gap:7px}.route strong{white-space:nowrap;font-size:12px}.route small{font-size:12px;color:var(--muted)}.track{height:clamp(15px,4vmin,24px);border-radius:5px;background:var(--bg);border:1px solid var(--line);overflow:hidden}.track:before{content:'';display:block;height:100%;width:0;background:var(--accent);transition:width .5s}.track.active:before{width:var(--fill)}#wide{--fill:95%}#narrow{--fill:18%}@media(max-width:400px){.route{grid-template-columns:75px 1fr}.route small{display:none}}
js
let n=0;function tick(){document.querySelectorAll('.track').forEach((e,i)=>e.classList.toggle('active',i===n));document.getElementById('planstep').textContent=n?'index narrows candidates':'scan reads every row';n=1-n}tick();const t=setInterval(tick,1200);document.querySelector('.demo').onclick=()=>{clearInterval(t);tick()}

An execution plan is the tree of operations chosen by the optimizer for a SQL statement. The same SQL may use a sequential scan or an index scan depending on data distribution, statistics, and indexes.

The demo compares a broad scan with an index path that narrows candidates. Inspect actual time, rows, and buffers alongside estimated cost.

When to use

Use EXPLAIN ANALYZE to locate scan, join, or sort bottlenecks in a slow query.

Open as page ↗