PERF: avoid regex on uploads table (#12485)

In extreme circumstances when the uploads table is huge, the old version of
this migration could take a very long time.

The rewrite extracts the sha1 directly from the badges table and does an index
based match on the uploads table
This commit is contained in:
Sam 2021-03-23 09:19:02 +11:00 committed by GitHub
parent d453d74ca7
commit e45bca7298
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 10 additions and 4 deletions

View File

@ -8,10 +8,16 @@ class AddImageUploadIdToBadges < ActiveRecord::Migration[6.0]
DB.exec <<~SQL
UPDATE badges b1
SET image_upload_id = u.id
FROM badges b2
INNER JOIN uploads u
ON b2.image ~ CONCAT('/', u.sha1, '\\.\\w')
WHERE b1.id = b2.id
FROM (
SELECT id, (regexp_matches(b.image, '[a-f0-9]{40}'))[1] as sha1
FROM badges b
WHERE
b.image IS NOT NULL AND
b.image ~ '[a-f0-9]{40}'
) b2
JOIN uploads u ON u.sha1 = b2.sha1
WHERE
b1.id = b2.id
SQL
end
end