-
-
Notifications
You must be signed in to change notification settings - Fork 824
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WIP: Avoid unnecessary operations on the database. #31558
base: master
Are you sure you want to change the base?
Conversation
🤖 Thank you for contributing to CiviCRM! ❤️ We will need to test and review this PR. 👷 Introduction for new contributors...
Quick links for reviewers...
|
The idea makes sense to me - but is the scope of those statics restricted enough? I fear if multiple different mailings were sent during the same cron job run, all of the contacts would get linked to the same activity. I'm not sure of the calling code, but maybe a protected instance var on the MailingJob class could work ( something like this $this->recipientActivityId )? |
Also just noting IIRC that there's a CiviMail to disable the activity creation entirely, which I think is often a good idea at scale |
@ufundo you are correct, let me think about it. |
@@ -705,20 +707,23 @@ public function writeToDB( | |||
|
|||
//check whether activity is already created for this mailing. | |||
//if yes then create only target contact record. | |||
$query = " | |||
if (!$activityID) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Picking up @ufundo's feedback my thinking would be to do something like here
if (!isset(Civi::$statics[CLASS]['activity_ids'])) {
Civi::$statics[CLASS]['activity_ids'] = [];
}
if (!isset(Civi::$statics[CLASS]['activity_ids'][$this->mailing_id])) {
// run the query
and set Civi::$statics[CLASS]['activity_ids'][$this->mailing_id] = found activity id and then just use Civi::$statics[CLASS]['activity_ids'][$this->mailing_id] as the reference to the activity id going forward or something
Overview
When your activity table has millions of rows, and mailing is scheduled with a large number of recipients. Every time an email is sent, a batch of 10 records gets recorded with bulk email activity. Every batch call, we fetch the activity ID.Although it is one call per batch, it can be avoided like the existing
$activityTypeID
variable.The goal is to avoid select queries on big tables when mailing is sending...
Before
On every batch select query used to activity ID and activity target record type.
Avoid save/update operation on activity record.
After
Now only one call per job run.