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

Affichage des résultats du sondage: Les deadlock :

Votants
7. Vous ne pouvez pas participer à ce sondage.
  • Vous ne vous en préoccupez pas du tout

    0 0%
  • Vous faite un minimum pour les prévenir

    2 28,57%
  • Vous y faite très attention

    4 57,14%
  • Vous les maîtriser à 100%

    1 14,29%
Développement SQL Server Discussion :

Quelles sont vos habitudes pour éviter les situations de deadlock ?


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut Quelles sont vos habitudes pour éviter les situations de deadlock ?
    Bonjour,

    J'aimerais si vous me le permettez, faire un tour de table sur nos habitudes respectives pour prévenir ou limiter les scénarios de deadlock.

    Avez-vous des stratégies particulière et à quel point les jugez-vous efficaces ?
    Mettez-vous en place certains mécanismes et/ou au contraire évitez-vous certains mécanismes ?

    Merci de nous faire part de vos expériences sur le sujet.
    Most Valued Pas mvp

  2. #2
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Bonjour,
    Voici ce que je fais ou j'ai vu faire. Pas forcement les bonnes solutions :
    Je mets des with(NOLOCK) dans les select lorsque c'est faisable
    J'ai vu une instance en read commited snapshot

    Mais sinon le mieux est de limiter au maximum les IO pour limiter les locks.
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  3. #3
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    1. Une transaction ne doit pas etre longue
    2. Bien considerer le niveau d'isolation necessaire
    3. Utiliser un pool de connexion
    4. Acceder aux tables dans le meme ordre dans toutes les procedures
    5. Ne retourner que les donnees necessaires a ta couche busness
    6. Considerer la pagination des donnees
    7. Considerer l'utilisation d'un datareader versus un dataset
    8. ......Et la liste est longue....

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par WOLO Laurent Voir le message
    Acceder aux tables dans le meme ordre dans toutes les procedures
    Ça me semble difficile, surtout si on utilise des relations (Foreign Key) qui implique des suppressions "en cascade" faites dans un ordre de table inverse à celui des insertions.

    Mais peut-être devrions nous éviter un maximum les FK ?
    Je pose sincèrement la question.

    Citation Envoyé par WOLO Laurent Voir le message
    Considerer la pagination des donnees
    Tu parles de ranking (row_number, ect.) ?
    Most Valued Pas mvp

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Mais peut-être devrions nous éviter un maximum les FK ?
    Je pose sincèrement la question.
    Ce serait bien pire...
    • sans FK, votre base serait polluée par des données fausses et il faudrait faire des requêtes plus complexes donc plus couteuses pour éradiquer les données polluantes.
    • De plus SQL Server sait faire de l'optimisation sémantique et utilise les contraintes CHECK et FK pour simplifier et optimiser les plans de requêtes, notamment lorsque l'on fait appel à des vues complexes.


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

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Ce serait bien pire...
    • sans FK, votre base serait polluée par des données fausses et il faudrait faire des requêtes plus complexes donc plus couteuses pour éradiquer les données polluantes.
    • De plus SQL Server sait faire de l'optimisation sémantique et utilise les contraintes CHECK et FK pour simplifier et optimiser les plans de requêtes, notamment lorsque l'on fait appel à des vues complexes.


    A +
    Vous êtes certains qu'il y a un gain de performance quand des FK sont employées ? Et de quel ordre ?

    Ce qui me gène dans les FK est qu'il faut faire la plupart des opérations DML en cascade et cela alourdit les transactions et donc augmente les scénarios de deadlock (sans compter que TRIGGER et CASCADE n'aiment pas faire ménage).
    Sans FK, on peut par exemple postposer la suppression d'un élément qui aurait perdu un de ses parents.

    Et avec des indexes établis sur les champs qui auraient composé une FK, il n'y a pas de problème de performance (d'ailleurs dans la plupart des cas où des FK sont employés, de tels indexes sont déjà utiles).
    Most Valued Pas mvp

  7. #7
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Vous êtes certains qu'il y a un gain de performance quand des FK sont employées ? Et de quel ordre ?
    Les FK ne ralentissent pas les performances, elles permettent de renforcer les contraintes et donc la validite des tes donnees. Il faut donc connaitre les bonnes pratiques :
    1. Desactiver les contraintes de clef etrangere et les index associes lors des bulk insert !
    2. Garder les transactions le plus courts possibles.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Pour ma part voici ce que j'ai l'habitude de faire :

    J'essaie de rendre mes queries les plus rapides possibles.
    Je porte une attention particulière aux indexes.

    Il est très rare que j'utilise des hints du genre NOLOCK ou des isolations READ UNCOMITED.

    En gros, je table sur la faible probabilité que des deadlock arrivent puisque les transactions sont rapides (mais pas forcément courtes/simples) grâce à des structures pensées pour et aussi sur l’aptitude de SQL Server à prendre des locks pertinents à l'aide des indexes.

    --

    Je pense qu'à l'avenir je vais un peu plus faire de NOLOCK/READ UNCOMITED ainsi que du data-warehousing.
    Je vais aussi arrêter de systématiquement définir des FK afin de ne pas contraindre SQL Server à devoir répercuter en temps réel et sur un nombre importants de tables certaines opérations.
    Entre autres choses...
    Most Valued Pas mvp

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Vous êtes certains qu'il y a un gain de performance quand des FK sont employées ? Et de quel ordre ?
    Il suffisait de venir aux SQL Days en décembre 2011 chez MS pour voir ma présentation concernant les contraintes et les performances... http://www.microsoft.com/fr-fr/showc...2-8fe0100a9068[/QUOTE]

    Ce qui me gène dans les FK est qu'il faut faire la plupart des opérations DML en cascade et cela alourdit les transactions et donc augmente les scénarios de deadlock (sans compter que TRIGGER et CASCADE n'aiment pas faire ménage).[/QUOTE]
    L'utilisation du mode cascade est à proscrire, sauf sur de très petites bases. Préférez les modes SET NULL et SET DEFAULT et réalisez des batch de nettoyage aux heures creuses... A lire : http://blog.developpez.com/sqlpro/p8...plexes-dans-l/
    Sans FK, on peut par exemple postposer la suppression d'un élément qui aurait perdu un de ses parents.
    C'est généralement comme cela que l'on arrive avec des bases corrompues ! Lorsque je fais des audit, chaque fois qu'il n'y a pas de FK je trouve des lignes orphelines. Depuis plus de 10 ans, aucune exception....

    Et avec des indexes établis sur les champs qui auraient composé une FK, il n'y a pas de problème de performance (d'ailleurs dans la plupart des cas où des FK sont employés, de tels indexes sont déjà utiles).
    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/ * * * * *

  10. #10
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Serje,

    S'il te plait, les clef etrangeres sont la pour renforcer l'integrite referentielle qui est d'une utilite qui ne va pas faire l'objet d'une discussion :

    Retiens que lors que tu as une base de donnees OLTP, tu as besoin de poser des contraintes d'integrites fortes. En outre pour une base de donnees OLAP, vu que les modifications sont presque rare, vous avez besoins d'etudier les indexes afin d'accelerer les temps de reponse de vos select. Pendant la population de votre base, je recommanderais de desactiver les contraintes et de supprimer les index !

    Maintenant tout ceci doit etre etudie au cas par cas, c'est juste un guideliness.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  11. #11
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Les contraintes de clé étrangères sont en effet utile et je pense que l'on a pas forcément besoin de revenir dessus. Je prendrai pour exemple les tables d'ERP avec lesquels j'ai pu travailler (notamment sur l'AS400) et qui ne possèdaient aucune contrainte d'intégrité ... Résultat de l'histoire, qualité de données médiocre ... nettoyage de données à faire dans 99% des cas ...

    De plus je rejoins SQL Pro quant à l'utilisation des contraintes d'intégrité pour les performances. L'optimiseur de requête sait qu'il peut avoir confiance sur la qualité des données assurées par celles-ci et peut en tirer parti lors de la création de plan d'exécution.

    ++

  12. #12
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Effectivement, l'utilité des contraintes de clé étrangère n'est pas à discuter.
    En revanche il est nécessaire pour toutes les contraintes qu'elles aient été vérifiées.

    En effet, dans le cas où l'on créée une contrainte avec la clause NO CHECK, l'optimiseur n'en tient pas compte.
    C'est l'objet du billet que j'ai publié à ce sujet.

    On notera au passage que les contraintes CHECK sont compilées : c'est ce que montre, en outre, la colonne objtype de la DMV sys.dm_exec_cached_plans.

    @++

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    À partir du moment où le comportement que vous donnez à la/les colonne(s) qui font référence à une ligne d'une autre table est ON DELETE SET NULL/DEFAULT, vous vous retrouvez déjà dans une situation dans laquelle vous avez des lignes sans parent réel et dans laquelle vous devrez penser à des suppressions ultérieures.
    Dans cette configuration (je ne vous apprendrai rien), une suppression dans la tablé référée cause immédiatement une MAJ dans la table.
    Par ailleurs dans cette situation, vous ne pouvez pas définir une contrainte d'unicité sur ces colonnes (ce qui n'est pas fréquemment utile mais peut l'être).
    Néanmoins dans cette situation, vous pouvez faire vos suppressions sans devoir vérifier l'existence de la ligné référée (ce qui resterait rapide mais pê plus bloquant).

    Pour résumé (et au risque d'électrifier certaines des hypothèses dans lesquelles vous avez foi) :
    Si vous ne supprimer pas en cascade (et par corolaire si vos suppressions sont différés), il y a de nombreux avantages à ne pas définir les contraintes FK.
    L'avantage principale à retenir reste évidement la réduction des impacts immédiat des suppressions.
    Et le désavantage principale est évidemment qu'il faille connaître la relation (qui n'est plus explicite) et à cet effet peut-être trouver une nomenclature pour la reconnaître (créer des index préfixeé par FKIDX_ par exemple ?).
    Most Valued Pas mvp

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Ce que j'ai dit ne suscite pas bcp de réactions ^^

    Soit vous vous dites "MER IL EST FOU", soit "Si c'était vrai, ça se saurait".

    Pourtant je suis convaincu de l'intérêt de mon idée et (puisque, je ne vous demande pas d'être d'accord avec) j'aimerais que vous m'indiquiez quelles problèmes, selon vous, je négligerais/sous-estimerais.
    Si je fais fausse route, j'ai besoin d'avis pertinents pour le réaliser.
    Most Valued Pas mvp

  15. #15
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    À partir du moment où le comportement que vous donnez à la/les colonne(s) qui font référence à une ligne d'une autre table est ON DELETE SET NULL/DEFAULT, vous vous retrouvez déjà dans une situation dans laquelle vous avez des lignes sans parent réel et dans laquelle vous devrez penser à des suppressions ultérieures.
    Sauf que ces lignes sont immédiatement identifiables, à NULL. Pas du tout la même chose que pointer vers une valeur qui n'existe plus.

  16. #16
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

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

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    À partir du moment où le comportement que vous donnez à la/les colonne(s) qui font référence à une ligne d'une autre table est ON DELETE SET NULL/DEFAULT, vous vous retrouvez déjà dans une situation dans laquelle vous avez des lignes sans parent réel et dans laquelle vous devrez penser à des suppressions ultérieures.
    Comme le dit Rei Ichido, cela concerne un nombre de lignes restreint et ciblé, les lignes à supprimer par la suite.
    Vous pourriez aussi définir un DEFAULT comme étant une valeur préchoisie et existant dans la table parent référant une ligne "A Supprimer" afin de ne pas avoir de lignes orphelines qui se baladent.

    Citation Envoyé par Sergejack Voir le message
    Par ailleurs dans cette situation, vous ne pouvez pas définir une contrainte d'unicité sur ces colonnes (ce qui n'est pas fréquemment utile mais peut l'être).
    Si, avec un index filtré.

    Citation Envoyé par Sergejack Voir le message
    Et le désavantage principale est évidemment qu'il faille connaître la relation (qui n'est plus explicite) et à cet effet peut-être trouver une nomenclature pour la reconnaître (créer des index préfixeé par FKIDX_ par exemple ?).
    Et surtout que vous mettez en jeu l'intégrité de vos données.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/02/2013, 15h09
  2. Quelles sont vos raisons pour migrer vers Windows 7 ?
    Par shawn12 dans le forum Windows 7
    Réponses: 44
    Dernier message: 27/10/2009, 14h02
  3. Quelles sont vos raisons pour migrer vers Windows 7 ?
    Par shawn12 dans le forum Actualités
    Réponses: 0
    Dernier message: 14/08/2009, 15h32
  4. Quelle fonction mysql ? pour éviter les carambolages
    Par Dendrite dans le forum Débuter
    Réponses: 4
    Dernier message: 08/03/2009, 18h22
  5. Réponses: 2
    Dernier message: 28/06/2006, 08h53

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