Rebuilding large GIN indexes
Rebuilding large GIN indexes
takes time. A lot of time. With rebuilding, I mean when you for example have to UPDATE all your tsvector fields due to a change in tsearch2 configuration. (Yes, I had to do that because I had a slightly incorrect tsearch2 configuration for the archives search database). So don't do it. Instead use the fact that PostgreSQL has nice transactional DDL and do something like this:
(apologies for any typos, I didn't bother to actually type these commands into the database again, and I lost my cut-and-paste of what I ran)
This way, the messages table can still serve up searches without any disruption to the searches at all. And creating the new index is a lot faster than updating the existing one if you have to touch all rows.
BEGIN TRANSACTION;
CREATE TABLE messages_new AS SELECT id,txt,to_tsvector(txt) AS fti
FROM messages;
CREATE INDEX messages_new_fti ON messages_new USING gin(fti);
ANALYZE messags_new;
ALTER TABLE messages RENAME TO messages_old;
ALTER TABLE messages_new RENAME TO messages;
COMMIT;
DROP TABLE messages_old;
ALTER INDEX messages_new_fti RENAME TO messages_fti;
(apologies for any typos, I didn't bother to actually type these commands into the database again, and I lost my cut-and-paste of what I ran)
This way, the messages table can still serve up searches without any disruption to the searches at all. And creating the new index is a lot faster than updating the existing one if you have to touch all rows.
No comments:
Post a Comment