Hi codeWarrior, codeWarrior wrote: > > For user_ids that have more than 50 rows, I want to keep the most > > recent 50 and delete the rest. > How about using a trigger to call a stored procedure ? [ON INSERT to > user_item_history DO ...]
[snip] Thanks for your input! I've implemented this but I'm concerned about performance. As I mentioned it's frequently being added to and this function will be called maybe a couple of times a second. In my brief initial tests it seems like this is running quite slowly... Just to make sure I haven't done anything obviously wrong, I've included my implementation below.. if you could look over it I'd really appreciate it. CREATE OR REPLACE FUNCTION user_item_history_limit() RETURNS TRIGGER AS $_$ DECLARE threshold integer = 50; numrows integer; BEGIN SELECT INTO numrows count(*) FROM user_item_history WHERE user_id = new.user_id; IF numrows > threshold THEN DELETE FROM user_item_history WHERE user_id = new.user_id AND id NOT IN ( SELECT id FROM user_item_history WHERE user_id = new.user_id ORDER BY timestamp DESC LIMIT threshold); RAISE NOTICE '% rows exceeds threshold of % for user_id %; trimming..', numrows, threshold, new.user_id; END IF; RETURN new; END; $_$ LANGUAGE plpgsql; CREATE TRIGGER user_item_history_limit AFTER INSERT ON user_item_history FOR EACH ROW EXECUTE PROCEDURE user_item_history_limit(); Any suggestions greatly appreciated! Thanks again, Jamie ---------------------------(end of broadcast)--------------------------- TIP 7: You can help support the PostgreSQL project by donating at http://www.postgresql.org/about/donate