Home / Input Output / cardano-db-sync
Mar 17, 7-8 PM (0)
Mar 17, 8-9 PM (0)
Mar 17, 9-10 PM (0)
Mar 17, 10-11 PM (0)
Mar 17, 11-12 AM (0)
Mar 18, 12-1 AM (0)
Mar 18, 1-2 AM (0)
Mar 18, 2-3 AM (0)
Mar 18, 3-4 AM (0)
Mar 18, 4-5 AM (0)
Mar 18, 5-6 AM (0)
Mar 18, 6-7 AM (0)
Mar 18, 7-8 AM (0)
Mar 18, 8-9 AM (0)
Mar 18, 9-10 AM (0)
Mar 18, 10-11 AM (0)
Mar 18, 11-12 PM (0)
Mar 18, 12-1 PM (2)
Mar 18, 1-2 PM (0)
Mar 18, 2-3 PM (0)
Mar 18, 3-4 PM (1)
Mar 18, 4-5 PM (0)
Mar 18, 5-6 PM (0)
Mar 18, 6-7 PM (0)
Mar 18, 7-8 PM (0)
Mar 18, 8-9 PM (0)
Mar 18, 9-10 PM (0)
Mar 18, 10-11 PM (0)
Mar 18, 11-12 AM (0)
Mar 19, 12-1 AM (0)
Mar 19, 1-2 AM (0)
Mar 19, 2-3 AM (0)
Mar 19, 3-4 AM (0)
Mar 19, 4-5 AM (0)
Mar 19, 5-6 AM (0)
Mar 19, 6-7 AM (0)
Mar 19, 7-8 AM (0)
Mar 19, 8-9 AM (0)
Mar 19, 9-10 AM (2)
Mar 19, 10-11 AM (1)
Mar 19, 11-12 PM (2)
Mar 19, 12-1 PM (0)
Mar 19, 1-2 PM (0)
Mar 19, 2-3 PM (0)
Mar 19, 3-4 PM (1)
Mar 19, 4-5 PM (0)
Mar 19, 5-6 PM (0)
Mar 19, 6-7 PM (0)
Mar 19, 7-8 PM (0)
Mar 19, 8-9 PM (0)
Mar 19, 9-10 PM (0)
Mar 19, 10-11 PM (0)
Mar 19, 11-12 AM (0)
Mar 20, 12-1 AM (0)
Mar 20, 1-2 AM (0)
Mar 20, 2-3 AM (0)
Mar 20, 3-4 AM (0)
Mar 20, 4-5 AM (0)
Mar 20, 5-6 AM (0)
Mar 20, 6-7 AM (0)
Mar 20, 7-8 AM (0)
Mar 20, 8-9 AM (0)
Mar 20, 9-10 AM (0)
Mar 20, 10-11 AM (0)
Mar 20, 11-12 PM (0)
Mar 20, 12-1 PM (0)
Mar 20, 1-2 PM (0)
Mar 20, 2-3 PM (1)
Mar 20, 3-4 PM (0)
Mar 20, 4-5 PM (0)
Mar 20, 5-6 PM (0)
Mar 20, 6-7 PM (0)
Mar 20, 7-8 PM (0)
Mar 20, 8-9 PM (0)
Mar 20, 9-10 PM (0)
Mar 20, 10-11 PM (0)
Mar 20, 11-12 AM (0)
Mar 21, 12-1 AM (0)
Mar 21, 1-2 AM (0)
Mar 21, 2-3 AM (0)
Mar 21, 3-4 AM (0)
Mar 21, 4-5 AM (0)
Mar 21, 5-6 AM (0)
Mar 21, 6-7 AM (0)
Mar 21, 7-8 AM (0)
Mar 21, 8-9 AM (0)
Mar 21, 9-10 AM (0)
Mar 21, 10-11 AM (0)
Mar 21, 11-12 PM (0)
Mar 21, 12-1 PM (0)
Mar 21, 1-2 PM (0)
Mar 21, 2-3 PM (0)
Mar 21, 3-4 PM (0)
Mar 21, 4-5 PM (0)
Mar 21, 5-6 PM (0)
Mar 21, 6-7 PM (0)
Mar 21, 7-8 PM (0)
Mar 21, 8-9 PM (0)
Mar 21, 9-10 PM (0)
Mar 21, 10-11 PM (0)
Mar 21, 11-12 AM (0)
Mar 22, 12-1 AM (0)
Mar 22, 1-2 AM (0)
Mar 22, 2-3 AM (0)
Mar 22, 3-4 AM (0)
Mar 22, 4-5 AM (0)
Mar 22, 5-6 AM (0)
Mar 22, 6-7 AM (0)
Mar 22, 7-8 AM (0)
Mar 22, 8-9 AM (0)
Mar 22, 9-10 AM (0)
Mar 22, 10-11 AM (0)
Mar 22, 11-12 PM (0)
Mar 22, 12-1 PM (0)
Mar 22, 1-2 PM (0)
Mar 22, 2-3 PM (0)
Mar 22, 3-4 PM (0)
Mar 22, 4-5 PM (0)
Mar 22, 5-6 PM (0)
Mar 22, 6-7 PM (0)
Mar 22, 7-8 PM (0)
Mar 22, 8-9 PM (0)
Mar 22, 9-10 PM (0)
Mar 22, 10-11 PM (0)
Mar 22, 11-12 AM (0)
Mar 23, 12-1 AM (0)
Mar 23, 1-2 AM (0)
Mar 23, 2-3 AM (0)
Mar 23, 3-4 AM (0)
Mar 23, 4-5 AM (0)
Mar 23, 5-6 AM (0)
Mar 23, 6-7 AM (0)
Mar 23, 7-8 AM (0)
Mar 23, 8-9 AM (0)
Mar 23, 9-10 AM (0)
Mar 23, 10-11 AM (0)
Mar 23, 11-12 PM (0)
Mar 23, 12-1 PM (2)
Mar 23, 1-2 PM (1)
Mar 23, 2-3 PM (0)
Mar 23, 3-4 PM (0)
Mar 23, 4-5 PM (0)
Mar 23, 5-6 PM (1)
Mar 23, 6-7 PM (0)
Mar 23, 7-8 PM (0)
Mar 23, 8-9 PM (0)
Mar 23, 9-10 PM (0)
Mar 23, 10-11 PM (2)
Mar 23, 11-12 AM (0)
Mar 24, 12-1 AM (0)
Mar 24, 1-2 AM (0)
Mar 24, 2-3 AM (1)
Mar 24, 3-4 AM (0)
Mar 24, 4-5 AM (0)
Mar 24, 5-6 AM (0)
Mar 24, 6-7 AM (0)
Mar 24, 7-8 AM (0)
Mar 24, 8-9 AM (0)
Mar 24, 9-10 AM (0)
Mar 24, 10-11 AM (0)
Mar 24, 11-12 PM (0)
Mar 24, 12-1 PM (0)
Mar 24, 1-2 PM (0)
Mar 24, 2-3 PM (0)
Mar 24, 3-4 PM (0)
Mar 24, 4-5 PM (0)
Mar 24, 5-6 PM (0)
Mar 24, 6-7 PM (0)
Mar 24, 7-8 PM (0)
17 commits this week Mar 17, 2026 - Mar 24, 2026
Make sure we're using indexes during rollbacks
    Fixes https://github.com/IntersectMBO/cardano-db-sync/issues/2083

    The `queryMinRefId` query uses
    ```sql
    SELECT id FROM <table> WHERE <field> >= $1 ORDER BY id ASC LIMIT 1.
    ```

    The planner sometimes picks a bad plan:

    ```sql
    Index Scan using tx_pkey on tx
      Filter: (block_id >= $1)
    ```

    the filter is not Index Cond, so this ends up in a sequential scan.
    The index refers to the primary key and is only used for sorting.

    Instead we use a simpler query without ORDER BY:

    SELECT id FROM <table> WHERE <field> >= $1 LIMIT 10000
    This forces the planner to use the field's index.
    The results are fetched and the minimum is found in Haskell.
    Near the tip this returns only a handful of rows.

    If there are more than 10000 matching rows (large rollback),
    we fall back to the original ORDER BY id ASC LIMIT 1 query.
Make sure we're using indexes during rollbacks
Fixes https://github.com/IntersectMBO/cardano-db-sync/issues/2083

The `queryMinRefId` query uses
```sql
SELECT id FROM <table> WHERE <field> >= $1 ORDER BY id ASC LIMIT 1.
```

The planner sometimes picks a bad plan:

```sql
Index Scan using tx_pkey on tx
  Filter: (block_id >= $1)
```

the filter is not Index Cond, so this ends up in a sequential scan.
The index refers to the primary key and is only used for sorting.

Instead we use a simpler query without ORDER BY:

SELECT id FROM <table> WHERE <field> >= $1 LIMIT 10000
This forces the planner to use the field's index.
The results are fetched and the minimum is found in Haskell.
Near the tip this returns only a handful of rows.

If there are more than 10000 matching rows (large rollback),
we fall back to the original ORDER BY id ASC LIMIT 1 query.
Make sure we're using indexes during rollbacks
    Fixes https://github.com/IntersectMBO/cardano-db-sync/issues/2083#issuecomment-4110278201
    for 13.6.0.5.
    The planner sometimes uses a query similar to

    Index Scan using tx_pkey on tx
      Filter: (block_id >= $1)

    the filter is not Index Cond, so this ends up in a sequential scan.
    The index refers to the primary key and is only used for sorting.
    Instead we want to use

    Sort (top-N heapsort)
      -> Index Scan using idx_tx_block_id
           Index Cond: (block_id >= $1)

    With this change we're forcing a similar plan

    Aggregate
      -> Index Scan using idx_tx_block_id
           Index Cond: (block_id >= $1)

    making sure we're using the Index Cond and then sorting.
Make sure we're using indexes during rollbacks
Fixes https://github.com/IntersectMBO/cardano-db-sync/issues/2083#issuecomment-4110278201
The planner sometimes uses a query similar to

Index Scan using tx_pkey on tx
  Filter: (block_id >= $1)

the filter is not Index Cond, so this ends up in a sequential scan.
The index refers to the primary key and is only used for sorting.
Instead we want to use

Sort (top-N heapsort)
  -> Index Scan using idx_tx_block_id
       Index Cond: (block_id >= $1)

With this change we're forcing a similar plan

Aggregate
  -> Index Scan using idx_tx_block_id
       Index Cond: (block_id >= $1)

making sure we're using the Index Cond and then sorting.