with one click
ln-651-query-efficiency-auditor
// Checks redundant fetches, N+1 loops, over-fetching, missing bulk operations, wrong caching scope. Use when auditing query efficiency.
// Checks redundant fetches, N+1 loops, over-fetching, missing bulk operations, wrong caching scope. Use when auditing query efficiency.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | ln-651-query-efficiency-auditor |
| description | Checks redundant fetches, N+1 loops, over-fetching, missing bulk operations, wrong caching scope. Use when auditing query efficiency. |
| allowed-tools | Read, Grep, Glob, Bash, mcp__hex-graph__find_references, mcp__hex-graph__trace_paths, mcp__hex-line__read_file, mcp__hex-line__grep_search, mcp__hex-line__outline |
| license | MIT |
Paths: File paths (
references/,../ln-*) are relative to this skill directory.
Type: L3 Worker
Specialized worker auditing database query patterns for redundancy, inefficiency, and misuse.
MANDATORY READ: Load references/audit_worker_core_contract.md.
Tool policy: follow host AGENTS.md MCP preferences; load references/mcp_tool_preferences.md and references/mcp_integration_patterns.md only when host policy is absent or MCP behavior is unclear.
Receives contextStore with: tech_stack, best_practices, db_config (database type, ORM settings), codebase_root, output_dir.
Domain-aware: Supports domain_mode + current_domain.
Use hex-graph first when reference chains or call paths materially improve query analysis. Use hex-line first for local code/config reads when available. If MCP is unavailable, unsupported, or not indexed, continue with built-in Read/Grep/Glob/Bash and state the fallback in the report.
Detection policy: use two-layer detection (candidate scan, then context verification); load references/two_layer_detection.md only when the verification method is ambiguous.
Parse context from contextStore
Scan codebase for violations
scan_pathCollect findings with severity, location, effort, recommendation
Calculate score using penalty algorithm
Write Report: Build full markdown report in memory per references/templates/audit_worker_report_template.md, write to {output_dir}/ln-651--global.md in single Write call
Return Summary: Return minimal summary to coordinator (see Output Format)
What: Same entity fetched from DB twice in a call chain
Detection:
repo.get(id) or session.get(Model, id), then passes id (not object) to function Brepo.get(id) or session.get(Model, id) for the same entityacquire_next_pending() returns job, but _process_job(job_id) re-fetches itDetection patterns (Python/SQLAlchemy):
repo.*get_by_id|session\.get\(|session\.query.*filter.*id in service/handler filesentity_id: int/UUID AND internally does repo.get(entity_id), check if caller already has entity objectexpire_on_commit setting: if False, objects remain valid after commitSeverity:
Recommendation: Pass entity object instead of ID, or remove second fetch when expire_on_commit=False
Effort: S (change signature to accept object instead of ID)
What: Loop of individual UPDATE/DELETE operations instead of single batch query
Detection:
for item in items: await repo.update(item.id, ...) or for item in items: await repo.delete(item.id)for item in items: session.execute(update(Model).where(...))Detection patterns:
for .* in .*: followed by repo\.(update|delete|reset|save|mark_) within 1-3 linesfor .* in .*: followed by session\.execute\(.*update\( within 1-3 linesSeverity:
Recommendation: Replace with single UPDATE ... WHERE id IN (...) or session.execute(update(Model).where(Model.id.in_(ids)))
Effort: M (rewrite query + test)
What: Re-resolving a value from DB when it is already available in the caller's scope
Detection:
profile_id and resolves engine from it, but caller already determined enginelang_code and looks up dialect_id, but caller already has both lang and dialectX_id, does get(X_id), extracts .field, when caller already has fieldSeverity:
Recommendation: Split method into two variants: with_known_value(value, ...) and resolving_value(id, ...); or pass resolved value directly
Effort: S-M (refactor signature, update callers)
What: Loading full ORM model when only few fields are needed
Detection:
session.query(Model) or select(Model) without .options(load_only(...)) for models with >10 columnsSeverity:
Recommendation: Use load_only(), defer(), or raw select(Model.col1, Model.col2) for list queries
Effort: S (add load_only to query)
What: Sequential INSERT/DELETE/UPDATE instead of bulk operations
Detection:
for item in items: session.add(item) instead of session.add_all(items)for item in items: session.delete(item) instead of bulk deleteINSERT per iterationSeverity:
Recommendation: Use session.add_all(), session.execute(insert(Model).values(list_of_dicts)), bulk_save_objects()
Effort: S (replace loop with bulk call)
What: Request-scoped cache for data that rarely changes (should be app-scoped)
Detection:
Depends()) with internal cache (_cache dict, _loaded flag)Detection patterns:
_cache, _loaded, _initialized attributesSeverity:
Recommendation: Move cache to app-scoped service (singleton), add TTL-based invalidation, or use CacheService with configurable TTL
Effort: M (change DI scope, add TTL logic)
MANDATORY READ: Load references/audit_scoring.md.
MANDATORY READ: Load references/templates/audit_worker_report_template.md.
Write JSON summary per references/audit_summary_contract.md. In managed mode the caller passes both runId and summaryArtifactPath; in standalone mode the worker generates its own run-scoped artifact path per shared contract.
Write report to {output_dir}/ln-651--global.md with category: "Query Efficiency" and checks: redundant_fetch, n_update_delete_loop, unnecessary_resolve, over_fetching, missing_bulk_ops, wrong_caching_scope.
Return summary per references/audit_summary_contract.md.
When summaryArtifactPath is absent, write the standalone runtime summary under .hex-skills/runtime-artifacts/runs/{run_id}/evaluation-worker/{worker}--{identifier}.json and optionally echo the same summary in structured output.
Report written: .hex-skills/runtime-artifacts/runs/{run_id}/audit-report/ln-651--global.md
Score: X.X/10 | Issues: N (C:N H:N M:N L:N)
Apply the already-loaded references/audit_worker_core_contract.md.
expire_on_commit, autoflush, session scope before flagging redundant fetchesApply the already-loaded references/audit_worker_core_contract.md.
{output_dir}/ln-651--global.md (atomic single Write call)references/audit_output_schema.mdVersion: 1.0.0 Last Updated: 2026-02-04