# query

Published articles for query.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Eloquent Performance and Database Design: Evidence Before Eager Loading

DevFeed: [Eloquent Performance and Database Design: Evidence Before Eager Loading](<https://devfeed.tech/articles/eloquent-performance-and-database-design-evidence-before-eager-loading-33303.md>)

Original publisher: [Read original article](<https://freek.dev/3190-eloquent-performance-and-database-design-evidence-before-eager-loading>)

Author: Freek Van der Herten (freek@spatie.be)

Published: 2026-09-11T12:30:27Z

Content type: tutorial

Language: en

Sources: [freek.dev - all blogposts](<https://devfeed.tech/sources/freek-dev-all-blogposts.md>)

Topics: [Eloquent ORM](<https://devfeed.tech/topics/eloquent.md>), [Database](<https://devfeed.tech/topics/database.md>), [Laravel](<https://devfeed.tech/topics/laravel.md>), [PHP](<https://devfeed.tech/topics/php.md>)

Tags: [database](<https://devfeed.tech/tags/database.md>), [eager-loading](<https://devfeed.tech/tags/eager-loading.md>), [eloquent](<https://devfeed.tech/tags/eloquent.md>), [indexes](<https://devfeed.tech/tags/indexes.md>), [laravel](<https://devfeed.tech/tags/laravel.md>), [optimization](<https://devfeed.tech/tags/optimization.md>), [performance](<https://devfeed.tech/tags/performance.md>), [php](<https://devfeed.tech/tags/php.md>), [query](<https://devfeed.tech/tags/query.md>)

### AI overview

A practical deep dive into improving Eloquent performance and database design for a growing team dashboard. It covers detecting N+1 queries, choosing aggregates and indexes, inspecting query plans, pagination, chunking, and transaction boundaries.

### Source excerpt

A deep dive into Eloquent performance, from detecting N+1 queries to choosing aggregates, indexes, query plans, pagination, chunking, and transaction boundaries for a growing team dashboard. Read more

## Cache stampede: how one expired key takes down the database

DevFeed: [Cache stampede: how one expired key takes down the database](<https://devfeed.tech/articles/cache-stampede-how-one-expired-key-takes-down-the-database-39600.md>)

Original publisher: [Read original article](<https://ankit-rana.com/logs/48-cache-stampede-expired-key/>)

Author: hello@ankit-rana.com

Published: 2026-09-05T00:00:00Z

Content type: tutorial

Language: en

Sources: [Ankit Rana | Mechanical Sympathy](<https://devfeed.tech/sources/ankit-rana-mechanical-sympathy.md>)

Topics: [Cache](<https://devfeed.tech/topics/cache.md>), [Caching](<https://devfeed.tech/topics/caching.md>), [Database](<https://devfeed.tech/topics/database.md>), [consistent hashing](<https://devfeed.tech/topics/consistent-hashing.md>), [Redis](<https://devfeed.tech/topics/redis.md>)

Tags: [cache-stampede](<https://devfeed.tech/tags/cache-stampede.md>), [caching](<https://devfeed.tech/tags/caching.md>), [connection-pool](<https://devfeed.tech/tags/connection-pool.md>), [consistent-hashing](<https://devfeed.tech/tags/consistent-hashing.md>), [distributed-systems](<https://devfeed.tech/tags/distributed-systems.md>), [jitter](<https://devfeed.tech/tags/jitter.md>), [query](<https://devfeed.tech/tags/query.md>), [redis](<https://devfeed.tech/tags/redis.md>), [reliability](<https://devfeed.tech/tags/reliability.md>), [thundering-herd](<https://devfeed.tech/tags/thundering-herd.md>), [traffic](<https://devfeed.tech/tags/traffic.md>), [ttl](<https://devfeed.tech/tags/ttl.md>)

### AI overview

This article explains how a cache stampede occurs when a hot key expires and many requests simultaneously recompute the same value against the database. It recommends TTL jitter to prevent synchronized expirations and request coalescing so only one caller recomputes while others wait or serve stale data. It also discusses cache warming and consistent hashing for broader cache-failure scenarios.

### Source excerpt

A cache TTL is a scheduled simultaneous failure: every request being served from one key misses at the same instant and goes to the origin together. If the recompute takes two seconds, every request arriving during those two seconds also misses, so the pileup grows faster than it drains. Jitter on the TTL stops keys expiring in lockstep, and request coalescing so only one caller recomputes while the rest wait or serve stale is what stops a single expensive key from saturating the database.

## When JSONB columns create schema, consistency, and performance problems

DevFeed: [When JSONB columns create schema, consistency, and performance problems](<https://devfeed.tech/articles/your-jsonb-column-became-the-schemaless-disaster-you-migrated-away-from-39598.md>)

Original publisher: [Read original article](<https://ankit-rana.com/logs/46-jsonb-column-schemaless-disaster/>)

Author: hello@ankit-rana.com

Published: 2026-09-01T00:00:00Z

Content type: article

Language: en

Sources: [Ankit Rana | Mechanical Sympathy](<https://devfeed.tech/sources/ankit-rana-mechanical-sympathy.md>)

Topics: [data](<https://devfeed.tech/topics/data.md>), [Structured-data](<https://devfeed.tech/topics/structured-data.md>), [JSON](<https://devfeed.tech/topics/json.md>)

Tags: [data-modelling](<https://devfeed.tech/tags/data-modelling.md>), [indexing](<https://devfeed.tech/tags/indexing.md>), [jsonb](<https://devfeed.tech/tags/jsonb.md>), [migration](<https://devfeed.tech/tags/migration.md>), [outage](<https://devfeed.tech/tags/outage.md>), [postgres](<https://devfeed.tech/tags/postgres.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [schema](<https://devfeed.tech/tags/schema.md>), [schema-design](<https://devfeed.tech/tags/schema-design.md>), [toast](<https://devfeed.tech/tags/toast.md>)

### AI overview

The article explains why using JSONB to avoid recurring migrations can create hidden schema and data-consistency problems. It discusses runtime failures from inconsistent keys and types, difficulty identifying dependencies across consumers, and the storage and update costs of large PostgreSQL JSONB documents.

### Source excerpt

JSONB is a good fit for genuinely open-ended data and a poor one for schema you did not want to commit to yet. Without a schema there is no NOT NULL, no type, no foreign key and no way to know which keys are load bearing, so every read becomes a parse and a cast that can fail at runtime. Large documents are stored out of line and compressed, which means reading one key can require fetching and decompressing the whole document, and updating one key rewrites all of it.

## ADD COLUMN is not always free, and the lock queue is what takes you down

DevFeed: [ADD COLUMN is not always free, and the lock queue is what takes you down](<https://devfeed.tech/articles/add-column-is-not-always-free-and-the-lock-queue-is-what-takes-you-down-39595.md>)

Original publisher: [Read original article](<https://ankit-rana.com/logs/43-add-column-is-not-always-free/>)

Author: hello@ankit-rana.com

Published: 2026-08-26T00:00:00Z

Content type: article

Language: en

Sources: [Ankit Rana | Mechanical Sympathy](<https://devfeed.tech/sources/ankit-rana-mechanical-sympathy.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [incident](<https://devfeed.tech/topics/incident.md>), [Query (disambiguation)](<https://devfeed.tech/topics/query.md>), [migration](<https://devfeed.tech/topics/migration.md>), [MySQL](<https://devfeed.tech/topics/mysql.md>)

Tags: [ddl](<https://devfeed.tech/tags/ddl.md>), [incident](<https://devfeed.tech/tags/incident.md>), [locking](<https://devfeed.tech/tags/locking.md>), [migration](<https://devfeed.tech/tags/migration.md>), [migrations](<https://devfeed.tech/tags/migrations.md>), [mysql](<https://devfeed.tech/tags/mysql.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [queues](<https://devfeed.tech/tags/queues.md>), [schema-design](<https://devfeed.tech/tags/schema-design.md>), [timeout](<https://devfeed.tech/tags/timeout.md>)

### AI overview

Adding a nullable column can cause an outage even when the schema change itself is nearly instantaneous. In PostgreSQL, ALTER TABLE may wait for a long-running query, and subsequent queries can queue behind the waiting lock request. Setting a short lock_timeout and retrying can prevent the migration from taking down the table.

### Source excerpt

Modern PostgreSQL adds a column with a default as a metadata change, so the table is never rewritten and the migration itself is instant. The outage comes from lock acquisition instead: ALTER TABLE needs an ACCESS EXCLUSIVE lock, and while it waits behind one long-running query, every subsequent query queues behind the waiting ALTER because the lock queue is ordered. Setting lock_timeout to a couple of seconds and retrying converts that from an outage into a no-op.

## Connection pool sizing is a queueing theory problem, not a tuning knob

DevFeed: [Connection pool sizing is a queueing theory problem, not a tuning knob](<https://devfeed.tech/articles/connection-pool-sizing-is-a-queueing-theory-problem-not-a-tuning-knob-39593.md>)

Original publisher: [Read original article](<https://ankit-rana.com/logs/41-connection-pool-sizing-queueing-theory/>)

Author: hello@ankit-rana.com

Published: 2026-08-22T00:00:00Z

Content type: article

Language: en

Sources: [Ankit Rana | Mechanical Sympathy](<https://devfeed.tech/sources/ankit-rana-mechanical-sympathy.md>)

Topics: [connection pool](<https://devfeed.tech/topics/connection-pool.md>), [queueing theory](<https://devfeed.tech/topics/queueing-theory.md>), [Latency](<https://devfeed.tech/topics/latency.md>), [Database](<https://devfeed.tech/topics/database.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>)

Tags: [capacity-planning](<https://devfeed.tech/tags/capacity-planning.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [connection-pool](<https://devfeed.tech/tags/connection-pool.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [database](<https://devfeed.tech/tags/database.md>), [database-performance](<https://devfeed.tech/tags/database-performance.md>), [hikaricp](<https://devfeed.tech/tags/hikaricp.md>), [inference](<https://devfeed.tech/tags/inference.md>), [latency](<https://devfeed.tech/tags/latency.md>), [network](<https://devfeed.tech/tags/network.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [queueing-theory](<https://devfeed.tech/tags/queueing-theory.md>)

### AI overview

This article explains how to size a connection pool using Little's law: concurrency equals throughput multiplied by connection holding time. It argues that increasing the pool beyond the database's parallel execution capacity can move the queue, increase latency, and leave throughput flat. It also identifies excessive holding time from network round trips, N+1 queries, long transactions, and model inference calls as common causes of pool exhaustion.

### Source excerpt

Pool size follows from Little's law: concurrency equals throughput multiplied by holding time, so 500 requests per second each holding a connection for 20ms needs ten connections rather than a round number someone picked. Past the point where the database can execute requests in parallel, adding connections moves the queue rather than removing it, and latency grows while throughput stays flat. The number that actually reaches the database is the pool size multiplied by the instance count, which is usually the number nobody has calculated.

## Covering Indexes and Index-Only Scans in PostgreSQL

DevFeed: [Covering Indexes and Index-Only Scans in PostgreSQL](<https://devfeed.tech/articles/covering-indexes-the-cheap-10x-that-most-schemas-leave-on-the-table-39591.md>)

Original publisher: [Read original article](<https://ankit-rana.com/logs/39-covering-indexes-index-only-scans/>)

Author: hello@ankit-rana.com

Published: 2026-08-18T00:00:00Z

Content type: tutorial

Language: en

Sources: [Ankit Rana | Mechanical Sympathy](<https://devfeed.tech/sources/ankit-rana-mechanical-sympathy.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [Query (disambiguation)](<https://devfeed.tech/topics/query.md>), [data](<https://devfeed.tech/topics/data.md>)

Tags: [b-tree](<https://devfeed.tech/tags/b-tree.md>), [cache](<https://devfeed.tech/tags/cache.md>), [covering](<https://devfeed.tech/tags/covering.md>), [covering-index](<https://devfeed.tech/tags/covering-index.md>), [database-performance](<https://devfeed.tech/tags/database-performance.md>), [explain](<https://devfeed.tech/tags/explain.md>), [heap](<https://devfeed.tech/tags/heap.md>), [indexes](<https://devfeed.tech/tags/indexes.md>), [indexing](<https://devfeed.tech/tags/indexing.md>), [innodb](<https://devfeed.tech/tags/innodb.md>), [pages](<https://devfeed.tech/tags/pages.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [storage](<https://devfeed.tech/tags/storage.md>), [vacuum](<https://devfeed.tech/tags/vacuum.md>)

### AI overview

This tutorial explains why a normal index scan may still be slow: after finding matching entries, the database follows a pointer into the table for each row. Covering indexes store the selected columns in the index and can avoid those heap reads. In PostgreSQL, index-only scans also depend on the visibility map marking pages all-visible, while SELECT * prevents the technique from being fully effective.

### Source excerpt

A normal index scan finds matching rows and then follows a pointer into the table for every one of them, which is a random read per row. A covering index stores the columns the query selects, so the engine answers entirely from the index and skips those reads. In PostgreSQL this only works when the visibility map marks the pages all-visible, so an unvacuumed table will report Heap Fetches in EXPLAIN and give back most of the gain. SELECT star defeats the technique completely.

## Why your index is not being used, and why the planner is usually right

DevFeed: [Why your index is not being used, and why the planner is usually right](<https://devfeed.tech/articles/why-your-index-is-not-being-used-and-why-the-planner-is-usually-right-39590.md>)

Original publisher: [Read original article](<https://ankit-rana.com/logs/38-why-your-index-is-not-being-used/>)

Author: hello@ankit-rana.com

Published: 2026-08-16T00:00:00Z

Content type: tutorial

Language: en

Sources: [Ankit Rana | Mechanical Sympathy](<https://devfeed.tech/sources/ankit-rana-mechanical-sympathy.md>)

Topics: [Query (disambiguation)](<https://devfeed.tech/topics/query.md>), [MySQL](<https://devfeed.tech/topics/mysql.md>), [bug](<https://devfeed.tech/topics/bug.md>)

Tags: [bug](<https://devfeed.tech/tags/bug.md>), [cardinality](<https://devfeed.tech/tags/cardinality.md>), [database-performance](<https://devfeed.tech/tags/database-performance.md>), [explain](<https://devfeed.tech/tags/explain.md>), [function](<https://devfeed.tech/tags/function.md>), [indexes](<https://devfeed.tech/tags/indexes.md>), [indexing](<https://devfeed.tech/tags/indexing.md>), [mysql](<https://devfeed.tech/tags/mysql.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [predicate](<https://devfeed.tech/tags/predicate.md>), [query](<https://devfeed.tech/tags/query.md>), [query-planner](<https://devfeed.tech/tags/query-planner.md>)

### AI overview

This tutorial explains why database indexes may not be used even when they exist. It focuses on inaccurate cardinality estimates caused by stale statistics, predicates that prevent index matching, implicit casts, and cases where sequential scans are the cheaper choice.

### Source excerpt

An unused index is almost never a planner bug. It is usually a predicate the planner cannot match to the index, such as a function or an implicit cast applied to the column, or a cardinality estimate that is wrong because statistics are stale. When the estimate is right and the planner still refuses, it is often correct: past a few percent of the table, random access through an index costs more than reading the table sequentially. The diagnostic that matters is the gap between estimated and actual rows in EXPLAIN ANALYZE.

## How ORM N+1 Queries Create Hidden Request Latency

DevFeed: [How ORM N+1 Queries Create Hidden Request Latency](<https://devfeed.tech/articles/your-orm-issued-400-queries-and-the-p99-looked-fine-until-it-didn-t-39588.md>)

Original publisher: [Read original article](<https://ankit-rana.com/logs/36-orm-n-plus-one-queries-hidden-latency/>)

Author: hello@ankit-rana.com

Published: 2026-08-02T00:00:00Z

Content type: tutorial

Language: en

Sources: [Ankit Rana | Mechanical Sympathy](<https://devfeed.tech/sources/ankit-rana-mechanical-sympathy.md>)

Topics: [Object-relational mapping](<https://devfeed.tech/topics/orm.md>), [Latency](<https://devfeed.tech/topics/latency.md>), [Monitoring](<https://devfeed.tech/topics/monitoring.md>), [lazy loading](<https://devfeed.tech/topics/lazy-loading.md>), [Database](<https://devfeed.tech/topics/database.md>), [connection pool](<https://devfeed.tech/topics/connection-pool.md>)

Tags: [connection-pool](<https://devfeed.tech/tags/connection-pool.md>), [database](<https://devfeed.tech/tags/database.md>), [database-performance](<https://devfeed.tech/tags/database-performance.md>), [hibernate](<https://devfeed.tech/tags/hibernate.md>), [latency](<https://devfeed.tech/tags/latency.md>), [lazy-loading](<https://devfeed.tech/tags/lazy-loading.md>), [monitoring](<https://devfeed.tech/tags/monitoring.md>), [n-plus-one](<https://devfeed.tech/tags/n-plus-one.md>), [observability](<https://devfeed.tech/tags/observability.md>), [orm](<https://devfeed.tech/tags/orm.md>), [query](<https://devfeed.tech/tags/query.md>), [request](<https://devfeed.tech/tags/request.md>)

### AI overview

This article explains how ORM lazy loading can turn a loop over orders into an N+1 query pattern. Individual queries may remain fast and avoid slow-query alerts, while the accumulated network round trips increase request latency and hold connection-pool resources. It recommends monitoring queries per request and asserting query counts in tests.

### Source excerpt

N+1 queries hide from monitoring because no individual query is slow. Four hundred queries at 0.4ms each never appear in the slow query log, never move p99 query latency, and still cost the request 300ms because the expense is the round trip rather than the execution. The metric that catches it is queries per request, and the only durable fix is asserting on that count in tests, since the code that causes it looks like a field access rather than I/O.

## Detecting Full Table Scans With SQLite

DevFeed: [Detecting Full Table Scans With SQLite](<https://devfeed.tech/articles/detecting-full-table-scans-with-sqlite-39006.md>)

Original publisher: [Read original article](<https://tenderlovemaking.com/2026/07/15/detecting-full-table-scans-with-sqlite/>)

Published: 2026-07-15T15:26:22Z

Content type: tutorial

Language: en

Sources: [Aaron Patterson](<https://devfeed.tech/sources/aaron-patterson.md>)

Topics: [SQLite](<https://devfeed.tech/topics/sqlite.md>), [Databases](<https://devfeed.tech/topics/databases.md>), [Development](<https://devfeed.tech/topics/development.md>), [Rails](<https://devfeed.tech/topics/rails.md>)

Tags: [database](<https://devfeed.tech/tags/database.md>), [index](<https://devfeed.tech/tags/index.md>), [query](<https://devfeed.tech/tags/query.md>), [rails](<https://devfeed.tech/tags/rails.md>), [sqlite](<https://devfeed.tech/tags/sqlite.md>), [test](<https://devfeed.tech/tags/test.md>)

### AI overview

This tutorial shows how to detect full table scans in SQLite by inspecting prepared-statement statistics after executing a query. It demonstrates checking full-scan steps, then adding an index to eliminate the scan, and discusses possible Rails integration for test or development warnings.

### Source excerpt

I'm at RubyConf this week, and it's great! I recently read that lobste.rs is now running on SQLite. One part from the post caught my attention: I wish we could say in a test, "Fail if you encounter any full table scans". Which would have caught the perf issues we experienced during the first deploy. SQLite collects information about prepared statements and exposes those statistics though an API. The upshot of this is that we can tell whether a statement did a full table scan after executing the statement without using an EXPLAIN. Here's an example program that demonstrates detecting a query did a full table scan: db = SQLite3::Database.new(":memory:") db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)") # Insert a bunch of records 1_000.times do |i| db.execute("INSERT INTO users (name, age) VALUES (?, ?)", ["user#{i}", i % 100]) end def query(db) # Prepare a statement and query it stmt = db.prepare("SELECT * FROM users WHERE age = ?") stmt.bind_param(1, 42) stmt.to_a # Check the number of full scan steps to detect full table scan fullscan_steps = stmt.stat(:fullscan_steps) puts "fullscan_steps: #{fullscan_steps}" if fullscan_steps > 0 puts " => query performed a full table scan" else puts " => no full table scan" end end # No index, so we'll see a full table scan query(db) # Create an index db.execute("CREATE INDEX idx_users_age ON users(age)") # Added an index, so no full table scan query(db) Feels like we could integrate this in to Rails and warn or raise in test / development. I'm not sure if we'd want to check this all the time in production, but maybe it would be fine?

## How to Achieve Pruning When Querying by Non-Partitioned Columns in PostgreSQL

DevFeed: [How to Achieve Pruning When Querying by Non-Partitioned Columns in PostgreSQL](<https://devfeed.tech/articles/how-to-achieve-pruning-when-querying-by-non-partitioned-columns-in-postgresql-33924.md>)

Original publisher: [Read original article](<https://hakibenita.com/postgresql-partition-pruning>)

Author: Haki Benita

Published: 2026-07-08T21:00:00Z

Content type: tutorial

Language: en

Sources: [Haki Benita](<https://devfeed.tech/sources/haki-benita.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [Databases](<https://devfeed.tech/topics/databases.md>)

Tags: [articles](<https://devfeed.tech/tags/articles.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [index](<https://devfeed.tech/tags/index.md>), [partition](<https://devfeed.tech/tags/partition.md>), [patterns](<https://devfeed.tech/tags/patterns.md>), [performance](<https://devfeed.tech/tags/performance.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>)

### AI overview

This tutorial explains PostgreSQL partition pruning and shows how certain data patterns can enable pruning when queries filter on columns other than the partition key. It uses event data partitioned by year and examines queries by date range and session.

### Source excerpt

Under conventional wisdom, pruning can only be achieved when querying by the partition key. However, if your data follows certain patterns, using some clever tricks you can achieve pruning even when filtering by non-partition key columns.

## The HTTP QUERY Method and RFC 10008

DevFeed: [The HTTP QUERY Method and RFC 10008](<https://devfeed.tech/articles/new-http-method-just-dropped-meet-query-33347.md>)

Original publisher: [Read original article](<https://blog.ratnesh-maurya.com/blog/rfc-10008-http-query-method-explained>)

Author: ratneshmaurya2311@gmail.com (Ratnesh Maurya)

Published: 2026-07-03T00:00:00Z

Content type: tutorial

Language: en

Sources: [Ratn Labs](<https://devfeed.tech/sources/ratn-labs.md>)

Topics: [HTTP](<https://devfeed.tech/topics/http.md>), [Query (disambiguation)](<https://devfeed.tech/topics/query.md>)

Tags: [api-design](<https://devfeed.tech/tags/api-design.md>), [backend](<https://devfeed.tech/tags/backend.md>), [examples](<https://devfeed.tech/tags/examples.md>), [http](<https://devfeed.tech/tags/http.md>), [query](<https://devfeed.tech/tags/query.md>), [web-development](<https://devfeed.tech/tags/web-development.md>), [web-development-http-backend-api-design](<https://devfeed.tech/tags/web-development-http-backend-api-design.md>)

### AI overview

This tutorial explains the HTTP QUERY method described in RFC 10008, including why GET and POST may be insufficient for complex searches and how QUERY works through examples.

### Source excerpt

HTTP finally has a QUERY method. Learn what RFC 10008 changes, why GET and POST fell short for complex searches, and how QUERY works -- with simple examples.

## Dogfooding the Billable Actions metric: How granular observability improved our metering validation

DevFeed: [Dogfooding the Billable Actions metric: How granular observability improved our metering validation](<https://devfeed.tech/articles/dogfooding-the-billable-actions-metric-how-granular-observability-improved-our-metering-validation-35778.md>)

Original publisher: [Read original article](<https://temporal.io/blog/dogfooding-the-billable-actions-metric-how-granular-observability-improved-our-metering-validation>)

Author: Eric Chen

Published: 2026-06-25T00:00:00Z

Content type: article

Language: en

Sources: [Temporal Blog](<https://devfeed.tech/sources/temporal-blog.md>)

Topics: [observability](<https://devfeed.tech/topics/observability.md>), [dashboards](<https://devfeed.tech/topics/dashboards.md>), [Cloud](<https://devfeed.tech/topics/cloud.md>), [API](<https://devfeed.tech/topics/api.md>), [Server](<https://devfeed.tech/topics/server.md>), [Time Series](<https://devfeed.tech/topics/time-series.md>), [benchmarking](<https://devfeed.tech/topics/benchmarking.md>)

Tags: [account](<https://devfeed.tech/tags/account.md>), [api](<https://devfeed.tech/tags/api.md>), [cloud](<https://devfeed.tech/tags/cloud.md>), [cost](<https://devfeed.tech/tags/cost.md>), [count](<https://devfeed.tech/tags/count.md>), [dashboard](<https://devfeed.tech/tags/dashboard.md>), [dashboards](<https://devfeed.tech/tags/dashboards.md>), [dogfooding](<https://devfeed.tech/tags/dogfooding.md>), [metric](<https://devfeed.tech/tags/metric.md>), [observability](<https://devfeed.tech/tags/observability.md>), [optimization](<https://devfeed.tech/tags/optimization.md>), [query](<https://devfeed.tech/tags/query.md>), [raw](<https://devfeed.tech/tags/raw.md>), [server](<https://devfeed.tech/tags/server.md>), [temporal-voices](<https://devfeed.tech/tags/temporal-voices.md>), [time-series](<https://devfeed.tech/tags/time-series.md>), [validation](<https://devfeed.tech/tags/validation.md>), [visibility](<https://devfeed.tech/tags/visibility.md>)

### AI overview

Temporal describes how its Billable Actions metric and OpenMetrics per-type breakdowns provide more granular cost visibility. Internally, the company uses the metric with a canary account and validation dashboards to verify metering accuracy, troubleshoot discrepancies, and identify optimization opportunities.

### Source excerpt

See how Temporal uses the Billable Actions metric internally to validate metering, troubleshoot discrepancies, and improve cost observability.

## Track customer loyalty points with durable workflows

DevFeed: [Track customer loyalty points with durable workflows](<https://devfeed.tech/articles/track-customer-loyalty-points-with-durable-workflows-35824.md>)

Original publisher: [Read original article](<https://temporal.io/blog/entity-workflow-loyalty-points>)

Author: Cecil Phillip

Published: 2026-06-03T00:00:00Z

Content type: tutorial

Language: en

Sources: [Temporal Blog](<https://devfeed.tech/sources/temporal-blog.md>)

Topics: [account](<https://devfeed.tech/topics/account.md>), [business logic](<https://devfeed.tech/topics/business-logic.md>), [Database](<https://devfeed.tech/topics/database.md>), [real-time](<https://devfeed.tech/topics/real-time.md>), [locking](<https://devfeed.tech/topics/locking.md>), [retry](<https://devfeed.tech/topics/retry.md>), [service](<https://devfeed.tech/topics/service.md>), [upgrade](<https://devfeed.tech/topics/upgrade.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>)

Tags: [account](<https://devfeed.tech/tags/account.md>), [business-logic](<https://devfeed.tech/tags/business-logic.md>), [customer](<https://devfeed.tech/tags/customer.md>), [database](<https://devfeed.tech/tags/database.md>), [locking](<https://devfeed.tech/tags/locking.md>), [loyalty](<https://devfeed.tech/tags/loyalty.md>), [loyalty-points](<https://devfeed.tech/tags/loyalty-points.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [process](<https://devfeed.tech/tags/process.md>), [query](<https://devfeed.tech/tags/query.md>), [real-time](<https://devfeed.tech/tags/real-time.md>), [retry](<https://devfeed.tech/tags/retry.md>), [service](<https://devfeed.tech/tags/service.md>), [temporal](<https://devfeed.tech/tags/temporal.md>), [temporal-concepts](<https://devfeed.tech/tags/temporal-concepts.md>), [upgrades](<https://devfeed.tech/tags/upgrades.md>), [workflows](<https://devfeed.tech/tags/workflows.md>)

### AI overview

This article explains how to track customer loyalty points with durable Entity Workflows in Temporal. Each customer has a persistent workflow that maintains points, tier status, and activity history, while Signals handle accruals, Updates validate redemptions, and Queries read current balances.

### Source excerpt

Track loyalty points with durable Entity Workflows in Temporal. See how to handle accruals, tier upgrades, and redemptions for each customer.

## LLM 训练与推理的基本理解

DevFeed: [LLM 训练与推理的基本理解](<https://devfeed.tech/articles/llm-40974.md>)

Original publisher: [Read original article](<https://blog.joway.io/posts/deep-into-llm/>)

Author: Joway

Published: 2026-05-17T00:00:00Z

Content type: tutorial

Language: zh

Sources: [Random Thoughts](<https://devfeed.tech/sources/random-thoughts.md>)

Topics: [Large Language Model](<https://devfeed.tech/topics/llm.md>), [Language models](<https://devfeed.tech/topics/language-models.md>), [Transformer](<https://devfeed.tech/topics/transformer.md>)

Tags: [embedding](<https://devfeed.tech/tags/embedding.md>), [encoding](<https://devfeed.tech/tags/encoding.md>), [language](<https://devfeed.tech/tags/language.md>), [large-language-model](<https://devfeed.tech/tags/large-language-model.md>), [llm](<https://devfeed.tech/tags/llm.md>), [model](<https://devfeed.tech/tags/model.md>), [query](<https://devfeed.tech/tags/query.md>), [tech](<https://devfeed.tech/tags/tech.md>), [token](<https://devfeed.tech/tags/token.md>), [value](<https://devfeed.tech/tags/value.md>)

### AI overview

This Chinese tutorial explains foundational LLM training and inference concepts, including vector operations, linear layers, Softmax, LayerNorm, tokenization, token IDs, BPE, token and positional embeddings, and the initial steps of self-attention using Q, K, and V vectors.

### Source excerpt

学习一个技术最好的方式就是能够写一片文章把这个技术的原理解释清楚，本文记录了我在阅读 《Build a Large Language Model (From Scratch)》一书以及和 Claude Code 对话过程中的笔记，仅供参考。 术语解释 向量点积 定义：向量点积为标量 a = (a1, a2, a3) b = (b1, b2, b3) a - b = a1*b1 + a2*b2 + a3*b3 几何意义： a - b = |a| |b| cos(theta) 其中 theta 是两个向量的夹角。

## I Will Not Add Query Strings to Your URLs

DevFeed: [I Will Not Add Query Strings to Your URLs](<https://devfeed.tech/articles/i-will-not-add-query-strings-to-your-urls-37669.md>)

Original publisher: [Read original article](<https://susam.net/no-query-strings.html>)

Published: 2026-05-09T00:00:00Z

Content type: opinion

Language: en

Sources: [Susam Pal](<https://devfeed.tech/sources/susam-pal.md>)

Topics: [Web Development](<https://devfeed.tech/topics/web-development.md>), [CSS](<https://devfeed.tech/topics/css.md>), [HTML](<https://devfeed.tech/topics/html.md>), [Self-hosted](<https://devfeed.tech/topics/self-hosted.md>), [C](<https://devfeed.tech/topics/c.md>), [C++](<https://devfeed.tech/topics/c-plus-plus.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [console](<https://devfeed.tech/topics/console.md>), [file](<https://devfeed.tech/topics/file.md>)

Tags: [blog-post](<https://devfeed.tech/tags/blog-post.md>), [c](<https://devfeed.tech/tags/c.md>), [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [css](<https://devfeed.tech/tags/css.md>), [developer](<https://devfeed.tech/tags/developer.md>), [html](<https://devfeed.tech/tags/html.md>), [query](<https://devfeed.tech/tags/query.md>)

### AI overview

The article reflects on Chris Morgan's opposition to query strings in URLs and connects that discussion to the author's experiences learning web development, CSS, HTML, and building the self-hosted Wander Console.

### Source excerpt

Last evening, a short blog post appeared in my feed reader that felt as if it spoke directly to me. It is Chris Morgan's excellent post I've banned query strings. Contents Wisdom on the Web Wander on the Web Misfeature Broken URLs Qualms Conclusion Wisdom on the Web Chris is someone whose Internet comments I have been reading for about half a decade now. I first stumbled upon his comments on Hacker News, where he left very detailed feedback on a small collection of boilerplate CSS rules I had shared there. I am by no means a web developer. I have spent most of my professional life doing systems programming in C and C++. However, developing websites and writing small HTML tools has been a long-time hobby for me. I have learnt most of my web development skills as a hobbyist by studying what other people do: first by viewing the source of websites I liked in the early 2000s and later by occasionally getting possessed by the urge to implement a new game or tool and searching MDN Web Docs to learn whatever I needed to make it work. One problem with learning a skill this way is that you sometimes pick up habits and practices that are fashionable but not necessarily optimal or correct. So it was really valuable to me when Chris commented on my collection of boilerplate CSS rules. It helped me improve my CSS a lot. In fact, a few of the lessons from his comment have really stuck with me; I keep them in mind whenever I make a hobby HTML project: always retain underlines in links and retain purple for visited links. I have been following Chris's posts and comments on web-related topics since then. He often posts great feedback on web-related projects. Whenever I come across one, I make sure to read them carefully, even when the project isn't mine. I always end up learning something nice and useful from his comments. Here is one such recent example from the Lobsters story Adding author context to RSS. Wander on the Web A couple of months ago, I created a new project called Wan

## PostgreSQL temporal UPDATE and DELETE by range

DevFeed: [PostgreSQL temporal UPDATE and DELETE by range](<https://devfeed.tech/articles/waiting-for-postgresql-19-add-update-delete-for-portion-of-33685.md>)

Original publisher: [Read original article](<https://www.depesz.com/2026/04/02/waiting-for-postgresql-19-add-update-delete-for-portion-of/>)

Author: depesz

Published: 2026-04-02T10:51:21Z

Content type: tutorial

Language: en

Sources: [select \* from depesz;](<https://devfeed.tech/sources/select-from-depesz.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [postgresql 18](<https://devfeed.tech/topics/postgresql-18.md>)

Tags: [delete](<https://devfeed.tech/tags/delete.md>), [period](<https://devfeed.tech/tags/period.md>), [pg19](<https://devfeed.tech/tags/pg19.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [range](<https://devfeed.tech/tags/range.md>), [temporal](<https://devfeed.tech/tags/temporal.md>), [uncategorized](<https://devfeed.tech/tags/uncategorized.md>), [update](<https://devfeed.tech/tags/update.md>), [version](<https://devfeed.tech/tags/version.md>), [waiting](<https://devfeed.tech/tags/waiting.md>)

### AI overview

This article explains a PostgreSQL patch that extends UPDATE and DELETE for temporal tables, allowing changes or deletions over a specified range or multirange period. The article also notes that the patch was later reverted after discussion.

### Source excerpt

Important update This has been reverted with some discussion. Thanks for ping to mkurz 🙂 On 1st of April 2026, Peter Eisentraut committed patch: Add UPDATE/DELETE FOR PORTION OF This is an extension of the UPDATE and DELETE commands to do a "temporal update/delete" based on a range or multirange column. The user can ... Continue reading "Waiting for PostgreSQL 19 - Add UPDATE/DELETE FOR PORTION OF"

## Waiting for PostgreSQL 19 - json format for COPY TO

DevFeed: [Waiting for PostgreSQL 19 - json format for COPY TO](<https://devfeed.tech/articles/waiting-for-postgresql-19-json-format-for-copy-to-33684.md>)

Original publisher: [Read original article](<https://www.depesz.com/2026/03/29/waiting-for-postgresql-19-json-format-for-copy-to/>)

Author: depesz

Published: 2026-03-29T12:34:22Z

Content type: article

Language: en

Sources: [select \* from depesz;](<https://devfeed.tech/sources/select-from-depesz.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [JSON](<https://devfeed.tech/topics/json.md>), [export](<https://devfeed.tech/topics/export.md>), [data](<https://devfeed.tech/topics/data.md>), [Query (disambiguation)](<https://devfeed.tech/topics/query.md>), [interoperability](<https://devfeed.tech/topics/interoperability.md>)

Tags: [command](<https://devfeed.tech/tags/command.md>), [copy](<https://devfeed.tech/tags/copy.md>), [data](<https://devfeed.tech/tags/data.md>), [developers](<https://devfeed.tech/tags/developers.md>), [export](<https://devfeed.tech/tags/export.md>), [json](<https://devfeed.tech/tags/json.md>), [pg19](<https://devfeed.tech/tags/pg19.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [stream](<https://devfeed.tech/tags/stream.md>), [uncategorized](<https://devfeed.tech/tags/uncategorized.md>), [waiting](<https://devfeed.tech/tags/waiting.md>)

### AI overview

The article discusses a PostgreSQL 19 patch adding a JSON format option to COPY TO. It allows table data or query results to be exported as a stream of JSON objects, one object per line, with an option to wrap the output in an array.

### Source excerpt

On 20th of March 2026, Andrew Dunstan committed patch: json format for COPY TO This introduces the JSON format option for the COPY TO command, allowing users to export query results or table data directly as a stream of JSON objects (one per line, NDJSON style). The JSON format is currently supported only ... Continue reading "Waiting for PostgreSQL 19 - json format for COPY TO"

## Shazam finds songs by voting on time offsets, not by comparing audio

DevFeed: [Shazam finds songs by voting on time offsets, not by comparing audio](<https://devfeed.tech/articles/shazam-finds-songs-by-voting-on-time-offsets-not-by-comparing-audio-39556.md>)

Original publisher: [Read original article](<https://ankit-rana.com/logs/04-shazam-music-recognition/>)

Author: hello@ankit-rana.com

Published: 2026-03-16T00:00:00Z

Content type: tutorial

Language: en

Sources: [Ankit Rana | Mechanical Sympathy](<https://devfeed.tech/sources/ankit-rana-mechanical-sympathy.md>)

Topics: [Algorithm](<https://devfeed.tech/topics/algorithm.md>), [hash](<https://devfeed.tech/topics/hash.md>), [Databases](<https://devfeed.tech/topics/databases.md>)

Tags: [algorithm](<https://devfeed.tech/tags/algorithm.md>), [algorithms](<https://devfeed.tech/tags/algorithms.md>), [audio-fingerprinting](<https://devfeed.tech/tags/audio-fingerprinting.md>), [databases](<https://devfeed.tech/tags/databases.md>), [hash](<https://devfeed.tech/tags/hash.md>), [indexing](<https://devfeed.tech/tags/indexing.md>), [lookup](<https://devfeed.tech/tags/lookup.md>), [music-recognition](<https://devfeed.tech/tags/music-recognition.md>), [query](<https://devfeed.tech/tags/query.md>), [system-design](<https://devfeed.tech/tags/system-design.md>)

### AI overview

The article explains how Shazam recognizes songs from short, noisy recordings. Instead of comparing audio similarity, it extracts spectrogram peaks, combines nearby peaks into hashes, and uses an inverted index to find tracks whose hash matches share a common time offset. The production system beyond the public 2003 paper is noted as unavailable.

### Source excerpt

Shazam does not compare audio. It reduces each track to spectrogram peaks, pairs nearby peaks into ~32-bit hashes, and looks those up in an inverted index. A match is declared when many hashes from the sample agree on a single time offset into one track. The offset histogram is the whole trick: noise scatters offsets randomly, a real match stacks them into a spike.

## NetBox Config Templates Tip: Query Objects Efficiently with .filter()

DevFeed: [NetBox Config Templates Tip: Query Objects Efficiently with .filter()](<https://devfeed.tech/articles/netbox-config-templates-tip-query-objects-efficiently-with-filter-30858.md>)

Original publisher: [Read original article](<https://www.packetcoders.io/netbox-config-templates-tip-query-objects-efficiently-with-filter/>)

Author: Rick Donato

Published: 2026-03-10T08:00:07Z

Content type: tutorial

Language: en

Sources: [Packet Coders - Learn Network Automation](<https://devfeed.tech/sources/packet-coders-learn-network-automation.md>)

Topics: [NetBox](<https://devfeed.tech/topics/netbox.md>), [Django](<https://devfeed.tech/topics/django.md>), [Object-relational mapping](<https://devfeed.tech/topics/orm.md>)

Tags: [config](<https://devfeed.tech/tags/config.md>), [django](<https://devfeed.tech/tags/django.md>), [filter](<https://devfeed.tech/tags/filter.md>), [interface](<https://devfeed.tech/tags/interface.md>), [interfaces](<https://devfeed.tech/tags/interfaces.md>), [netbox](<https://devfeed.tech/tags/netbox.md>), [orm](<https://devfeed.tech/tags/orm.md>), [query](<https://devfeed.tech/tags/query.md>), [templates](<https://devfeed.tech/tags/templates.md>), [tips](<https://devfeed.tech/tags/tips.md>)

### AI overview

A short tutorial showing how to use .filter() in NetBox Config Templates to query objects during lookups and conditional logic through the Django ORM QuerySet interface.

### Source excerpt

Use .filter() in Config Templates to query objects during lookups and conditional logic. This exposes the Django ORM QuerySet filter directly in your templates. Here's an example: {% for iface in device.interfaces.filter(enabled=True, name__startswith="ge-") %} interface {{ iface.name }} {% endfor %}

## SQLite Query Optimisation - How the Planner Thinks and Where It Goes Wrong

DevFeed: [SQLite Query Optimisation - How the Planner Thinks and Where It Goes Wrong](<https://devfeed.tech/articles/sqlite-query-optimisation-how-the-planner-thinks-and-where-it-goes-wrong-39650.md>)

Original publisher: [Read original article](<https://www.gauravsarma.com/posts/2026-03-08_sqlite-query-optimisation>)

Published: 2026-03-08T00:00:00Z

Content type: tutorial

Language: en

Sources: [Gaurav Sarma's Blog](<https://devfeed.tech/sources/gaurav-sarma-s-blog.md>)

Topics: [SQLite](<https://devfeed.tech/topics/sqlite.md>), [SQL](<https://devfeed.tech/topics/sql.md>), [Databases](<https://devfeed.tech/topics/databases.md>)

Tags: [b-tree](<https://devfeed.tech/tags/b-tree.md>), [index](<https://devfeed.tech/tags/index.md>), [optimisation](<https://devfeed.tech/tags/optimisation.md>), [planner](<https://devfeed.tech/tags/planner.md>), [query](<https://devfeed.tech/tags/query.md>), [query-planner](<https://devfeed.tech/tags/query-planner.md>), [sql](<https://devfeed.tech/tags/sql.md>), [sqlite](<https://devfeed.tech/tags/sqlite.md>)

### AI overview

A tutorial on how SQLite's query planner chooses between index searches and full table scans. It explains planner behavior, the effects of query patterns and data distribution, and how to avoid conditions that make indexes inaccessible or scans appear cheaper.

### Source excerpt

. [SQLite Query Optimisation](sqlite-query-optimisation-cover...

## pg\_plan\_advice: Plan Stability and User Planner Control for PostgreSQL?

DevFeed: [pg\_plan\_advice: Plan Stability and User Planner Control for PostgreSQL?](<https://devfeed.tech/articles/pg-plan-advice-plan-stability-and-user-planner-control-for-postgresql-33636.md>)

Original publisher: [Read original article](<https://rhaas.blogspot.com/2026/03/pgplanadvice-plan-stability-and-user.html>)

Author: Robert Haas (noreply@blogger.com)

Published: 2026-03-04T17:55:00Z

Content type: opinion

Language: en

Sources: [Robert Haas](<https://devfeed.tech/sources/robert-haas.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [JOIN](<https://devfeed.tech/topics/join.md>), [modules](<https://devfeed.tech/topics/modules.md>), [Query (disambiguation)](<https://devfeed.tech/topics/query.md>)

Tags: [join](<https://devfeed.tech/tags/join.md>), [modules](<https://devfeed.tech/tags/modules.md>), [plan](<https://devfeed.tech/tags/plan.md>), [planner](<https://devfeed.tech/tags/planner.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [test](<https://devfeed.tech/tags/test.md>)

### AI overview

The article presents a proposed PostgreSQL 19 patch set introducing the pg_plan_advice, pg_collect_advice, and pg_stash_advice contrib modules. It demonstrates how pg_plan_advice can generate plan advice strings, preserve selected planner decisions, or vary advice to produce a different join plan.

### Source excerpt

I'm proposing a very ambitious patch set for PostgreSQL 19. Only time will tell whether it ends up in the release, but I can't resist using this space to give you a short demonstration of what it can do. The patch set introduces three new contrib modules, currently called pg_plan_advice, pg_collect_advice, and pg_stash_advice. Read more "

## Row Locks With Joins Can Produce Surprising Results in PostgreSQL

DevFeed: [Row Locks With Joins Can Produce Surprising Results in PostgreSQL](<https://devfeed.tech/articles/row-locks-with-joins-can-produce-surprising-results-in-postgresql-33920.md>)

Original publisher: [Read original article](<https://hakibenita.com/postgres-row-lock-with-join>)

Author: Haki Benita

Published: 2026-02-23T22:00:00Z

Content type: tutorial

Language: en

Sources: [Haki Benita](<https://devfeed.tech/sources/haki-benita.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Databases](<https://devfeed.tech/topics/databases.md>), [Query (disambiguation)](<https://devfeed.tech/topics/query.md>)

Tags: [articles](<https://devfeed.tech/tags/articles.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [database](<https://devfeed.tech/tags/database.md>), [locks](<https://devfeed.tech/tags/locks.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [sql](<https://devfeed.tech/tags/sql.md>)

### AI overview

This article explains a PostgreSQL edge case in which row locks used with joins can produce surprising results, including a query returning no rows despite a valid, enforced foreign key. It uses a concurrent car-ownership update scenario and suggests ways to prevent the issue.

### Source excerpt

You execute a query that joins two tables with a valid an enforces foreign key and it returns no results. How is it possible? We thought it wasn't possible, but a recent incident revealed an edge case we never thought about. In this article I show how under some circumstances row locks with joins can produce surprising results, and suggest ways to prevent it.

## Unconventional PostgreSQL Optimizations

DevFeed: [Unconventional PostgreSQL Optimizations](<https://devfeed.tech/articles/unconventional-postgresql-optimizations-33925.md>)

Original publisher: [Read original article](<https://hakibenita.com/postgresql-unconventional-optimizations>)

Author: Haki Benita

Published: 2026-01-19T22:00:00Z

Content type: tutorial

Language: en

Sources: [Haki Benita](<https://devfeed.tech/sources/haki-benita.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [Optimization](<https://devfeed.tech/topics/optimization.md>), [Database](<https://devfeed.tech/topics/database.md>), [Query (disambiguation)](<https://devfeed.tech/topics/query.md>), [Inheritance](<https://devfeed.tech/topics/inheritance.md>)

Tags: [articles](<https://devfeed.tech/tags/articles.md>), [database-optimization](<https://devfeed.tech/tags/database-optimization.md>), [optimization](<https://devfeed.tech/tags/optimization.md>), [partitioning](<https://devfeed.tech/tags/partitioning.md>), [performance](<https://devfeed.tech/tags/performance.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [query](<https://devfeed.tech/tags/query.md>), [vacuum](<https://devfeed.tech/tags/vacuum.md>)

### AI overview

This article presents unconventional PostgreSQL optimization techniques. It explains how constraint exclusion can use check constraints to avoid scanning a table for impossible conditions, while noting that enabling it broadly can add planning overhead; partition pruning is enabled by default for partitioned tables.

### Source excerpt

When it comes to database optimization, developers often reach for the same old tools: rewrite the query slightly differently, slap an index on a column, denormalize, analyze, vacuum, cluster, repeat. Conventional techniques are effective, but sometimes being creative can really pay off!

## Inside our effort to improve the Mintlify assistant

DevFeed: [Inside our effort to improve the Mintlify assistant](<https://devfeed.tech/articles/inside-our-effort-to-improve-the-mintlify-assistant-30981.md>)

Original publisher: [Read original article](<https://www.mintlify.com/blog/assistant-improvements>)

Author: Patrick Foster

Published: 2025-12-12T00:00:00Z

Content type: article

Language: en

Sources: [Mintlify Blog](<https://devfeed.tech/sources/mintlify-blog.md>)

Topics: [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [clickhouse](<https://devfeed.tech/topics/clickhouse.md>), [data](<https://devfeed.tech/topics/data.md>), [Large Language Model](<https://devfeed.tech/topics/llm.md>), [Software](<https://devfeed.tech/topics/software.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [analysis](<https://devfeed.tech/tags/analysis.md>), [clickhouse](<https://devfeed.tech/tags/clickhouse.md>), [customer](<https://devfeed.tech/tags/customer.md>), [data](<https://devfeed.tech/tags/data.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [llm](<https://devfeed.tech/tags/llm.md>), [model](<https://devfeed.tech/tags/model.md>), [pipeline](<https://devfeed.tech/tags/pipeline.md>), [quality](<https://devfeed.tech/tags/quality.md>), [query](<https://devfeed.tech/tags/query.md>), [responses](<https://devfeed.tech/tags/responses.md>), [script](<https://devfeed.tech/tags/script.md>), [server](<https://devfeed.tech/tags/server.md>), [thread](<https://devfeed.tech/tags/thread.md>), [trends](<https://devfeed.tech/tags/trends.md>)

### AI overview

This article explains how Mintlify analyzed and improved its assistant by rebuilding the feedback pipeline, moving conversation data into ClickHouse, and classifying negative interactions with an LLM. The analysis identified documentation search quality as the assistant's main weakness, while other responses were generally strong.

### Source excerpt

A data-driven look at improving the assistant, powered by ClickHouse and deeper feedback analysis.

[Next page](<https://devfeed.tech/tags/query.md?cursor=WyIyMDI1LTEyLTEyVDAwOjAwOjAwKzAwOjAwIiwgIjdhMTU0MGQwLWJjYzUtNDUyNC04NzIwLTUxMGRkNDVmZDAxZCJd>)