07 - Parallel Queries

Running multiple queries concurrently for better performance.

What it shows

Why Parallel?

Sequential queries wait for each to complete:

Query 1 ████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░  100ms
Query 2             ████████████░░░░░░░░░░░░░░░░  100ms
Query 3                         ████████████░░░░  100ms
Total: 300ms

Parallel queries run simultaneously:

Query 1 ████████████  100ms
Query 2 ████████████  100ms
Query 3 ████████████  100ms
Total: ~100ms (3x faster!)

Pattern

# Create futures for parallel queries
my @futures;
for my $query (@queries) {
    my $f = (async sub {
        my $conn = await $pg->connection;  # Gets pooled connection
        my $result = await $conn->query($query);
        $conn->release;
        return $result;
    })->();
    push @futures, $f;
}

# Wait for all to complete
my @results = Future->wait_all(@futures)->get;

When to Use Parallel Queries

Good candidates:

Not suitable:

Prerequisites

A running PostgreSQL server. No tables needed.

Running

perl app.pl

Expected output

=== Sequential vs Parallel Queries ===

Running 5 queries SEQUENTIALLY...
  Sequential time: 0.52 seconds
  (104ms per query)

Running 5 queries IN PARALLEL...
  Parallel time: 0.11 seconds
  Speedup: 4.7x faster!

=== Real-World Example: Dashboard ===

Dashboard data (fetched in parallel):
  Active connections: 3
  Database size: 8.42 MB
  Tables in public: 0
  PostgreSQL: PostgreSQL 16.1

Fetched in 0.015 seconds

=== Connection Pool Stats ===

  Connections created: 6
  Current idle: 5
  Current active: 0
  Total: 5

=== Key Takeaways ===

1. Async queries allow true parallelism
2. Connection pooling manages concurrent connections
3. Independent queries should run in parallel
4. Dependent queries must run sequentially

Done!

Connection Pool Sizing

The pool's max_connections limits parallelism:

| max_connections | Parallel queries | Notes | |-----------------|------------------|-------| | 1 | None (sequential) | Simple, but slow | | 5 | Up to 5 | Good default | | 20+ | High parallelism | Watch DB limits |

Don't exceed PostgreSQL's max_connections (default: 100).