J'ai 2 tables (nom (champs)):Comment optimiser la requête de suppression lente (suppression des données qui ne sont pas utilisées dans une autre table) dans Postgresql
data(object_id, property_id, value_id)
et
string(id, value)
Toutes les les données sont dans la table "chaîne". "données" ne fait référence qu'aux chaînes correspondantes.
Par exemple, j'ai:
data(1,2,3)
data(1,4,5)
data(6,4,7)
string(1, 'car')
string(2, 'color')
string(3, 'red')
string(4, 'make')
string(5, 'audi')
string(6, 'car2')
string(7, 'toyota')
Maintenant ce que je veux, quand je supprime quelques lignes dans le tableau de données, puis toutes les lignes orphelines dans le tableau de chaînes seraient également supprimés:
si je supprimer les données (6,4,7) alors les chaînes avec les identifiants 6 et 7 seraient supprimées (parce qu'elles ne sont plus utilisées); 4 est utilisé dans une autre ligne de données et n'est donc pas supprimé.
Ma question est, comment écrire une requête de suppression optimisée pour la table de chaînes?
Actuellement, j'ai quelque chose comme ça (ce qui fonctionne, mais il est très lent):
delete
from string s
where 1=1
and (select count(id) from data where object_id = s.id) = 0
and (select count(id) from data where property_id = s.id) = 0
and (select count(id) from data where value_id = s.id) = 0
J'ai aussi essayé (en fonction du nombre d'orphelins donne parfois résultat 10-20% plus rapide):
delete from string
where (id not in (select usedids.id from (select object_id as id from data
union
select property_id as id from data
union
select value_id as id from data) as usedids)
);
J'ai environ 100k lignes dans les deux tables. Si je supprime environ 6000 lignes dans la table de données, le nettoyage de la table de chaînes prend environ 3 minutes. J'ai un index sur chaque domaine. J'ai aussi des contraintes de clés étrangères.
Donc l'enregistrement dans les données de (6,4,7) est en fait un fk_id à la table de chaînes pour chaque colonne dans les données? Donc 6 points à la chaîne id = 6 et 4 points à la chaîne id = 4 et la même chose pour 7? Une normalisation pourrait probablement résoudre la plupart de vos problèmes si c'est le cas. – Kuberchaun
Peut spécifier "une certaine normalisation"?L'idée est d'avoir une structure schématique, où je peux stocker tout simplement sans apporter de changements à la structure db. Il veut reproduire la base de données de style RDF. Je sais, il y a des bases RDF spécifiques, mais j'ai besoin d'utiliser poistgresql. Mais peut-être avez-vous de bonnes idées sur la normalisation? – Ago
"L'idée est d'avoir une structure sans schémas, où je peux stocker pratiquement tout sans apporter de modifications à la structure db." Eh bien, vous voyez maintenant pourquoi ce n'est pas une bonne idée dans un dbms SQL. –