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 :

Quelle est la meilleure organisation à utiliser avec une requête récursive


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut Quelle est la meilleure organisation à utiliser avec une requête récursive
    Bonjour,
    J'ai une table de 43 champs dont l'un d'eux met en place un niveau hiérarchique.

    Est-il mieux de faire une vue hiérarchique de base avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH RecursiveQuery AS (
    	SELECT	MonID, MonIDHierarchique, 0 Version
    	  FROM	MaTableHierarchique
    	UNION ALL
    	SELECT	MTH.MonID, MTH.MonIDHerarchique, RQ.Version + 1
    	  FROM	MaTableHirarchique MTH
    			INNER JOIN RecursiveQuery RQ ON RQ.MonID = MTH.MonIDHerarchique)
    SELECT	MonID, MonIDHerarchique, Version
      FROM	RecursiveQuery
    Suivi d'une autre requête/vue pour avoir les autres infos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT	MonID, MonIDHerarchique, Version, Champ1, Champ2, ...
      FROM	MaVueHierarchique MVH
    		INNER JOIN MaTableHierarchique MTH ON MVH.MonID = MTH.MonID
    Ou bien tout mettre directement dans la vue hiérarchique comme ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH RecursiveQuery AS (
    	SELECT	MonID, MonIDHierarchique, 0 Version, Champ1, Champ2, ...
    	  FROM	MaTableHierarchique
    	UNION ALL
    	SELECT	MTH.MonID, MTH.MonIDHerarchique, RQ.Version + 1, MTH.Champ1, MTH.Champ2, ...
    	  FROM	MaTableHirarchique MTH
    			INNER JOIN RecursiveQuery RQ ON RQ.MonID = MTH.MonIDHerarchique)
    SELECT	MonID, MonIDHerarchique, Version, Champ1, Champ2, ...
      FROM	RecursiveQuery
    La première organisation me parait plus légère à écrire mais plus lourde en ressources car ça demande de refaire un lien.
    La seconde organisation me parait un peu plus lourde à écrire mais plus rapide car un lien de moins que la première. Par contre toutes les données sont trimballées et ça c'est peut-être plus lourd.

    Et justement je ne sais pas laquelle de ces 2 organisations est meilleure à utiliser...

    Si vous avez des infos sur les avantages ou inconvénient de l'une ou de l'autre de ces organisations, je suis preneur pour argumenter et arbitrer mon choix...

    Merci

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,
    Citation Envoyé par ypelissier Voir le message
    La première organisation me parait plus légère à écrire mais plus lourde en ressources car ça demande de refaire un lien.
    En effet, cette solution suppose une jointure supplémentaire, avec un plan d'éxécution moins efficace que la deuxième.

    Citation Envoyé par ypelissier Voir le message
    La seconde organisation me parait un peu plus lourde à écrire mais plus rapide car un lien de moins que la première. Par contre toutes les données sont trimballées et ça c'est peut-être plus lourd.
    Non, il faut par contre éviter les select * sur la vue si vous n'avez pas besoin de toutes les colonnes.

    J'opterai donc plutôt pour la deuxième solution :
    Autant SQL n'est pas capable d'éviter la jointure (en fait inutile) de la première solution, autant il est capable de ne pas récupérer le contenu des colonnes présentes dans une vue mais non référencées par une requete sur la vue.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Non, il faut par contre éviter les select * sur la vue si vous n'avez pas besoin de toutes les colonnes.
    Oui j'ai toujours entendu dire qu'il fallait éviter cette construction plus gourmande en ressources car le SGBDR doit en plus aller chercher les champs à prendre. Seul cas, select count(*) et je crois aussi dans un IF EXISTS(SELECT * ...)

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par ypelissier Voir le message
    Seul cas, select count(*) et je crois aussi dans un IF EXISTS(SELECT * ...)
    Dans ces deux cas, l'étoile n'a aucune signification.
    D'ailleurs, dans le second cas, on écrit souvent IF EXISTS(SELECT 1 FROM ...) ou IF EXISTS(SELECT NULL FROM ...) pour bien appuyer le fait que les colonnes retournées par SELECT n'ont aucun intérêt.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 640
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Dans ces deux cas, l'étoile n'a aucune signification.
    D'ailleurs, dans le second cas, on écrit souvent IF EXISTS(SELECT 1 FROM ...) ou IF EXISTS(SELECT NULL FROM ...) pour bien appuyer le fait que les colonnes retournées par SELECT n'ont aucun intérêt.
    Je me permets de corriger, dans le cas d'un test d'existence, même avec un select * (if exists (select * from ....)), la requête ne transporte aucune donnée.
    Il n'y a donc pas de colonne "retournée" mais seulement un booléen vrai/faux suite à une requete de ce type

    Cela dit, je suis moi même adepte de la syntaxe if exists(select 1 from...)) qui a le mérite de lever toute ambiguïté

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    J'aurais en effet du placer le termes "retournées" entre guillemets ou en italiques pour bien marquer que c'était une clause de style.

    Je me souviens avoir rencontré, dans un passé ancien (suffisament pour que je ne me souvienne plus de quel produit il s'agissait), un SGBD qui réclamait que les colonnes et expressions utilsées dans la clause WHERE ou HAVING d'une sous-requête EXISTS soient déclarées dans la clause SELECT de celle-ci.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/06/2008, 16h47
  2. Quelle est la meilleure maniere de faire une count?
    Par farenheiit dans le forum Administration
    Réponses: 20
    Dernier message: 16/11/2007, 16h45
  3. Réponses: 6
    Dernier message: 17/05/2007, 13h36
  4. Réponses: 2
    Dernier message: 19/03/2007, 16h41
  5. Réponses: 3
    Dernier message: 09/05/2006, 15h16

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