Committing large transactions is very slow #48
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Committing transactions involving large numbers of hierarchy model classes is very slow. On my machine committing a transaction involving 1,111 hierarchy model classes takes 5.2 secs.
The problem appears to be that the hierarchy model class overrides == and eql? but not hash. Thus all model instances hash to the same value making the uniq call on the array of modified ActiveRecord instances in ActiveRecord::ConnectionAdapters::DatabaseStatements.commit_transaction_records() very slow. For my test case with 1,111 hierarchy model instances, the call to uniq() makes 2,466,420 calls to the hierarchy model eql? method. If I implement the hierarchy model hash method as follows this drops to 4,326 calls and the commit completes in 0.06 secs: