We're building tools for developers to better understand their Postgres database performance, both right now in the future.
Missing indexes? Anti-patterns? Query runs fine locally but going to be slow against 10,000, or 10,000,000 records? We can tell you.
Let's be real, you're probably using an ORM, you maybe have no idea what the actual queries are running on your database, and what their performance is, until you are alerted by some system (or worse, your users!). You maybe have tried to find something, found expansive platforms, or tried to set up complex tooling.
We can run as dev tooling as you're writing new code/queries.
See their performance/metrics in (almost) real time.
Pull your real data and get relevant recommendations
Pull your own data from a simple Postgres connection string, including your queries, using pg_stat_statement, and relevant statistics.
Get recommendations on slow queries, including future insight on problematic queries if you had 10x (or 1000x) your current data!
Queries to optimize
select "matches"."id", "matches"."ladder_id", "matches"."challenger_id", "matches"."opponent_id", "matches"."match_date", "matches"."outcome", "matches"."rounds_won", "matches"."rounds_lost", "matches"."created_at", "matches"."updated_at", "matches"."deleted_at" from "matches" inner join "ladder" on "matches"."ladder_id" = "ladder"."id" where "ladder"."server_id" = $1
select "id", "discord_id", "username", "status", "created_at", "updated_at", "deleted_at" from "users" where ("users"."status" <> $1 and "users"."deleted_at" is null and not exists (select "id", "match_id", "challenger_id", "opponent_id", "ladder_id", "challenge_date", "status", "created_at", "updated_at", "deleted_at" from "challenges" where ("challenges"."status" = $2 and ("challenges"."challenger_id" = "users"."id" or "challenges"."opponent_id" = "users"."id"))))
select "id", "match_id", "challenger_id", "opponent_id", "ladder_id", "challenge_date", "status", "created_at", "updated_at", "deleted_at" from "challenges" where (("challenges"."challenger_id" = $1 or "challenges"."opponent_id" = $2) and "challenges"."deleted_at" is null)
Don't want it to reach our servers, or pulling from a local URL? A simple Docker command to run on your system.
docker run --pull always -t -p 2345:2345
ghcr.io/query-doctor/analyzer
We can also run in CI if you wish!
Get feedback before it even reaches production.

Have questions? Found anything interesting, or simply want to talk databases?
We'd love to chat with you.
Join us on DiscordOh, we also happen to have a fancy diagram for visualizing the various stages of your query execution plan, using your indexes. See what happens as you create new indexes, or alter the query. Why didn't the database use the index, we try to help you find out? We happen to run Postgres (via PGlite) in the browser, it's very fast!
Special Offer for Early Adopters
Excited by what we're building? Support us by becoming a special lifetime member today!
For a very limited time, our earliest supporters will recieve lifetime access to everything that Query Doctor has to offer. This includes unrestricted access to IndeX-Ray™ in the playground, our full catalog of courses, and other fun perks and surprises. Lifetime members are also trusted partners of the Query Doctor community who have have exclusive access to help shape our future.
Once this offer is gone it will not return. Don't miss out on this unique opportunity!
Get started by visiting your Account page today.
See Databases Differently
Try Query DoctorAbout Us
A small group of database enthusiasts, we are frustrated by the current ecosystem, and by how mysterious databases appear to be. We embarked on an ambitious journey to try to allow anyone understand them.
No spam, pinky promise.
Our Course Available to lifetime members today!
There are plenty of courses about databases out there, but there has never been one quite like this before.
This course transforms knowledge about database indexing into a super power for developers. While topics like block size, file formats, and compression tradeoffs are all interesting, this course doesn't cover any of that. Instead it focuses on building a powerful mental model for how to use indexing most effectively. Using a novel approach, this course asks you to act as the database, learning how (and why) it works by making the same decisions under the same constraints that it does.
Regardless of your familiarity with databases, including any prior bad experiences with them, the concepts will be introduced in an intuitive new manner from the ground up. Think of this as the "Hello, World!" course for database indexing.
For a limited time, the course is available today to lifetime members for a discounted rate! General availability at full price is coming soon.