IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Retirer temporairement une contrainte d'intégrité


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Retirer temporairement une contrainte d'intégrité
    Bonjour,

    Je possède ce genre de situation, schématiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Table Point
    (
      id,
      name,
      description
    )
     
    Table Ligne
    (
       id,
       id_point_depart,
       id_point_arrivé,
       name,
       description,
       distance
    )
    Il y a une contrainte de clé secondaire reliant Ligne.id_point_depart et Ligne.id_point_arrivé à Point.id via des REFERENCES lors de la création des tables.

    Des index sont placées sur Ligne.id_point_depart et Ligne.id_point_arrivé.

    Tout se passe bien jusqu'à la suppression d'un point, où je procède de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DELETE FROM Ligne WHERE id_point_depart = 2000 OR id_point_arrivé = 2000; -- très rapide à s'exécuter
    DELETE FROM Point WHERE id = 2000; -- très très long à s'exécuter
    En cause selon moi, la contrainte d'intégrité qui doit faire une espèce de "NOT IN" ou "NOT EXISTS" sur la table Ligne avant d'accorder ou non le retrait du point en question.

    Du coup c'est normal que ça prenne du temps et je cherche un moyen de dire "sur ce coup là je gère, tu s'occupes de rien je s'occupe de tout" histoire de gagner du temps.

    Ma première idée est de désactiver cette contrainte avant traitement et de la réactiver après traitement. Mais deux questions se posent :

    1) Est-il possible de désactiver / activer ou faut-il faire un DROP / CREATE ?
    2) A la réactivation / création, logiquement la contrainte va faire toutes les vérifications nécessaires sur l'intégrité avant de valider sa création n'est-ce pas ? Et au final ça fera pire que mieux en termes de temps.

    Avec du recul, je me dis que tôt ou tard ces contrôles de cohérences devront s'effectuer, justement pour la garantir, et donc une consommation de temps nécessaire en conséquence.

    Y a-t-il une procédure sémantique standard à employer dans ce genre de situation ou dois-je me dire que les choses prennent du temps, c'est comme ça on y peut rien ?

    J'ai préféré vous consulter avant de m'engager dans ces modifications, donc je n'ai pas encore testé l'idée

    Merci beaucoup,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faut regarder sur quoi portent les index (s'il n'y en a pas c'est pour ça que c'est lent) et utiliser EXPLAIN ANALYZE pour voir à quoi le temps d'exécution est passé.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Désactiver une contrainte est stupide, peu performant et à très haut risque :
    1) peut performant : lorsque vous la remettrez il faudra à nouveau tout vérifier... cela peut être beaucoup plus couteux que de vérifier le delta...
    2) haut risque : n'oubliez jamais qu'une base de données est utilisés par de nombreuses personnes simultanément. Si vous désactivez une contrainte il y a fort à parier que quelqu'un puisse rentrer des données non qualifiées à ce moment. Vous ne pourrez donc plus remettre la contrainte !
    3) stupide : quel intérêt de mettre des contraintes si c'est pour les retirer même temporairement ?

    La première des choses à se poser est que si votre requête n'est pas rapide, c'est sans doute due à une indexation inadéquate. En dépits de quelques écrits d'imbéciles, les index accélèrent aussi les commande de mise à jour INSERT, UPDATE, DELETE !

    Enfin, il est possible de suspendre temporairement une contrainte, mais ce pour des raisons logiques (pas pour accélérer un traitement). C'est le principe de déférence des contraintes. Voir ce que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p6...t_deferabilite

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/07/2011, 16h49
  2. Une Contrainte d'intégrité
    Par THOMAS Patrice dans le forum SQL
    Réponses: 1
    Dernier message: 28/05/2010, 10h58
  3. Enlever une contrainte d'intégrité
    Par sliderman dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 18/03/2008, 11h41
  4. Réponses: 4
    Dernier message: 15/02/2008, 15h24
  5. Modifier une contrainte d'intégrité sur un champ
    Par muadhib dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/11/2007, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo