Eu tenho um banco de dados no PostgreSQL 9.2 que possui um esquema principal com cerca de 70 tabelas e um número variável de esquemas por cliente estruturados de forma idêntica, com 30 tabelas cada. Os esquemas do cliente têm chaves estrangeiras que referenciam o esquema principal e não o contrário.
Comecei a preencher o banco de dados com alguns dados reais extraídos da versão anterior. O banco de dados atingiu cerca de 1,5 GB (espera-se aumentar para vários 10s GB em semanas) quando eu tive que fazer uma exclusão em massa em uma tabela muito central no esquema principal. Todas as chaves estrangeiras envolvidas estão marcadas em EXCLUIR CASCADE.
Não foi surpresa que isso levasse muito tempo, mas após 12 horas ficou claro que era melhor começar de novo, abandonando o banco de dados e iniciando 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 gatilhos em algumas das tabelas.