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

Administration SQL Server Discussion :

Grand nombre de FK désactivées


Sujet :

Administration SQL Server

  1. #1
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut Grand nombre de FK désactivées
    Bonjour a Tous

    En lancant la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TSQL SELECT *
    from sys.foreign_keys
    WHERE is_not_trusted = 1
    Je me suis apercu que j'avais un grand nombre de qui ne sont pas confiance (une centaine)

    Je voulais juste savoir quelle etait l'impact sur les performances et si vous avez des exemples concrets sur les performances que cela peut engendrer ?

    merci a vous

  2. #2
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    oulalalala la catastrophe!
    tu parles de performance... là c'est déjà très très mauvais. mais le gros du problème n'est pas là.
    elle est où la cohérence de tes données si tu check pas les contraintes?
    le résultat de ta requete doit être 0.
    c'est sur une base en production?

    Cordialement,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  3. #3
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut
    Merci de ton retour
    oui c'est sur une BDD de production
    Tu as un exemple concret a ce niveau la ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 758
    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 758
    Points : 52 535
    Points
    52 535
    Billets dans le blog
    5
    Par défaut
    Si vous utilisez des insertions massive de fichiers via SSIS, bcp.exe ou BULK INSERT, les FK sont désactivées par défaut. Il convient, soit de les réactiver après chaque lot d’insertion, soit de forcer la vérification des FK au cours de l'insertion.

    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/ * * * * *

  5. #5
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    olivtone,
    pourrais-tu passer cette requete?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    from sys.foreign_keys
    WHERE is_disabled= 1
    cordialement,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  6. #6
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut
    desole du retard

    cela me retourne une dizaine de lignes

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Essaie de lancer, pour chaque ligne retournée :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    -- Enable the constraint
    ALTER TABLE MyTable 
    WITH CHECK CHECK CONSTRAINT MyConstraint
    GO

    Attention cependant : ça risque de rammer un moment s'il y a du volume...

    Sinon, le problème de désactiver les contraintes, c'est qu'un traitement qui déconne (fichier d'import pas à jour, transaction mal gérée dans le programme, etc.) et tu te retrouves avec des lignes orphelines.
    Ceci a deux conséquences notables :
    - Corruption des données (à quoi rattacher les lignes orphelines ?)
    - Performances (à vérifier, mais pour moi, l'index lié aux FK sera inutilisable, puisque incomplet)
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut
    ok donc si j'ai bien compris il n'y a aucun interet a laisser les FK en no_trusted

  9. #9
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    Bon j'avais été trop vite pour répondre l'autre jour.
    Tu m'as induit en erreur avec le titre
    [2014] Grand nombre de FK désactivées
    j'ai répondu en me disant que tu avais des centaines de FK Désactivées
    c'est pour ca que quand j'ai compris que tu parlais de is_not_trusted et non pas is_disabled, je t'ai demandé de repasser la requête pour is_disabled
    Si vous utilisez des insertions massive de fichiers via SSIS, bcp.exe ou BULK INSERT, les FK sont désactivées par défaut. Il convient, soit de les réactiver après chaque lot d’insertion, soit de forcer la vérification des FK au cours de l'insertion.
    Ce n'est pas totalement vrai. c'est même plutôt faux
    Alors je ne me souviens plus comment c'était avant et je n'ai pas d'autres versions à disposition aujourd'hui mais en 2014 les composants bulkinsert et oledb destination font la vérification des clés par défaut
    Par contre, le composant destination ado.net lui ne fait pas la vérification par défaut. il faut décocher "insertion en bloc si possible"
    je n'ai pas vérifié pour BCP.exe

    Alors par contre, ce qui n'est pas vrai du tout, c'est que les clés restent désactivées après le traitement (toujours testé en 2014).
    tu as 2 propriétés
    1. Is_not_trusted
    2. Is_disabled


    Je ne sais pas techniquement comment ca se déroule. mais je présume que lorsqu'on est dans le cas où on ne vérifie pas les clés, le composant ou la commande qui lance l'insert désactive les clés avant traitement et les réactive après.
    Toujours est il que la clé étrangère est bel bien active à la fin du traitement.
    Par contre, du fait d'avoir insérer des lignes sans vérification, la propriété is_not_trusted passe à 1.
    Pour la refaire passer à 0, il faut relancer un check comme stringbuilder l'a fait par exemple
    en bonus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT name, 
           type_desc, 
           is_disabled, 
    	   is_not_trusted, 
    	   ' ALTER TABLE ' + object_name(parent_object_id) + ' WITH CHECK CHECK CONSTRAINT ' + name as 'Requête pour vérifier la contrainte'
    FROM            sys.foreign_keys
    where is_not_trusted = 1
    la dernière colonnes te donne les requêtes à exécuter. il n'y a qu'à copier/coller, vérifier, exécuter.

    rassurez-vous, les clés primaires sont vérifiées
    cela me retourne une dizaine de lignes
    on parlait des FK disabled.
    Bon la par contre c'est pas bien. Vérifie l'intégrité et essaye de les réactiver. mais je crains que tu aies des incohérences.
    Cherche les raisons aussi pour lesquelles ces FK sont désactivées! en règle générale ce sont les développeurs qui désactivent ces clés parce que ca les fait chier de devoir respecter les contraintes pendant qu'il font des dévellopement et/ou des tests. les pires oublient de les réactiver(j'ai déjà vu une base en prod ou toutes les clés étaient désactivées...).
    Si ce ne sont pas les développeurs faut voir si t'as pas un script qui tourne de manière régulière et qui désactive ces clés.

    Cordialement,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  10. #10
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    - Performances (à vérifier, mais pour moi, l'index lié aux FK sera inutilisable, puisque incomplet)
    Oui tu as tout à fait raison concernant les conséquences négatives sur les performances du fait que les contraintes FK (Foreign Key) ne soient pas dignes de confiance (ie untrusted), mais ceci n'est pas, comme tu le "supposes", lié à l'index incomplet !
    La notion d'"index complet" ou d'"index incomplet" n'existe pas. Un index est soit activé, soit désactivé.
    Le problème de performance inféré par les contraintes FK, qui ne sont pas (ou ne sont plus !) dignes de confiance (untrusted), provient souvent du plan d'exécution, non optimal, produit par l'optimiseur de requête comparé au plan optimal généré par l'optimiseur si les dites contraintes FK étaient dignes de confiance.
    En effet, lorsque les contraintes sont dignes de confiance (trusted), l'optimiseur peut "réécrire" la requête SQL en supprimant certaines jointures internes (INNER JOIN) ou certaines restrictions telles que EXISTS, NOT EXISTS, etc. considérées inutiles (ou plutôt considérées déjà vérifiées puisque induites par la contrainte FK digne de confiance).
    En conclusion, selon que les contraintes FK soient dignes de confiance ou non (trusted vs untrustred), le plan d'exécution généré par l'optimiseur ne sera pas du tout le même. Le plan d'exécution généré par l'optimiseur est bien souvent beaucoup plus performant, plus optimal (Time, CPU, I/O, etc.) lorsque les contraintes sont dignes de confiance (trustud).
    Les contraintes qui ne sont pas dignes de confiance n'apportent aucune plus value et sont même ignorées par l'optimiseur.
    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

Discussions similaires

  1. Vitesse et grand nombre de tuples...
    Par TitiFr dans le forum Bases de données
    Réponses: 9
    Dernier message: 07/07/2005, 14h04
  2. Réponses: 3
    Dernier message: 22/05/2005, 12h59
  3. requete sql sur un grand nombre d enregistrement
    Par marielaure dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/08/2004, 11h53
  4. Traitement d'un grand nombre de champ
    Par k-lendos dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/03/2004, 15h13
  5. Une unité pour gérer des très grands nombres
    Par M.Dlb dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2003, 12h07

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