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 :

Optimisation de requête sous SQL Server


Sujet :

Développement SQL Server

  1. #21
    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
    Je rejoins Waldar sur l'index .. Votre critère n'est pas assez discriminant mais je pense que vous vous en êtes vite rendu compte.

    De plus comme vous remontez un nombre important de lignes vous ne pourrez pas couper aux opérations de hash dans vos jointures car c'est la seule méthode efficace lors que de grandes quantités de données sont remontées.

    Peut être gagnerez vous à créer une vue indexée dans votre cas si aucune autre optimisation n'est possible dans votre requête.

    ++

  2. #22
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Je rejoins Waldar sur l'index .. Votre critère n'est pas assez discriminant mais je pense que vous vous en êtes vite rendu compte.
    Et non couvrant... ce qui obligerait le moteur à faire une recherche de clé sur l'index cluster pour retrouver ses petits (colonnes utilisées dans les INNER JOIN notamment).
    C'est de l'ordre du détail mais EDITEUR_TF1_FR_ID est'il NULLABLE?

    En effet vous faites un <> en lieu et place d'un =1...

    Vu que vous avez peu de prédicat... une partition ou une vue indexée pourrait en effet s'imposer...


    Reste à déterminer la différence de temps d’exécution entre les deux requêtes...
    Dans les faits ces deux requêtes vous renvoient'elles le même nombre de lignes?
    Si oui SQL SERVER semble ne pas s'y attendre dans les plans de requêtes.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  3. #23
    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,

    De ce que je viens de collecter, voici la liste des colonnes de la table TF_COMPTE participant aux jointures :

    - AGE_ID : pas trop sélectif
    - PROFESSION_ID : devrait être assez sélectif
    - CIVILITE_ID : pas sélectif
    - SEXE_ID : comme un bit : pas sélectif
    - PRESENCE_ENFANT_ID : probablement pas sélectif
    - ACTIVITE_DE_CONNEXION_SUR_SITE_ID : aucune idée
    - TRANCHE_ANCIENNETE_ID : probablement pas sélectif
    - ACHAT_VAD_ID : aucune idée
    - POSSEDE_IPHONE_ID : comme un bit : pas sélectif

    Ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TF1BDDCiblage.Contact.TF_COMPTE.EDITEUR_TF1_FR_ID<>0
    pour un bit, si la colonne n'est pas NULLable, mettre = 1 !
    Dans tous les cas peut-être qu'un index sur la colonne la plus sélective (c'est à dire celle qui contient le plus de valeurs distinctes) filtré sur EDITEUR_TF1_FR_ID IS NULL OR EDITEUR_TF1_FR_ID = 1 devrait aider.

    Voyez pour cela le billet que je viens de publier

    @++

  4. #24
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    filtré sur EDITEUR_TF1_FR_ID IS NULL OR EDITEUR_TF1_FR_ID = 1 devrait aider.
    Sauf erreur de ma part le compilateur ne l'utilisera pas avec un <>, il faudra le forcer avec un hints...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  5. #25
    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
    Pas si le prédicat de la requête est le même que celui de l'index filtré.

    Mais on peut déjà faire un premier test avec un index non-flitré

    @++

  6. #26
    Candidat au Club
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Je n'ai pas de valeur nulle dans cette colonne.
    J'ai modifié ma condition en =1 et créer un index non cluster dessus.
    Le plan d'exécution l'ignore toujours.
    Idem pour l'index filtré avec la condition =1
    J'ai forcé le passage par l'index avec un hint, mais pas d'amélioration des temps de réponse:-(
    Une autre idée?

    Avec mes remerciements,
    Pitchoonet

  7. #27
    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
    Personnellement je ne pense pas qu'un index ici sera performant vu le peu de sélectivité de votre prédicat. Avoir la méthode préconisée par Elsuket pour l'index filtré mais je n'y crois pas ...

    ++

  8. #28
    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 elsuket Voir le message
    De ce que je viens de collecter, voici la liste des colonnes de la table TF_COMPTE participant aux jointures :

    - AGE_ID : pas trop sélectif
    - PROFESSION_ID : devrait être assez sélectif
    - CIVILITE_ID : pas sélectif
    - SEXE_ID : comme un bit : pas sélectif
    - PRESENCE_ENFANT_ID : probablement pas sélectif
    - ACTIVITE_DE_CONNEXION_SUR_SITE_ID : aucune idée
    - TRANCHE_ANCIENNETE_ID : probablement pas sélectif
    - ACHAT_VAD_ID : aucune idée
    - POSSEDE_IPHONE_ID : comme un bit : pas sélectif
    Je saute dans le topic et me pose la question suivante:
    Est ce que tous les champs ID ci-dessus referencent des tables de dimension ?
    Si c'est le cas, est ce qu'on peut voir la structure de celles-ci ?

  9. #29
    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
    Je n'ai pas de valeur nulle dans cette colonne.
    NULL n'est pas une valeur, c'est un marqueur qui signifie l'absence de valeur.
    D'ailleurs si l'on exécute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF NULL = NULL
    	PRINT 'OK'
    ELSE
    	PRINT 'KO'
    On obtient KO, quel que soit l'opérateur arithmétique.
    Ce qui prouve bien que NULL n'est pas une valeur.

    Ensuite le fait de n'avoir aucune ligne pour laquelle cette colonne n'est pas à NULL ne signifie pas nécessairement que la colonne n'est pas NULLable.

    Pour en être certain :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT		C.is_nullable
    FROM		sys.columns AS C
    INNER JOIN	sys.tables AS T ON C.object_id = T.object_id
    WHERE		T.name = 'maTable'
    AND		C.name = 'maColonne'
    J'ai modifié ma condition en =1 et créer un index non cluster dessus.
    Le plan d'exécution l'ignore toujours.
    Cela n'a aucun intérêt puisqu'un tel index a une sélectivité très faible ...
    Donc il est normal que SQL Server l'ait ignoré.

    Idem pour l'index filtré avec la condition =1
    Quelle est la définition de l'index que vous avez créé ?

    J'ai forcé le passage par l'index avec un hint, mais pas d'amélioration des temps de réponse:-(
    Et de l'activité disque (SET STATISTICS IO ON avant la requête) ?

    Une autre idée ?
    Pouvez-vous exécuter la requête de mon billet pour la table TF_COMPTE et poster le résultat dans un fichier Excel ?

    Il vous faut vectoriser les valeurs en créant un index multi-colonne de sorte qu'il soit aussi sélectif que possible.

    @++

  10. #30
    Candidat au Club
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 3
    Points
    3
    Par défaut A elsuket
    Bonjour,
    Je n'arrive pas à exécuter votre billet.
    Il me semble qu'il manque la déclaration de la variable @table_name.
    D'autre part, dans la première requête il y a une autre variable non déclarée :
    @statistic_name
    Est-ce qu'il faut la remplacer par @stat_name?

    Avec mes remerciements,
    Pitchoonet

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/01/2009, 22h34
  2. Performance d'une requête sous SQL Server 2005
    Par Menoto dans le forum Développement
    Réponses: 4
    Dernier message: 20/03/2008, 09h58
  3. Performance d'une requête sous SQL Server 2005
    Par Menoto dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/03/2008, 09h58
  4. Requête analyse croisée sous SQL SERVER
    Par motus_z dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/02/2006, 16h54
  5. Requêtes analyses croisées sous SQL Server 2000
    Par callo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/09/2005, 19h27

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