Background
Most of my work starts with two questions: why is this slow, and why did it break? That has meant reading execution plans to explain why the same query chooses an Index Scan in development and a Bitmap Heap Scan in production, tracing a production RDS failover back to shared_buffers set larger than the instance's memory, and choosing between BRIN and B-tree indexes based on how a table is actually written.
Production work
- Query and plan performance across PostgreSQL, SQL Server and Snowflake: index strategy, planner behaviour, and plans that differ between environments.
- Database migrations from SQL Server, MongoDB and DynamoDB to PostgreSQL, and from Aurora PostgreSQL to Snowflake. That work covers schema and data-model translation, bulk loads with delta sync, idempotent and rollback-safe load scripts, and cutovers inside fixed maintenance windows.
- Change data capture and replication: logical replication with
pgoutput, Debezium Server to S3, Snowpipe ingestion, and managing replication-slot and WAL-retention risk with max_slot_wal_keep_size and per-slot lag alerting. - Partitioning and archival of tables with 100M+ rows: hash-partitioned archive designs with foreign-key-safe cutover and support for reopening archived records.
- Release and upgrade confidence: per-release load testing and query replay (pgreplay, JMeter), and major-version upgrade planning with a real rollback path.
- PostgreSQL internals: MVCC, vacuum and bloat, XID wraparound, replication slots, and C extensions.
- Backend engineering in Go, C#/.NET with EF Core, and Python, including multi-tenant PostgreSQL schema design.
AI and vector workloads
I have built semantic-search services that store Sentence-BERT embeddings in PostgreSQL with pgvector, so I look at AI features the way I look at any other workload: what the index does, what the planner chooses, and what happens to latency and recall as data and filters grow. I write about the trade-offs that show up in production, such as HNSW vs IVFFlat and filtered vector queries that silently return fewer rows. See pgvector performance reviews.
I also use AI in my own work, with clear limits. It helps me summarise evidence, draft and cross-check. It does not decide findings, raise confidence or recommend production changes; I verify every finding against your evidence. Your evidence is never sent to an AI service without your written consent. Why the human part matters: what AI misses in a production PostgreSQL diagnosis.
Public work you can inspect
- PlanReader ↗: a free execution-plan analyzer for PostgreSQL, SQL Server and Snowflake. Plans are analyzed in the browser and not uploaded.
- The evidence collector: the read-only SQL script I use in investigations, published in full so your team can review every query before running it.
- Lab case studies: measured PostgreSQL runs (plan regression, DDL lock queue) with the scripts and outputs behind each finding.
- pgsuite (in development): a read-only Go tool for PostgreSQL replication/CDC risk, MVCC and vacuum health, pgvector workload health, and connection and lock problems, built around catalog-only reads, a
pg_monitor role and strict timeouts. - MSSQLServer.dev ↗: my SQL Server tutorials.
- kiransabne.dev ↗: broader backend and database writing.
- GitHub ↗ and LinkedIn ↗.
Capability
PostgreSQL is my primary focus, especially on AWS RDS and Aurora. I take on SQL Server, pgvector, Snowflake and OLAP/analytical work where the problem matches real experience. If it does not, I will say so.
How the work runs
Your team describes the symptom and runs agreed read-only evidence collection. I review the workload, write ranked findings with risks and validation steps, then walk through the recommendations with your team. The work is async-first, with scheduled review calls. Scope, price and delivery date are agreed in writing before work starts.
What I don't take on
- 24×7 on-call or emergency incident response
- Production write access or executing changes on your systems
- Open-ended hourly work without a defined scope
- Full application rebuilds presented as a database review
- Work that would conflict with existing professional commitments
Confidentiality
I describe my experience without employer or client names, figures or data. Proprietary data is never used as public proof. Public examples use generated data and measured lab runs. Client work is shared only with explicit, written permission.