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

Langage SQL Discussion :

Optimisation de requête


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Par défaut Optimisation de requête
    Bonjour à tous,

    Dans le cadre d'un projet au boulot, je suis amené à excuter des requetes SQL executer sur une base SQL Server 2008 contenant des clause "UNION". Je me pose la question de l'optimisation de celles-ci. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT CountryName, IdCountry FROM TBLCOUNTRY WHERE VISIBLE = 0 
    UNION 
    SELECT CountryName, IdCountry FROM TBLCOUNTRY WHERE VISIBLE <> 0 AND COUNTRYNAME = 'FRANCE' 
    UNION 
    SELECT CountryName, IdCountry FROM tblCountry WHERE IdCountry = '3' 
    UNION 
    SELECT tblCountry.CountryName, tblCountry.IdCountry FROM         tblAuthorizedCountries INNER JOIN  tblCountry ON tblAuthorizedCountries.CountryID = tblCountry.IdCountry WHERE     (tblAuthorizedCountries.UserID = 'MonUserID')
    Je suis vraiment pas certain que cette requete soit optimisée, mais je vois pas comment l'améliorer.

    L'un de vous peut-il m'aiguiller ?

    Merci d'avance.

    DeWaRs

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 561
    Par défaut
    Bonjour,
    On peut faire sauter au moins 2 unions, peut-être tous:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT distinct CountryName, IdCountry
    FROM TBLCOUNTRY 
    left outer join tblAuthorizedCountries on tblAuthorizedCountries.CountryID = tblCountry.IdCountry 
    WHERE (VISIBLE = 0 ) or (VISIBLE <> 0 AND COUNTRYNAME = 'FRANCE' ) or  IdCountry = '3' or (tblAuthorizedCountries.UserID = 'MonUserID')

    A tester quand même, j'ai un doute sur la dernière condition.

    Tatayo.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui mais justement, c'est dans ce genre de cas qu'UNION est plus performant qu'une succession de OR, surtout si des index sont bien positionnés pour chaque requête utilisée dans le UNION.

  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
    22 039
    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 : 22 039
    Billets dans le blog
    6
    Par défaut
    Mieux vaut l'UNION ALL !

    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 Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Oui mais justement, c'est dans ce genre de cas qu'UNION est plus performant qu'une succession de OR, surtout si des index sont bien positionnés pour chaque requête utilisée dans le UNION.

    Salut,

    La question est bien là, et sans réponse sur les indexes, impossible de répondre.
    S'il n'y a pas d'index, la requête OR risque d'être meilleure (au moins sur les 3 premières requêtes), car il y aura un seul scan de la table.

    A noter que sous Oracle, la requête OR pourrait être justement décomposée par l'optimiseur en UNION ALL : c'est l'opération de concaténation. Mais je ne sais pas si SQL Serveur sait faire ça

    http://docs.oracle.com/cd/B10500_01/...ps.htm#1004763

    [EDIT]
    Au passage, je pense que sur ce cas concret, l'optimisation ne doit pas être un problème majeur, vu que la table tblcountry, sauf à rencenser tous les pays de l'univers, devrait être plutôt ridicule en terme de taille

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Encore une note supplémentaire pour SQLPro : UNION ALL seulement si on souhaite conserver les doublons, ce qui n'est pas sûr du tout.

    Or ici, il y a un potentiel de doublons puisque les filtres des requêtes 1 et 2 ne sont pas exclusives avec les filtres des deux dernières requêtes (sauf logique applicative cachée).

  7. #7
    Membre éclairé Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Par défaut
    Merci de vos réponses, content de voir que je n'était pas trop dans le faux

    Je ne veux effectivement pas de doublon, donc je vais garder mon UNION. Concernant les indexes, il n'y en a pas car effectivement, les tables concernées sont très petites.

    Merci encore.

    DeWaRs

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 039
    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 : 22 039
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par pacmann Voir le message
    A noter que sous Oracle, la requête OR pourrait être justement décomposée par l'optimiseur en UNION ALL : c'est l'opération de concaténation. Mais je ne sais pas si SQL Serveur sait faire ça
    Itou sur SQL Server, en fonction des cardinalités....

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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