<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<p>Performance profiling is the systematic analysis of query execution to identify bottlenecks, optimize resource usage, and improve response times. In Geode, profiling capabilities provide detailed insights into how GQL queries execute, enabling data-driven optimization decisions for graph database workloads.</p>
<h3 id="understanding-performance-profiling" class="position-relative d-flex align-items-center group">
<span>Understanding Performance Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="understanding-performance-profiling"
aria-haspopup="dialog"
aria-label="Share link: Understanding Performance Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Performance profiling reveals the internal execution characteristics of database queries, exposing where time is spent and resources are consumed. For graph databases like Geode, profiling becomes particularly important due to the complex traversal patterns and relationship-heavy operations that can exhibit non-linear performance characteristics.</p>
<h4 id="why-profile-graph-queries" class="position-relative d-flex align-items-center group">
<span>Why Profile Graph Queries</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="why-profile-graph-queries"
aria-haspopup="dialog"
aria-label="Share link: Why Profile Graph Queries">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Graph queries differ fundamentally from relational queries. A graph traversal can touch a few nodes or millions, depending on data density and relationship patterns. Without profiling, developers operate blind to execution efficiency, potentially deploying queries that perform well on test data but degrade dramatically in production.</p>
<p>Profiling provides concrete metrics on execution time, rows processed, index utilization, and memory consumption. This empirical evidence guides optimization efforts toward the operations that actually impact performance, rather than premature optimization based on assumptions.</p>
<h4 id="profiling-vs-explaining" class="position-relative d-flex align-items-center group">
<span>Profiling vs. Explaining</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profiling-vs-explaining"
aria-haspopup="dialog"
aria-label="Share link: Profiling vs. Explaining">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode provides two complementary analysis tools: EXPLAIN shows the query execution plan without running the query, while PROFILE executes the query and provides actual runtime metrics. EXPLAIN helps understand what the optimizer intends to do, while PROFILE reveals what actually happened during execution.</p>
<h3 id="the-profile-command" class="position-relative d-flex align-items-center group">
<span>The PROFILE Command</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="the-profile-command"
aria-haspopup="dialog"
aria-label="Share link: The PROFILE Command">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode’s PROFILE command executes a query while collecting detailed performance metrics.</p>
<h4 id="basic-profiling" class="position-relative d-flex align-items-center group">
<span>Basic Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="basic-profiling"
aria-haspopup="dialog"
aria-label="Share link: Basic Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>The simplest profiling workflow prefixes any GQL query with the PROFILE keyword:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">age</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>This executes the query normally but returns additional metadata about execution characteristics, including:</p>
<ul>
<li>Total execution time</li>
<li>Rows examined vs. rows returned</li>
<li>Index usage statistics</li>
<li>Memory allocation patterns</li>
<li>Join and traversal metrics</li>
</ul>
<h4 id="interpreting-profile-output" class="position-relative d-flex align-items-center group">
<span>Interpreting Profile Output</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="interpreting-profile-output"
aria-haspopup="dialog"
aria-label="Share link: Interpreting Profile Output">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Profile output includes multiple sections, each providing specific insights into query execution.</p>
<p>The execution summary shows overall timing:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 45.2ms
</span></span><span class="line"><span class="cl">Rows Examined: 15,420
</span></span><span class="line"><span class="cl">Rows Returned: 3,847
</span></span><span class="line"><span class="cl">Index Scans: 1 (Person.age)
</span></span><span class="line"><span class="cl">Full Scans: 0
</span></span></code></pre></div><p>This immediately reveals efficiency: the query scanned 15,420 rows to return 3,847, indicating reasonable selectivity. The index scan on Person.age avoided a full table scan.</p>
<h4 id="detailed-execution-steps" class="position-relative d-flex align-items-center group">
<span>Detailed Execution Steps</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="detailed-execution-steps"
aria-haspopup="dialog"
aria-label="Share link: Detailed Execution Steps">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>More detailed profiling breaks down execution into individual operations:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">1. Index Scan (Person.age > 30)
</span></span><span class="line"><span class="cl"> Time: 12.3ms
</span></span><span class="line"><span class="cl"> Rows: 15,420
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2. Property Access (n.name, n.age)
</span></span><span class="line"><span class="cl"> Time: 18.7ms
</span></span><span class="line"><span class="cl"> Rows: 15,420
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3. Result Materialization
</span></span><span class="line"><span class="cl"> Time: 14.2ms
</span></span><span class="line"><span class="cl"> Rows: 3,847
</span></span></code></pre></div><p>This granular breakdown identifies the property access phase as the primary time consumer, suggesting potential optimization through projection reduction or property indexing.</p>
<h3 id="profiling-graph-traversals" class="position-relative d-flex align-items-center group">
<span>Profiling Graph Traversals</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profiling-graph-traversals"
aria-haspopup="dialog"
aria-label="Share link: Profiling Graph Traversals">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Graph traversals present unique profiling challenges due to their recursive and relationship-oriented nature.</p>
<h4 id="simple-traversal-profiling" class="position-relative d-flex align-items-center group">
<span>Simple Traversal Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="simple-traversal-profiling"
aria-haspopup="dialog"
aria-label="Share link: Simple Traversal Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>A basic friend-of-friend query demonstrates traversal profiling:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">friend</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">fof</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">fof</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profile output reveals traversal efficiency:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 156.8ms
</span></span><span class="line"><span class="cl">Traversal Depth: 2
</span></span><span class="line"><span class="cl">Starting Nodes: 1 (index lookup)
</span></span><span class="line"><span class="cl">Intermediate Nodes: 47 (first hop)
</span></span><span class="line"><span class="cl">Final Nodes: 892 (second hop)
</span></span><span class="line"><span class="cl">Distinct Results: 623
</span></span></code></pre></div><p>The expanding traversal from 1 to 47 to 892 nodes shows typical graph “fan-out” behavior. The DISTINCT operation reduced 892 nodes to 623 unique results, indicating some overlap in friend networks.</p>
<h4 id="variable-length-path-profiling" class="position-relative d-flex align-items-center group">
<span>Variable-Length Path Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="variable-length-path-profiling"
aria-haspopup="dialog"
aria-label="Share link: Variable-Length Path Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Variable-length paths can have unpredictable performance:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="err">*</span><span class="py">1</span><span class="err">.</span><span class="mf">.3</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">connected</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">connected</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">length</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">distance</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profiling variable-length paths reveals how many paths were explored:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 2,341ms
</span></span><span class="line"><span class="cl">Paths Explored: 45,672
</span></span><span class="line"><span class="cl">Paths Matched: 1,124
</span></span><span class="line"><span class="cl">Average Path Length: 1.8
</span></span><span class="line"><span class="cl">Max Path Length: 3
</span></span><span class="line"><span class="cl">Traversal Strategy: Breadth-First
</span></span></code></pre></div><p>The large difference between explored (45,672) and matched (1,124) paths indicates significant pruning. If this ratio is too high, constraining the search with additional filters can improve performance.</p>
<h4 id="traversal-strategy-analysis" class="position-relative d-flex align-items-center group">
<span>Traversal Strategy Analysis</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="traversal-strategy-analysis"
aria-haspopup="dialog"
aria-label="Share link: Traversal Strategy Analysis">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode’s optimizer chooses traversal strategies based on query patterns. Profiling reveals which strategy was selected:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Traversal Strategy: Depth-First Search
</span></span><span class="line"><span class="cl">Reasoning: Low branching factor detected
</span></span><span class="line"><span class="cl">Nodes Visited: 234
</span></span><span class="line"><span class="cl">Backtracking Events: 12
</span></span></code></pre></div><p>Understanding the chosen strategy helps evaluate whether the optimizer made optimal decisions for the actual data distribution.</p>
<h3 id="profiling-aggregations" class="position-relative d-flex align-items-center group">
<span>Profiling Aggregations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profiling-aggregations"
aria-haspopup="dialog"
aria-label="Share link: Profiling Aggregations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Aggregation queries require profiling to understand grouping and computation costs.</p>
<h4 id="group-by-performance" class="position-relative d-flex align-items-center group">
<span>Group By Performance</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="group-by-performance"
aria-haspopup="dialog"
aria-label="Share link: Group By Performance">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Profiling a grouped aggregation:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">WORKS_AT</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">c</span><span class="p">:</span><span class="nc">Company</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">c</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">employees</span><span class="p">,</span><span class="w"> </span><span class="py">avg</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">salary</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">avg_salary</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">employees</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profile output breaks down aggregation costs:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 234.5ms
</span></span><span class="line"><span class="cl">Traversal Time: 89.2ms (Person -> Company)
</span></span><span class="line"><span class="cl">Grouping Time: 78.3ms (12 groups)
</span></span><span class="line"><span class="cl">Aggregation Time: 45.6ms (count, avg)
</span></span><span class="line"><span class="cl">Sorting Time: 21.4ms
</span></span><span class="line"><span class="cl">Rows Processed: 8,456
</span></span><span class="line"><span class="cl">Groups Created: 12
</span></span></code></pre></div><p>The grouping operation consumed the most time after traversal. With only 12 groups from 8,456 rows, the grouping is highly selective, which is efficient.</p>
<h4 id="complex-aggregation-analysis" class="position-relative d-flex align-items-center group">
<span>Complex Aggregation Analysis</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="complex-aggregation-analysis"
aria-haspopup="dialog"
aria-label="Share link: Complex Aggregation Analysis">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Nested aggregations or aggregations over traversals can be expensive:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">friend</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">LIKES</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">product</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">friend</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">friend_count</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">collect</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">product</span><span class="err">.</span><span class="py">name</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">liked_products</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profile output reveals collection costs:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 1,567ms
</span></span><span class="line"><span class="cl">Distinct Operations: 2 (friend, product)
</span></span><span class="line"><span class="cl">Collections Built: 847 (one per person)
</span></span><span class="line"><span class="cl">Collection Avg Size: 12.3 products
</span></span><span class="line"><span class="cl">Memory Allocated: 23.4MB
</span></span></code></pre></div><p>The memory allocation metric becomes critical for large result sets, indicating potential memory pressure.</p>
<h3 id="index-usage-profiling" class="position-relative d-flex align-items-center group">
<span>Index Usage Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="index-usage-profiling"
aria-haspopup="dialog"
aria-label="Share link: Index Usage Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Indexes dramatically affect performance, making index usage profiling essential.</p>
<h4 id="index-scan-detection" class="position-relative d-flex align-items-center group">
<span>Index Scan Detection</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="index-scan-detection"
aria-haspopup="dialog"
aria-label="Share link: Index Scan Detection">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Profiling reveals whether indexes were used:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">email</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">alice</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Ideal profile output shows index usage:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 2.3ms
</span></span><span class="line"><span class="cl">Index Used: Person.email (unique)
</span></span><span class="line"><span class="cl">Index Scan Time: 1.8ms
</span></span><span class="line"><span class="cl">Rows Examined: 1
</span></span><span class="line"><span class="cl">Rows Returned: 1
</span></span></code></pre></div><p>Without an index, the profile would show:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 145.7ms
</span></span><span class="line"><span class="cl">Full Table Scan: Person
</span></span><span class="line"><span class="cl">Rows Examined: 15,420
</span></span><span class="line"><span class="cl">Rows Returned: 1
</span></span></code></pre></div><p>The dramatic difference (2.3ms vs 145.7ms) demonstrates index value.</p>
<h4 id="composite-index-analysis" class="position-relative d-flex align-items-center group">
<span>Composite Index Analysis</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="composite-index-analysis"
aria-haspopup="dialog"
aria-label="Share link: Composite Index Analysis">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Composite indexes require specific query patterns for optimal use:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">San</span><span class="w"> </span><span class="py">Francisco</span><span class="err">'</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profile output indicates index utilization:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Index Used: Person(city, age) - Full
</span></span><span class="line"><span class="cl">Reasoning: Both predicates match index
</span></span><span class="line"><span class="cl">Rows Examined: 847
</span></span><span class="line"><span class="cl">Rows Returned: 847
</span></span></code></pre></div><p>If only part of the composite index is used:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Index Used: Person(city, age) - Partial (city only)
</span></span><span class="line"><span class="cl">Reasoning: age predicate not in index-compatible form
</span></span><span class="line"><span class="cl">Rows Examined: 2,341
</span></span><span class="line"><span class="cl">Rows Returned: 847
</span></span></code></pre></div><p>This indicates optimization opportunity by restructuring the query or index.</p>
<h3 id="profiling-join-operations" class="position-relative d-flex align-items-center group">
<span>Profiling Join Operations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profiling-join-operations"
aria-haspopup="dialog"
aria-label="Share link: Profiling Join Operations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Graph joins, particularly between multiple patterns, require profiling to optimize join strategies.</p>
<h4 id="pattern-join-profiling" class="position-relative d-flex align-items-center group">
<span>Pattern Join Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pattern-join-profiling"
aria-haspopup="dialog"
aria-label="Share link: Pattern Join Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Multiple MATCH patterns create implicit joins:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">WORKS_AT</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">c</span><span class="p">:</span><span class="nc">Company</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">LIVES_IN</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">city</span><span class="p">:</span><span class="nc">City</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">c</span><span class="err">.</span><span class="py">industry</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">Technology</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">city</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">San</span><span class="w"> </span><span class="py">Francisco</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profile output shows join execution:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 456.8ms
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pattern 1: Person-WORKS_AT->Company
</span></span><span class="line"><span class="cl"> Index: Company.industry
</span></span><span class="line"><span class="cl"> Rows: 3,421 persons
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pattern 2: Person-LIVES_IN->City
</span></span><span class="line"><span class="cl"> Index: City.name
</span></span><span class="line"><span class="cl"> Rows: 15,234 persons
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Join Strategy: Hash Join on Person.id
</span></span><span class="line"><span class="cl"> Left Input: 3,421
</span></span><span class="line"><span class="cl"> Right Input: 15,234
</span></span><span class="line"><span class="cl"> Join Output: 892
</span></span><span class="line"><span class="cl"> Join Time: 234.5ms
</span></span></code></pre></div><p>The join strategy and timing help evaluate whether query restructuring could improve performance.</p>
<h3 id="memory-profiling" class="position-relative d-flex align-items-center group">
<span>Memory Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="memory-profiling"
aria-haspopup="dialog"
aria-label="Share link: Memory Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Understanding memory consumption prevents out-of-memory errors and identifies optimization opportunities.</p>
<h4 id="materialization-costs" class="position-relative d-flex align-items-center group">
<span>Materialization Costs</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="materialization-costs"
aria-haspopup="dialog"
aria-label="Share link: Materialization Costs">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Some operations require materializing intermediate results:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="err">*</span><span class="py">2</span><span class="err">.</span><span class="mf">.4</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">connected</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">connected</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">connected</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Memory profiling reveals:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 3,421ms
</span></span><span class="line"><span class="cl">Peak Memory: 156.7MB
</span></span><span class="line"><span class="cl">Memory Breakdown:
</span></span><span class="line"><span class="cl"> - Path Exploration: 89.2MB
</span></span><span class="line"><span class="cl"> - Distinct Set: 45.3MB
</span></span><span class="line"><span class="cl"> - Sort Buffer: 22.2MB
</span></span></code></pre></div><p>Large memory consumption may indicate the need for query restructuring or result streaming.</p>
<h4 id="collection-memory-usage" class="position-relative d-flex align-items-center group">
<span>Collection Memory Usage</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="collection-memory-usage"
aria-haspopup="dialog"
aria-label="Share link: Collection Memory Usage">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>COLLECT operations can consume significant memory:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">product</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">(</span><span class="py">product</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">purchases</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Memory profiling shows collection sizes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Collections Created: 8,234
</span></span><span class="line"><span class="cl">Average Collection Size: 15.6 items
</span></span><span class="line"><span class="cl">Peak Memory: 67.8MB
</span></span></code></pre></div><p>If individual collections become very large, consider pagination or limiting collection size.</p>
<h3 id="comparative-profiling" class="position-relative d-flex align-items-center group">
<span>Comparative Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="comparative-profiling"
aria-haspopup="dialog"
aria-label="Share link: Comparative Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Comparing alternative query formulations identifies the most efficient approach.</p>
<h4 id="query-variant-comparison" class="position-relative d-flex align-items-center group">
<span>Query Variant Comparison</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="query-variant-comparison"
aria-haspopup="dialog"
aria-label="Share link: Query Variant Comparison">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Two queries achieving the same result can have different performance:</p>
<p>Version 1:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">friend</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">friend</span><span class="err">.</span><span class="py">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">Boston</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">(</span><span class="py">friend</span><span class="err">.</span><span class="py">name</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">boston_friends</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Version 2:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">friend</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">friend</span><span class="err">.</span><span class="py">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">Boston</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="py">f</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">collect</span><span class="p">(</span><span class="py">friend</span><span class="p">)</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">f</span><span class="err">.</span><span class="py">name</span><span class="p">]</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">boston_friends</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Comparing profile outputs reveals performance differences based on filtering location, collection strategy, and property access patterns.</p>
<h3 id="profiling-best-practices" class="position-relative d-flex align-items-center group">
<span>Profiling Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profiling-best-practices"
aria-haspopup="dialog"
aria-label="Share link: Profiling Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Effective profiling follows systematic approaches.</p>
<h4 id="establish-baselines" class="position-relative d-flex align-items-center group">
<span>Establish Baselines</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="establish-baselines"
aria-haspopup="dialog"
aria-label="Share link: Establish Baselines">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Before optimization, profile current performance to establish baselines:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Profile</span><span class="w"> </span><span class="py">current</span><span class="w"> </span><span class="kd">query</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FRIEND</span><span class="err">*</span><span class="py">1</span><span class="err">.</span><span class="mf">.3</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">connected</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">Seattle</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">connected</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Record baseline metrics:</p>
<ul>
<li>Execution time: 2,341ms</li>
<li>Rows examined: 145,623</li>
<li>Memory used: 78.2MB</li>
</ul>
<h4 id="isolate-variables" class="position-relative d-flex align-items-center group">
<span>Isolate Variables</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="isolate-variables"
aria-haspopup="dialog"
aria-label="Share link: Isolate Variables">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>When testing optimizations, change one variable at a time:</p>
<ol>
<li>Profile original query</li>
<li>Add index and profile again</li>
<li>Compare metrics to isolate index impact</li>
<li>Try alternative formulation and profile</li>
<li>Compare all variants</li>
</ol>
<h4 id="profile-representative-data" class="position-relative d-flex align-items-center group">
<span>Profile Representative Data</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profile-representative-data"
aria-haspopup="dialog"
aria-label="Share link: Profile Representative Data">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Always profile against production-like data volumes and distributions. Test data that is too small or too uniform can give misleading profiling results.</p>
<h4 id="profile-under-load" class="position-relative d-flex align-items-center group">
<span>Profile Under Load</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profile-under-load"
aria-haspopup="dialog"
aria-label="Share link: Profile Under Load">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Query performance can degrade under concurrent load. Profile in realistic multi-user scenarios:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Run concurrent profiling sessions</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> i in <span class="o">{</span>1..10<span class="o">}</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl"> ./geode shell < profile_queries.gql <span class="p">&</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span></code></pre></div>
<h3 id="profiling-tools-and-techniques" class="position-relative d-flex align-items-center group">
<span>Profiling Tools and Techniques</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profiling-tools-and-techniques"
aria-haspopup="dialog"
aria-label="Share link: Profiling Tools and Techniques">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Beyond the PROFILE command, additional techniques provide profiling insights.</p>
<h4 id="server-side-logging" class="position-relative d-flex align-items-center group">
<span>Server-Side Logging</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="server-side-logging"
aria-haspopup="dialog"
aria-label="Share link: Server-Side Logging">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Configure Geode to log slow queries automatically:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">geode serve <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --slow-query-log <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --slow-query-threshold <span class="m">1000</span> <span class="c1"># Log queries >1s</span>
</span></span></code></pre></div><p>This captures problematic queries in production without manual profiling.</p>
<h4 id="client-side-profiling" class="position-relative d-flex align-items-center group">
<span>Client-Side Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="client-side-profiling"
aria-haspopup="dialog"
aria-label="Share link: Client-Side Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Client libraries can measure round-trip time:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">start</span> <span class="o">:=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">Now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nx">result</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">conn</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">query</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">elapsed</span> <span class="o">:=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">Since</span><span class="p">(</span><span class="nx">start</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nx">log</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">"Query took %v"</span><span class="p">,</span> <span class="nx">elapsed</span><span class="p">)</span>
</span></span></code></pre></div><p>This includes network latency and client processing, complementing server-side profiling.</p>
<h4 id="automated-profiling" class="position-relative d-flex align-items-center group">
<span>Automated Profiling</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="automated-profiling"
aria-haspopup="dialog"
aria-label="Share link: Automated Profiling">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Integrate profiling into CI/CD pipelines to detect performance regressions:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># GitLab CI example</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">test_performance</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">script</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">./run_profile_suite.sh</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">./compare_to_baseline.sh</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">artifacts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">performance</span><span class="p">:</span><span class="w"> </span><span class="l">profile_results.json</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="profiling-common-patterns" class="position-relative d-flex align-items-center group">
<span>Profiling Common Patterns</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profiling-common-patterns"
aria-haspopup="dialog"
aria-label="Share link: Profiling Common Patterns">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Certain query patterns have predictable profiling characteristics.</p>
<h4 id="hub-node-queries" class="position-relative d-flex align-items-center group">
<span>Hub Node Queries</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="hub-node-queries"
aria-haspopup="dialog"
aria-label="Share link: Hub Node Queries">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Queries involving high-degree nodes (hubs) often show performance issues:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">hub</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Influencer</span><span class="err">'</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">follower</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">follower</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profile output reveals hub impact:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 5,234ms
</span></span><span class="line"><span class="cl">Starting Node Degree: 1,245,678
</span></span><span class="line"><span class="cl">Followers Traversed: 1,245,678
</span></span></code></pre></div><p>High-degree nodes require special handling, possibly through relationship sampling or pagination.</p>
<h4 id="path-finding-queries" class="position-relative d-flex align-items-center group">
<span>Path Finding Queries</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="path-finding-queries"
aria-haspopup="dialog"
aria-label="Share link: Path Finding Queries">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Shortest path queries have specific profiling needs:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="py">path</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">shortestPath</span><span class="p">((</span><span class="py">a</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="err">*</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">b</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Bob</span><span class="err">'</span><span class="p">}))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">length</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profile output shows search efficiency:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Execution Time: 234ms
</span></span><span class="line"><span class="cl">Algorithm: Bidirectional Dijkstra
</span></span><span class="line"><span class="cl">Nodes Explored: 1,247
</span></span><span class="line"><span class="cl">Path Length: 4
</span></span></code></pre></div><p>The nodes explored metric indicates search efficiency; high exploration suggests sparse connectivity or long paths.</p>
<h3 id="optimization-workflow" class="position-relative d-flex align-items-center group">
<span>Optimization Workflow</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="optimization-workflow"
aria-haspopup="dialog"
aria-label="Share link: Optimization Workflow">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Profiling drives a systematic optimization workflow.</p>
<h4 id="step-1-profile-current-state" class="position-relative d-flex align-items-center group">
<span>Step 1: Profile Current State</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-1-profile-current-state"
aria-haspopup="dialog"
aria-label="Share link: Step 1: Profile Current State">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="p">[</span><span class="py">your</span><span class="w"> </span><span class="kd">query</span><span class="p">]</span><span class="w">
</span></span></span></code></pre></div><p>Document baseline metrics comprehensively.</p>
<h4 id="step-2-identify-bottlenecks" class="position-relative d-flex align-items-center group">
<span>Step 2: Identify Bottlenecks</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-2-identify-bottlenecks"
aria-haspopup="dialog"
aria-label="Share link: Step 2: Identify Bottlenecks">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Analyze profile output to find:</p>
<ul>
<li>Longest-running operations</li>
<li>Highest row examination counts</li>
<li>Memory pressure points</li>
<li>Missing index usage</li>
</ul>
<h4 id="step-3-hypothesize-improvements" class="position-relative d-flex align-items-center group">
<span>Step 3: Hypothesize Improvements</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-3-hypothesize-improvements"
aria-haspopup="dialog"
aria-label="Share link: Step 3: Hypothesize Improvements">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Based on bottlenecks, form specific hypotheses:</p>
<ul>
<li>“Adding an index on Person.age would reduce scan time”</li>
<li>“Limiting traversal depth would reduce explored paths”</li>
<li>“Filtering earlier would reduce intermediate results”</li>
</ul>
<h4 id="step-4-test-hypotheses" class="position-relative d-flex align-items-center group">
<span>Step 4: Test Hypotheses</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-4-test-hypotheses"
aria-haspopup="dialog"
aria-label="Share link: Step 4: Test Hypotheses">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Implement one change and profile again:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="p">(</span><span class="py">age</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Profile</span><span class="w"> </span><span class="py">again</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w"> </span><span class="py">WHERE</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">30</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">age</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="step-5-compare-results" class="position-relative d-flex align-items-center group">
<span>Step 5: Compare Results</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-5-compare-results"
aria-haspopup="dialog"
aria-label="Share link: Step 5: Compare Results">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Compare new profile to baseline to quantify improvement.</p>
<h4 id="step-6-iterate" class="position-relative d-flex align-items-center group">
<span>Step 6: Iterate</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-6-iterate"
aria-haspopup="dialog"
aria-label="Share link: Step 6: Iterate">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Continue identifying bottlenecks and testing improvements until performance meets requirements.</p>
<h3 id="advanced-profiling-techniques" class="position-relative d-flex align-items-center group">
<span>Advanced Profiling Techniques</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="advanced-profiling-techniques"
aria-haspopup="dialog"
aria-label="Share link: Advanced Profiling Techniques">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Expert-level profiling goes beyond basic PROFILE commands.</p>
<h4 id="profiling-sub-queries" class="position-relative d-flex align-items-center group">
<span>Profiling Sub-Queries</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profiling-sub-queries"
aria-haspopup="dialog"
aria-label="Share link: Profiling Sub-Queries">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Complex queries with sub-queries require profiling at multiple levels:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p2</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">avg</span><span class="p">(</span><span class="py">p2</span><span class="err">.</span><span class="py">age</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profile output breaks down main query and sub-query execution separately.</p>
<h4 id="profiling-with-clauses" class="position-relative d-flex align-items-center group">
<span>Profiling WITH Clauses</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="profiling-with-clauses"
aria-haspopup="dialog"
aria-label="Share link: Profiling WITH Clauses">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>WITH clauses create query pipelines; profile each stage:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">prod</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">p</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">prod</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">purchase_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">purchase_count</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">LIVES_IN</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">city</span><span class="p">:</span><span class="nc">City</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">city</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">high_value_customers</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Profile output shows execution time and row counts at each WITH boundary.</p>
<h3 id="related-topics" class="position-relative d-flex align-items-center group">
<span>Related Topics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-topics"
aria-haspopup="dialog"
aria-label="Share link: Related Topics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Performance profiling connects to several related areas:</p>
<ul>
<li><strong>Performance Tuning</strong> - Applying profiling insights to optimize configuration</li>
<li><strong>Query Optimization</strong> - Restructuring queries based on profiling data</li>
<li><strong>Index Management</strong> - Creating indexes informed by profiling analysis</li>
<li><strong>Monitoring</strong> - Continuous profiling in production environments</li>
<li><strong>Troubleshooting</strong> - Using profiling to diagnose performance issues</li>
</ul>
<h3 id="resources" class="position-relative d-flex align-items-center group">
<span>Resources</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="resources"
aria-haspopup="dialog"
aria-label="Share link: Resources">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Additional profiling resources:</p>
<ul>
<li>Geode PROFILE command documentation with complete syntax reference</li>
<li>Query optimization guides with profiling-driven examples</li>
<li>Performance benchmarking methodologies for graph databases</li>
<li>ISO/IEC 39075:2024 GQL standard profiling facilities</li>
</ul>
<p>Performance profiling transforms database optimization from guesswork into an evidence-based engineering discipline. By systematically measuring query execution characteristics, developers can make informed decisions that demonstrably improve application performance and user experience.</p>
Tag
2 articles
Performance Profiling
Learn performance profiling techniques for Geode graph queries including execution analysis, bottleneck identification, and query optimization strategies.