Comparison performance#
LiveCompare is optimized for use on production systems and has various parameters for tuning. Comparison rounds are read-only workloads. An example use case compared 43,109,165 rows in 6 tables in 9m 17s with 4 connections and 4 workers, giving comparison performance of approximately 77k rows per second, or 1 billion rows in <4 hours.
This use case is a general use case. For low-load, testing, migration,
and other specific scenarios, you might be able to improve speed by
changing the data_fetch_mode setting to use server-side cursors. In
our experiments, each kind of server-side cursors provides an increase
in performance on use cases involving either small or large tables.
Security considerations for the user#
For PostgreSQL 13 and earlier, LiveCompare requires a user that can read all data being compared. PostgreSQL 14 introduced a new role, pg_read_all_data, that can be used for LiveCompare.
When logical_replication_mode = bdr , LiveCompare requires a user
with the bdr_superuser role. When
logical_replication_mode = pglogical , LiveCompare requires a user
with the pglogical_superuser role.
To apply the DML scripts in PGD, all divergent connections (potentially
all data connections) require a user with the bdr_superuser role to
disable bdr.xact_replication .
If PGD is being used, LiveCompare associates all fixed rows with a
replication origin called bdr_local_only_origin . LiveCompare also
applies the DML with the transaction datetime far in the past, so if
there are any PGD conflicts with real DML being executed on the
database, LiveCompare DML always loses the conflict.
With the default setting of difference_fix_start_query , the
transaction in apply scripts changes role to the owner of the table to
prevent database users from gaining access to the role applying fixes by
writing malicious triggers. As a result, the user for the divergent
connection needs to be able to switch role to the table owner.