hca007
July 21, 2025, 3:24am
1
I have a liquibase process where when creating a new table in DB , the liquibase.snapshot.DatabaseSnapshot step is taking a lot of time on the constraints, i already have the stats gather on metadata but still the step takes time and overall contribute to slowness of the liquibase process in my application.
How can i debug this further ? what sql might be slow or any other setting ? Any ideas ?
the change log for create a pre condition
Degug logs of liquibase process ,
2025-07-16 15:18:29,493 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:29,493 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:29,579 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:29,579 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:29,932 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:29,933 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:30,055 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:30,055 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:30,161 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:30,162 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
2025-07-16 15:18:30,492 liquibase.snapshot.DatabaseSnapshot : DEBUG - Excluding XXX_Constraint_Name
Pete
August 1, 2025, 4:23pm
2
Welcome to the forums @hca007 . We’ll need more information to figure out what’s going on.
How long is the DatabaseSnapshot taking start to finish? The log lines you’ve provided only cover a second or so of elapsed time so it’s hard to gauge a the impact of the DatabaseSnapshot run time.
What does the changeset to create your table look like? I see in your description there might be a precondition involved, so including that will help too.
What database is this happening with?
The more of the log we can see, the better. Thanks!
hca007
August 5, 2025, 4:34am
3
Thanks @Pete for your response, the liquibase version we are using is 4.8.0 and the database is Oracle.
From the logs, the databasesnapshot process from start to finish is taking around 1 minute everytime there is a changeset to create a table, with a precondition like below,
"
<preConditions onFail="MARK_RAN">
<not>
<tableExists tableName="XXXX"/>
</not>
</preConditions>
"
I took a jstack on the process during liquibase.snapshot.DatabaseSnapshot and observed that it is calculating a hash of all environment variables ,
i also tried Liquibase’s configuration system to bypass the environment variable lookup, added the following Java system properties , But still the stack was showing same as below, (hashing the env variables)
-jopt:-Dliquibase.databaseChangeLogTableName=DATABASECHANGELOG
-jopt:-Dliquibase.databaseChangeLogLockTableName=DATABASECHANGELOGLOCK
-jopt:-Dliquibase.liquibaseSchemaName=XXX
*at java.util.HashMap$HashIterator.nextNode([java.base@17.0.12/HashMap.java:1601](mailto:java.base@17.0.12/HashMap.java:1601))*
*at java.util.HashMap$EntryIterator.next([java.base@17.0.12/HashMap.java:1630](mailto:java.base@17.0.12/HashMap.java:1630))*
*at java.util.HashMap$EntryIterator.next([java.base@17.0.12/HashMap.java:1628](mailto:java.base@17.0.12/HashMap.java:1628))*
*at java.lang.ProcessEnvironment$StringEntrySet$1.next([java.base@17.0.12/ProcessEnvironment.java:333](mailto:java.base@17.0.12/ProcessEnvironment.java:333))*
*at java.lang.ProcessEnvironment$StringEntrySet$1.next([java.base@17.0.12/ProcessEnvironment.java:329](mailto:java.base@17.0.12/ProcessEnvironment.java:329))*
*at java.util.AbstractMap.hashCode([java.base@17.0.12/AbstractMap.java:525](mailto:java.base@17.0.12/AbstractMap.java:525))*
*at java.util.Collections$UnmodifiableMap.hashCode([java.base@17.0.12/Collections.java:1540](mailto:java.base@17.0.12/Collections.java:1540))*
*at liquibase.configuration.AbstractMapConfigurationValueProvider.getMapHash(AbstractMapConfigurationValueProvider.java:73)*
*at liquibase.configuration.AbstractMapConfigurationValueProvider.getProvidedValue(AbstractMapConfigurationValueProvider.java:37)*
*at liquibase.configuration.LiquibaseConfiguration.getCurrentConfiguredValue(LiquibaseConfiguration.java:123)*
*at liquibase.configuration.ConfigurationDefinition.getCurrentConfiguredValue(ConfigurationDefinition.java:93)*
*at liquibase.configuration.ConfigurationDefinition.getCurrentValue(ConfigurationDefinition.java:61)*
*at liquibase.database.AbstractJdbcDatabase**.getDatabaseChangeLogLockTableName**(AbstractJdbcDatabase.java:641)*
*at liquibase.database.AbstractJdbcDatabase.isLiquibaseObject(AbstractJdbcDatabase.java:864)*
*at liquibase.database.core.OracleDatabase.isSystemObject(OracleDatabase.java:368)*
*at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:35)*
*at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:69)*
*at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:49)*
*at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:69)*
*at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:49)*
*at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:69)*
*at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:49)*
*at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:69)*
*at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:49)*
*at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:69)*
*at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:49)*
*at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:69)*
*at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:49)*
*at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:69)*
*at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:49)*
*at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:312)*
*at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:445)*
*at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:467)*
*at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:373)*
*at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:335)*
*at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:105)*
*at liquibase.snapshot.DatabaseSnapshot.<init>(DatabaseSnapshot.java:58)*
*at liquibase.snapshot.JdbcDatabaseSnapshot.<init>(JdbcDatabaseSnapshot.java:34)*
*at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:215)*
*at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:188)*
*at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:155)*
*at liquibase.snapshot.SnapshotGeneratorFactory.has(SnapshotGeneratorFactory.java:142)*
*at liquibase.precondition.core.TableExistsPrecondition.check(TableExistsPrecondition.java:59)*
*at liquibase.precondition.core.NotPrecondition.check(NotPrecondition.java:40)*
*at liquibase.precondition.core.AndPrecondition.check(AndPrecondition.java:45)*
*at liquibase.precondition.core.PreconditionContainer.check(PreconditionContainer.java:213)*
*at liquibase.changelog.ChangeSet.execute(ChangeSet.java:577)*