@@ -338,25 +338,28 @@ impl<'conn> SynapseReader<'conn> {
338
338
///
339
339
/// - An underlying database error
340
340
pub async fn count_rows ( & mut self ) -> Result < SynapseRowCounts , Error > {
341
+ // We don't get to filter out application service users by using this estimate,
342
+ // which is a shame, but on a large database this is way faster.
343
+ // On matrix.org, counting users and devices properly takes around 1m10s,
344
+ // which is unnecessary extra downtime during the migration, just to
345
+ // show a more accurate progress bar and size a hash map accurately.
341
346
let users: i64 = sqlx:: query_scalar (
342
347
"
343
- SELECT COUNT(1) FROM users
344
- WHERE appservice_id IS NULL
348
+ SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = 'users'::regclass;
345
349
" ,
346
350
)
347
351
. fetch_one ( & mut * self . txn )
348
352
. await
349
- . into_database ( "counting Synapse users" ) ?;
353
+ . into_database ( "estimating count of users" ) ?;
350
354
351
355
let devices = sqlx:: query_scalar (
352
356
"
353
- SELECT COUNT(1) FROM devices
354
- WHERE NOT hidden
357
+ SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = 'devices'::regclass;
355
358
" ,
356
359
)
357
360
. fetch_one ( & mut * self . txn )
358
361
. await
359
- . into_database ( "counting Synapse devices" ) ?;
362
+ . into_database ( "estimating count of devices" ) ?;
360
363
361
364
// For other rows, we don't particularly care about the number except for
362
365
// progress bars, so retrieve a fast estimate from the statistics system
0 commit comments