Coming from a Rails background, I have a large production database that I have a copy of where I only need records from 4 of the 2000+ companies. I'm trying to delete all the rows except the ones belonging to the 4, and I know the way I have it is not optimal.
DELETE FROM appointments
WHERE (appointments.company_id NOT IN (6, 753, 785, 1611))
another example is when I have to delete records on a table where the company_id is on an associated table:
DELETE FROM mappings
WHERE mappings.id IN (SELECT mappings.id
FROM code_mappings
INNER JOIN codes ON codes.remote_id = mappings.code_remote_id
WHERE (codes.company_id NOT IN (6, 753, 785, 1611)))
Best Answer
In relation to the first table,
appointments
, make sure that you have an index oncompany_id
column.In relation to the
mappings
table, usingEXISTS
rather thanIN
may yield better performance. You can re-write your query as following:In the above query, you will also benefit from indexes on the
mappings
andcode
tables.Documentation for creating indexes is @ https://www.postgresql.org/docs/current/static/sql-createindex.html. In your case, you can create indexes on the relevant tables as following: