Eu tenho um banco de dados no PostgreSQL 9.2 que tem um esquema principal com cerca de 70 tabelas e um número variável de esquemas por cliente estruturados de forma idêntica de 30 tabelas cada. Os esquemas do cliente têm chaves estrangeiras que fazem referência ao esquema principal e não o contrário.
Acabei de começar a preencher o banco de dados com alguns dados reais retirados da versão anterior. O banco de dados atingiu cerca de 1,5 GB (espera-se que cresça para vários 10s GB em semanas) quando tive que fazer uma exclusão em massa em uma tabela muito central no esquema principal. Todas as chaves estrangeiras em questão são marcadas como ON DELETE CASCADE.
Não foi surpresa que isso demorasse muito, mas depois de 12 horas ficou claro que era melhor começar de novo, largar o banco de dados e iniciar a migração novamente. Mas e se eu precisar repetir essa operação mais tarde quando o banco de dados estiver ativo e muito maior? Existem métodos alternativos e mais rápidos?
Seria muito mais rápido se eu escrevesse um script que navegasse pelas tabelas dependentes, começando na tabela mais distante da tabela central, excluindo as linhas dependentes tabela por tabela?
Um detalhe importante é que existem triggers em algumas das tabelas.