Skip to main content

PostgreSQL query performance analyzer. Detects slow queries, suggests indexes, works offline.

Project description

QuerySense

Analyze PostgreSQL EXPLAIN plans and get actionable performance fixes.

QuerySense: 2.3s → 0.04s with one index

$ querysense analyze slow_query.json

[CRITICAL] Row estimation error on orders (5,000x off)
   Planner estimated 50 rows, actually scanned 250,000.
   Fix: ANALYZE orders;

[WARNING] Sequential scan on orders (250,000 rows)
   Estimated improvement: 57x faster
   Fix: CREATE INDEX idx_orders_status ON orders(status);

# Get ONLY the SQL fixes (copy-paste ready)
$ querysense fix slow_query.json > fixes.sql
$ psql < fixes.sql

Install

pip install querysense

Or with pipx (recommended for CLI tools):

pipx install querysense

Optional AI features (not required for core functionality):

pip install querysense[ai]  # Adds Claude-based explanations

Usage

# 1. Export your slow query's plan
psql -c "EXPLAIN (ANALYZE, FORMAT JSON) 
  SELECT * FROM orders WHERE status = 'pending'" > plan.json

# 2. Analyze it
querysense analyze plan.json

# 3. Get copy-paste SQL fixes
querysense fix plan.json > fixes.sql

# 4. Apply the fixes
psql < fixes.sql

What It Catches

Issue Severity Fix
Row estimation >1000x off CRITICAL ANALYZE table
Row estimation >100x off WARNING ANALYZE table
Sequential scan >10k rows WARNING CREATE INDEX
Nested loop with 1000+ scans CRITICAL Add join index
Hash/sort spilling to disk WARNING Increase work_mem
Parallel query not used INFO Check max_parallel_workers
Correlated subquery WARNING Rewrite as JOIN
Missing BUFFERS in EXPLAIN INFO Use EXPLAIN (ANALYZE, BUFFERS)
Foreign key without index WARNING/CRITICAL CREATE INDEX on FK column
Stale statistics WARNING/CRITICAL ANALYZE table
Table bloat INFO/CRITICAL VACUUM ANALYZE

11 rules that catch real PostgreSQL performance problems.

Verify It Helped

# Before
querysense analyze before.json
[WARNING] Sequential scan on orders (250,000 rows)

# Apply fix
psql -c "CREATE INDEX idx_orders_status ON orders(status);"

# After
psql -c "EXPLAIN (ANALYZE, FORMAT JSON) 
  SELECT * FROM orders WHERE status = 'pending'" > after.json
querysense analyze after.json
# No performance issues found!

# Execution time: 2.3s → 0.02s (100x faster)

JSON Output

querysense analyze plan.json --json

Performance

Stress-tested on 250,000 query plans:

  • 652 plans/second analysis throughput
  • 1.7GB peak memory - production-viable footprint
  • 0.00% error rate - deterministic rule engine

Why QuerySense?

Feature QuerySense pgMustard pganalyze PEV2
Price Free $29/mo $499/mo Free
CLI tool Yes No No No
Copy-paste SQL fixes Yes Partial Yes No
Works offline Yes No No Yes
No account required Yes No No Yes

Philosophy

  • Deterministic - No AI, no API keys, works offline
  • Actionable - Every issue includes copy-paste SQL to fix it
  • Focused - 11 rules that catch real problems
  • Honest - Only flags issues we're confident about

Contributing

Have a slow query? Open an issue with the EXPLAIN JSON.

If it's a common pattern, we'll add a rule.

License

MIT


v0.3.0 - 11 PostgreSQL rules, 652 plans/sec

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

querysense-0.3.0.tar.gz (5.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

querysense-0.3.0-py3-none-any.whl (94.9 kB view details)

Uploaded Python 3

File details

Details for the file querysense-0.3.0.tar.gz.

File metadata

  • Download URL: querysense-0.3.0.tar.gz
  • Upload date:
  • Size: 5.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for querysense-0.3.0.tar.gz
Algorithm Hash digest
SHA256 02dc9af7ea43a4597f637af3d811b5b95c8659f0ef3e45a2a57a3db572692cde
MD5 474c0d77f4cc7aca1670193fc3cd456a
BLAKE2b-256 a51cb1ff715c20fe9c5c4593282ec36194a2a294e61a62b622a3df87d61cf54e

See more details on using hashes here.

File details

Details for the file querysense-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: querysense-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 94.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for querysense-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 311d57f475f7f5a44f808533c195bd15ee9455447ca410fa4357c69a79fb170a
MD5 65d7380638df9ceb67db7df9e31fca0c
BLAKE2b-256 983fe1eb5241507936c4c4ea801b31146333e024d240f2ba6520de5fde8ccd8f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page