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

MS SQL Server Discussion :

[SQL2K][TSQL] Variable contre constante dans requête imbriquée


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut [SQL2K][TSQL] Variable contre constante dans requête imbriquée
    Bonjour,

    J'ai remarqué une chose étrange en essayant d'optimiser une de mes requêtes. Dans une requête imbriquée je fais un test sur un champ pour ne sélectionner que les lignes qui ont l'ID qui m'intéresse.
    Normalement j'utilise une variable pour stocker l'ID que je veux tester (qui correspond en fait à une constante), et j'utilise donc cette variable dans ma requête.

    Quand j'exécute cette requête, le temps d'exécution est d'environ 9 secondes.
    Maintenant si je remplace la variable de ma requête directement par la valeur, le temps d'éxécution chute à 1 seconde !!!

    Et en regardant le plan d'éxécution, je constate que le schéma est très différent entre les deux requêtes.
    Dans la version 'variable', les tuples sont filtrés en fait beaucoup plus tard que dans la version 'valeur' où ils sont filtrés quasiment au début. Et vue le nombre d'enregistrement que j'ai dans mes tables, la différence de temps peut s'expliquer ainsi.

    Je précise que cette variable sert à filtrer les lignes de la table elle même, tandis que dans cette même requête j'utilise une autre variable pour filtrer les lignes d'une jointure, et là ça n'a pas d'influence.

    Dans la requête ci-dessous, la variable @A est celle qui n'influence pas.
    C'est la variable @B que je change avec sa valeur pour obtenir un temps de 1 seconde.


    Donc en fait ma question est:

    Mais pourquoi donc ?
    et
    N'y aurait-il pas moyen d'utiliser quand même la variable plutôt que la valeur, tout en ayant un temps d'éxécution record ?


    Voilà la requête (simplifiée) que j'utilise:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    	SELECT H3.*
    	FROM
    	(
    		SELECT H2.*
    		FROM
    		(
    			SELECT H.* 
    			FROM 
    				VUE H
    				JOIN TABLE T2 ON ...			
    
    			WHERE T2.ID = @A
    			AND H.PROD_ELT_ID = @B
    		) AS G 
    		JOIN HISTO H2 ON ...
    						AND ...
    						AND ...
    	) AS P
    	JOIN HISTO H3 ON ...
    	JOIN T_CAT ON ...
    	JOIN (HISTO A JOIN RELATION ON ...)
    		ON ...
    			AND ...
    			AND ...
    	JOIN T_CST ON ...
    	
    	WHERE ...

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 918
    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 918
    Points : 51 703
    Points
    51 703
    Billets dans le blog
    6
    Par défaut
    Il est impossible de vous répondre sans le code COMPLET de votre requête ainsi que les définitions des tables en jeu (sous forme d'ordre SQL) et des index:
    CREATE TABLE ...
    CREATE INDEX ...
    En cela vous vous conformerez à la charte de postage !
    http://www.developpez.net/forums/showthread.php?t=96701

    A +

  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
    Quel est le type de ta variable ?
    Et quelle est la valeur que tu remplaces ?

  4. #4
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je m'en doutais bien mais je ne peux pas me permettre de faire cela.

    Mais peut être que d'autre personnes ont rencontré le même phénomène ou peut être il y a t-il une réponse logique d'après le fonctionnement de SQL Server. En fait je cherche surtout à comprendre pourquoi ça fonctionne de cette manière mais sinon ça me gène pas plus que ça.

    Edit:
    Ma variable est un int et je remplace @B par un int donc ça donne quelque chose du genre:
    AND H.PROD_ELT_ID = 1000

Discussions similaires

  1. Syntaxe Variable de session dans requête SQL
    Par dekalima dans le forum Langage
    Réponses: 1
    Dernier message: 07/01/2011, 12h35
  2. Problème dans requête imbriquée
    Par stefsas dans le forum Langage SQL
    Réponses: 8
    Dernier message: 12/03/2010, 02h40
  3. Variable de contexte dans requête SQL
    Par lylau dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 16/04/2009, 15h42
  4. problème d'extraction de date dans requêtes imbriquées
    Par tomguiss dans le forum Requêtes
    Réponses: 1
    Dernier message: 29/12/2007, 12h10
  5. Réponses: 8
    Dernier message: 09/07/2007, 11h18

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