skills-catalog/ln-651-query-efficiency-auditor/SKILL.md
Checks redundant fetches, N+1 loops, over-fetching, missing bulk operations, wrong caching scope. Use when auditing query efficiency.
npx skillsauth add levnikolaevich/claude-code-skills ln-651-query-efficiency-auditorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Paths: File paths (
shared/,references/,../ln-*) are relative to skills repo root. If not found at CWD, locate this SKILL.md directory and go up one level for repo root. Ifshared/is missing, fetch files via WebFetch fromhttps://raw.githubusercontent.com/levnikolaevich/claude-code-skills/master/skills/{path}.
Type: L3 Worker
Specialized worker auditing database query patterns for redundancy, inefficiency, and misuse.
MANDATORY READ: Load shared/references/audit_worker_core_contract.md.
MANDATORY READ: Load shared/references/mcp_tool_preferences.md and shared/references/mcp_integration_patterns.md
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.
MANDATORY READ: Load shared/references/two_layer_detection.md for detection methodology.
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 shared/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 shared/references/audit_worker_core_contract.md and shared/references/audit_scoring.md.
MANDATORY READ: Load shared/references/audit_worker_core_contract.md and shared/templates/audit_worker_report_template.md.
Write JSON summary per shared/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 shared/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)
MANDATORY READ: Load shared/references/audit_worker_core_contract.md.
expire_on_commit, autoflush, session scope before flagging redundant fetchesMANDATORY READ: Load shared/references/audit_worker_core_contract.md.
{output_dir}/ln-651--global.md (atomic single Write call)shared/references/audit_output_schema.mdVersion: 1.0.0 Last Updated: 2026-02-04
testing
Drafts and publishes fact-checked GitHub Discussions announcements. Use for releases, updates, or project news; not for release creation or issue responses.
testing
Prepares and publishes a tagged GitHub release from repository evidence. Use for an explicit release request; not for ordinary commits, packages, or community news.
testing
Validates, commits, pushes, and remotely verifies approved repository changes. Use when publication is requested; not for releases, package publishing, or announcements.
development
Reviews standalone skills and their configured distribution surfaces before publication. Use for skill release readiness; not for product code or implementation-plan review.