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

Développement SQL Server Discussion :

Bypass de l'index


Sujet :

Développement SQL Server

  1. #1
    Membre averti Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Points : 355
    Points
    355
    Par défaut Bypass de l'index
    Bonjour,

    J'aimerais savoir si une des règle empirique d'oracle s'applique aussi à SQL Server.

    Dans le cas d'oracle, lorsqu'on va chercher plus de 20% des données d'une table, il est conseillé de forcer le sgbd à faire un full table scan au lieu d'un index seek. On peut y arriver en ajoutant un +0 au select sur la clef primaire numérique. Dans certains cas, le sgbd gère cela par lui même et ne s'occupe pas

    Est-il possible, et nécéssaire de faire cela en SQL-Server? Sachant que je ramène l'intégralité de ma table qui contient +/- 1 million de records.

    Merci
    Logic is like the sword -- those who appeal to it, shall perish by it.

  2. #2
    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,

    Dans le cas d'oracle, lorsqu'on va chercher plus de 20% des données d'une table, il est conseillé de forcer le sgbd à faire un full table scan au lieu d'un index seek.
    Est-ce vraiment le cas pour toutes les requêtes ? j'en doute, mais je suis profane sur Oracle ...

    je ramène l'intégralité de ma table qui contient +/- 1 million de records.
    Dans ce cas SQL Server fera un clustered index scan, c'est à dire qu'il lira toute la table.
    Dans 99.99999% des cas, SQL Server fonctionne correctement sous réserve que la maintenance des statistiques soit faite proprement.

    En effet j'ai l'impression que lorsqu'une tables est volumineuse et qu'elle subit un grand nombre de changements, alors il est nécessaire de forcer la mise à jour des statistiques.

    Pour vous donner une idée, lorsque je suis arrivé chez mon employeur actuel, il n'y avait aucune maintenance des statistiques, et le CPU était constamment au dessus de 80%, sur une nombre de serveurs que l'on peut compter sur deux mains.
    Depuis le lendemain du forçage du recalcul, l'utilisation du CPU dépasse rarement les 35% sur les serveurs les plus occupés.

    Le fait est que je suis loin d'être le premier à l'avoir fait, et que je ce n'est pas le premier employeur chez qui je dois le faire.
    Il suffit de regarder les résultats retournés par votre moteur de recherche préféré pour s'en rendre compte

    @++

  3. #3
    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
    En effet j'ai l'impression que lorsqu'une tables est volumineuse et qu'elle subit un grand nombre de changements, alors il est nécessaire de forcer la mise à jour des statistiques.
    Normal du fait de l'algorithme de mise à jour auto des statistiques (500 lignes + 20% des données). Tant que ce nombre de changements est inférieure à ce seuil ales statistiques peuvent être obsolètes. De la même manière en mise à jour automatique il se peut également que le taux d'échantillonnage ne soit plus correct. Dans ce cas il faudra désactiver la mise à jour auto et faire des mises à jour en manuel en principe un sample correct.

    ++

  4. #4
    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 elsuket Voir le message
    Bonjour,


    Est-ce vraiment le cas pour toutes les requêtes ? j'en doute, mais je suis profane sur Oracle ...
    Non, évidemment, en particulier dans le cas où l'index permet d'éviter d'accéder à la table.
    De toute façon, c'est le genre de "magouille" qu'il vaut mieux éviter à mon avis. Quitte à vouloir forcer un comportement de l'optimiseur, il vaut mieux utiliser un hint !

  5. #5
    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
    Citation Envoyé par mikedavem
    Normal du fait de l'algorithme de mise à jour auto des statistiques (500 lignes + 20% des données). Tant que ce nombre de changements est inférieure à ce seuil ales statistiques peuvent être obsolètes.
    Tu sais tout comme moi que ce seuil est parfois largement dépassé.
    Je pense que lorsque cela devient trop coûteux, puisque la mise à jour des statistiques est coûteuse en IO et en CPU, SQL Server ne la fait pas, probablement temporairement ...

    Citation Envoyé par Rei Ichido
    De toute façon, c'est le genre de "magouille" qu'il vaut mieux éviter à mon avis. Quitte à vouloir forcer un comportement de l'optimiseur, il vaut mieux utiliser un hint !
    Je suis d'accord avec vous sur la première phrase.
    Pour choisir de forcer le comportement de l'optimiseur, il faut être sûr et certain qu'il n'y a pas d'autre alternative (j'ai toujours un peu de mal à admettre que je dois mettre un indicateur).
    Si les statistiques sont à jour, c'est souvent dû à l'expression de la requête ... ou tout simplement au fait qu'un index qui couvre assez bien celle-ci n'est pas là

    @++

  6. #6
    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
    Citation Envoyé par elsuket Voir le message
    Tu sais tout comme moi que ce seuil est parfois largement dépassé.
    Je pense que lorsque cela devient trop coûteux, puisque la mise à jour des statistiques est coûteuse en IO et en CPU, SQL Server ne la fait pas, probablement temporairement ...
    @++
    Il faut savoir que SQL Server ne met pas à jour de suite les statistiques lorsque ce seuil est atteint. Les statistiques sont simplement invalidées. Elles ne seront mis à jour que lorsque quelqu'un en aurait vraiment besoin. De plus il faute faire le distingo entre l'algorithme de mise à jour de 2000 et les autres versions.

    Pour 2000 le seuil de changement correspond à 20% des lignes modifiées alors que pour 2005 et 2008 c'est 20% des données de la colonne. Cela signifie que si tu as une colonne relativement volatile alors l'invalidation de l'ensemble des statistiques de la table seront rapidement invalidés alors que dans le 2ème cas il faut que ce soit 20% des données de la colonne donc beaucoup mois rapide.

    ++

Discussions similaires

  1. Message 'Duplicate index entry'
    Par Poulou dans le forum Administration
    Réponses: 13
    Dernier message: 04/05/2004, 14h57
  2. Index n'est pas a jour
    Par touhami dans le forum Paradox
    Réponses: 5
    Dernier message: 11/12/2002, 14h47
  3. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 15h11
  4. [Technique] Index, comment font les moteurs de recherche ?
    Par bat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 25/10/2002, 15h41
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15

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