sqlstats-review — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sqlstats-review (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Parse raw SET STATISTICS IO, TIME ON output from SQL Server Management Studio and produce a structured report of I/O activity and timing per statement. Applies 27 checks across IO patterns (I1–I18) and time patterns (W1–W9) to surface performance concerns that the raw output obscures.
This is the IO/time complement to sqlplan-review. Run it when you have STATISTICS output but no execution plan, or alongside the plan to cross-reference what actually happened at the I/O layer.
Accept any of:
SET STATISTICS IO, TIME ON).txt file path containing the console outputThe input may contain mixed content — IO lines, time lines, rows-affected messages, error messages, and unrelated output. Parse only the recognized patterns; preserve unrecognized lines as informational context.
Table 'TableName'. Scan count X, logical reads Y, physical reads Z, read-ahead reads A, lob logical reads B, lob physical reads C, lob read-ahead reads D.Optional additional fields (appear in Azure SQL or columnstore workloads):
page server reads — Azure SQL Hyperscale: reads from page server (remote storage)page server read-ahead reads — Azure SQL Hyperscale prefetchlob page server reads, lob page server read-ahead readssegment reads, segment skipped — columnstore index segment eliminationSpecial table names: Worktable (sort spill, e.g. ORDER BY, hash aggregate spool), Workfile (hash spill, e.g. hash join/aggregate build input), names starting with # (explicit temp tables).
SQL Server parse and compile time:
CPU time = 108 ms, elapsed time = 108 ms.
SQL Server Execution Times:
CPU time = 156527 ms, elapsed time = 284906 ms.(13431682 row(s) affected)Msg 207, Level 16, State 1, Line 1
Invalid column name 'scores'.Completion time: 2025-05-27T10:32:37.8122685-04:00% Logical Reads for each table: (table_logical / group_total_logical) × 100 to 3 decimal places. If total logical = 0, leave blank.| Metric | Value |
|---|---|
| High logical reads (statement) — warning | ≥ 1,000,000 |
| High logical reads (statement) — critical | ≥ 10,000,000 |
| High scan count — warning | ≥ 1,000 |
| High scan count — critical | ≥ 10,000 |
| High physical read ratio | physical / logical ≥ 10% |
| LOB reads dominant | lob_logical / logical ≥ 50% |
| Read-ahead scan indicator | read_ahead / logical ≥ 80% AND logical ≥ 10,000 |
| Single-table dominance — warning | one table ≥ 80% of statement logical reads |
| Single-table dominance — critical | one table ≥ 95% of statement logical reads |
| Columnstore low skip rate | skipped / (reads + skipped) < 50% |
| Elapsed time — warning | execution_elapsed ≥ 30,000 ms |
| Elapsed time — critical | execution_elapsed ≥ 300,000 ms |
| CPU time — warning | execution_cpu ≥ 60,000 ms |
| I/O wait indicator | cpu < 10% of elapsed |
| Parallelism indicator | cpu > 150% of elapsed |
| High compile overhead | compile_cpu > 20% of execution_cpu AND compile_elapsed ≥ 200 ms |
| Zero-return high-read | rows_affected = 0 AND statement logical reads ≥ 10,000 |
Evaluate per-statement and per-table IO metrics.
logical reads ≥ 1,000,000 (warning) or ≥ 10,000,000 (critical)/sqlplan-review on the execution plan for operator-level detail.scan count ≥ 1,000 (warning) or ≥ 10,000 (critical)/sqlplan-review (N5 Key Lookup, N4 Expensive Scan).physical reads / logical reads ≥ 10%read-ahead reads / logical reads ≥ 80% AND logical reads ≥ 10,000 for any table/tsql-review T4, T6; /sqlplan-review N4)./sqlplan-review and /sqlindex-advisor targeted at this table.Worktable or Workfiletempdb because a sort or hash operation exceeded its memory grant: a Worktable backs a spilled sort (or a hash aggregate spool), a Workfile backs a spilled hash join/aggregate build input. This corresponds to a spill to tempdb — see checks N41–N43 in sqlplan-review. Reduce spills by: updating statistics, adding indexes to avoid large sorts, or increasing the memory grant via OPTION (MIN_GRANT_PERCENT).# (explicit local temp table) or ## (global temp table)/tsql-review T45, T46 for table variable vs temp table guidance.lob logical reads > 0 for any tablelob logical reads / logical reads ≥ 50% for any tablesegment skipped / (segment reads + segment skipped) < 50% when segment data is presentsegment skipped / (segment reads + segment skipped) ≥ 90% when segment data is present/sqlplan-review to confirm the operator topology.rows affected = 0 AND total logical reads ≥ 10,000physical reads > 0page server reads > 0 for any tableSET STATISTICS IO shows only row-store style output (no segment reads line) — indicates row-mode execution against a columnstore index — SQL 2012+/sqlplan-review — check N7 (Row Mode Columnstore Scan). Common causes: scalar UDF in SELECT list (blocking batch mode until SQL 2019 UDF inlining), OUTER JOIN patterns, or compat level < 130. On SQL 2019+, ensure compat level 150 and Batch Mode on Rowstore is enabled.page server reads / (logical reads + page server reads) ≥ 30% for any table — applies to Azure SQL Hyperscale only; skip if page server reads column is absent#temp or Worktable entry has logical reads ≥ 5× the total logical reads of the underlying base tables feeding it — signals repeated re-reads of a temp table rather than one-time write/readCREATE INDEX ix_tmp ON #temp(join_col). Alternatively, evaluate whether the temp table can be replaced by a CTE or subquery that the optimizer can inline. Check /sqlplan-review for Nested Loops with the temp table on the inner side.Evaluate CPU and elapsed time metrics per statement.
execution_cpu < 10% of execution_elapsed AND elapsed ≥ 1,000 mssys.dm_exec_requests or Extended Events.execution_cpu > 150% of execution_elapsed/sqlplan-review to confirm DOP and check for thread imbalance (N30 Parallel Thread Skew).compile_cpu > 20% of execution_cpu AND compile_elapsed ≥ 200 msexecution_elapsed ≥ 30,000 ms (warning) or ≥ 300,000 ms (critical)/sqlplan-review on the captured execution plan to find the dominant operator.execution_cpu ≥ 60,000 ms/sqlplan-review to identify the high-CPU operators (N4 Scan, N18 Hash Match, N20 Sort).max(execution_elapsed) > 10× min(execution_elapsed) for statements with elapsed ≥ 100 msrows_affected > 1,000,000 AND execution_elapsed < 10,000 msTOP 10000 in a loop).compile_elapsed > 30% of execution_elapsed AND execution_elapsed ≥ 500 msOPTION (RECOMPILE) only when the compile cost is intentional (e.g., parameter-sensitive queries where a fresh plan is always better than a stale cached one).execution_elapsed < 0 or compile_elapsed < 0SELECT node_id, online_scheduler_count FROM sys.dm_os_nodes. On multi-NUMA systems, ensure the Windows High Performance power plan is active and that processor clock synchronization is functioning. This is a data quality issue only — no query tuning action required.If the SQL Server version is stated by the user, read VERSION_COMPATIBILITY.md (~/.claude/skills/VERSION_COMPATIBILITY.md if installed, or skills/VERSION_COMPATIBILITY.md from the repo). If unavailable, skip silently. For checks whose minimum version exceeds the instance version: verbose mode → log as SKIP (version: requires SQL 20XX+, instance is SQL 20YY); standard report → omit entirely. Do not suppress NOT ASSESSED rows from missing input — only suppress version-inapplicable checks.
Structure your report as follows:
## Statistics IO/Time Analysis
### Input Summary
- X statement(s) parsed
- Total logical reads: N (across all statements)
- Total execution elapsed: hh:mm:ss.mmm
---
### Statement 1
**Compile Time:** CPU N ms | Elapsed N ms
**Rows Affected:** N rows affected
**IO Statistics**
| Table | Scan Count | Logical Reads | Physical Reads | Read-Ahead | [LOB cols if present] | % of Statement Reads |
|-------|-----------|---------------|----------------|------------|----------------------|----------------------|
| TableName | 1 | 42,015 | 0 | 1,306 | | 87.234% |
| **Total** | **1** | **48,200** | **0** | **1,306** | | |
**Execution Time:** CPU N ms (hh:mm:ss.mmm) | Elapsed N ms (hh:mm:ss.mmm)
[Repeat per statement]
---
### Grand Totals (All Statements)
**IO Totals** (sorted A–Z by table name)
| Table | Scan Count | Logical Reads | Physical Reads | Read-Ahead | [LOB cols if present] | % of All Reads |
|-------|-----------|---------------|----------------|------------|----------------------|----------------|
| Orders | 3 | 125,415 | 2 | 84,201 | | 42.1% |
| Products | 7 | 98,200 | 0 | 0 | | 33.0% |
| **Grand Total** | **10** | **297,800** | **2** | **84,201** | | |
**Time Totals**
| Phase | CPU | Elapsed |
|-------|-----|---------|
| Compile | N ms | hh:mm:ss.mmm |
| Execution | N ms | hh:mm:ss.mmm |
| **Grand Total** | **N ms** | **hh:mm:ss.mmm** |
---
### Performance Findings
#### Critical Issues
**[C1 — Stmt 2, Table 'Orders'] Issue Name** (I<N> or W<N>)
- Observed: [specific table name, metric value, statement number]
- Impact: [why this matters]
- Fix: [concrete action]
#### Warnings
[same format]
#### Info
[same format]
### Passed Checks
I1 ✓ (brief reason), I3 ✓ (brief reason) [list every check verified clean with a reason in parens — e.g., I3 ✓ (no intentional full-table scan without comment)]
---
*Analyzed by: [state the AI model and version you are running as, e.g. "Claude Sonnet 4.6", "DeepSeek R1", "GPT-4o"] · [current date and time in the user's local timezone, or UTC if timezone is unknown, e.g. "2026-05-16 20:15 NZST"]*Formatting rules:
hh:mm:ss.mmm format`--brief` — Omit the Passed Checks table and attribution footer. Output the Summary, Findings, and Prioritized Fix Sequence sections only. Use when a quick scan of what fired is all that's needed.
`--critical-only` — Suppress Warning and Info findings. Show only Critical findings. The Passed Checks table is also omitted. Use when triaging an incident and only actionable blockers matter.
Both flags can be combined: --brief --critical-only produces the Summary section plus Critical findings only.
When neither flag is present, produce the full report as documented above.
When the user's request includes --verbose, --trace, or the word verbose:
1. Append a `## Check Evaluation Log` section after the Passed Checks table.
Include one row for every check in this skill's ruleset, in check-ID order:
| Check | Evidence | Threshold | Result |
|---|---|---|---|
| [ID — Name] | [key attribute(s) and value found, or "absent"] | [threshold or condition] | PASS / FIRE → [severity] / NOT ASSESSED |
Result conventions:
PASS — attribute present, threshold not met**FIRE → Critical/Warning/Info** — threshold met; bold to distinguish from passesNOT ASSESSED — required attribute absent from input2. Save both files to the current working directory using the Write tool:
output/<skill-name>/<YYYY-MM-DD-HHmmss>-<input-prefix>/analysis.md ← full report output/<skill-name>/<YYYY-MM-DD-HHmmss>-<input-prefix>/trace.md ← Check Evaluation Log
Derive <input-prefix>:
horrible.sqlplan → horrible)runSanitize: alphanumeric + hyphens/underscores only, max 32 chars.
File headers: analysis.md → # Analysis — <skill-name> / # Input: <first 80 chars> / # Generated: <UTC timestamp> trace.md → # Check Evaluation Log — <skill-name> / # Input: <first 80 chars> / # Generated: <UTC timestamp>
Create directories as needed. When --verbose is not present, write nothing to disk.
[C1 — Stmt 2, Table 'Orders']). For single-statement inputs, use the table name alone (e.g., [C1 — Table 'Orders']).Worktable and Workfile are system-generated names; do not treat them as user tables in grand totals sorting, but do include their reads in totals.CREATE INDEX recommendations from the execution plan to reduce the logical reads identified here..sqlplan files for the same workload, batch-analyze them alongside this STATISTICS review.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.