OVH Cloud OVH Cloud

Comportement bisard

3 réponses
Avatar
Nathan NAU
Bonjour

j'ai un probleme que je ne comprend vraiment pas.
J'ai un requette de la forme :
SELECT * FROM maTable
WHERE
intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent
AND
intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot
AND
intNiveau >= @intNiveauRoot

qui s'execute instantanement et retourne 1 ligne

Mais avec la requette :
SELECT * FROM maTable
WHERE
intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent
AND
intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot

qui n'est pas moins restrictive, et retourne bien 1 seul enregistrement,
mais elle prend 3 minutes pour s'executer.

dans ma table j'ai les index :
-pour la cle primaires
-sur intBordGauche
-sur intBordDroit
-sur intNiveau
-et un sur intBordGauche , intBordDroit et intNiveau

Avais vous une idee pour de savoir d'ou vient le probleme ?

Nathan

3 réponses

Avatar
Patrice
Bonjour,

Commencer par voir le plan d'exécution :
http://support.microsoft.com/kb/243589/FR/

Par exemple il se pourrait que le critère sur le niveau soit bien plus
restrictifs que les critères sur bordgauche/borddroit pris séparemment (root
pour parent pour gauche, parent puis root pour droit ?)

--
Patrice


"Nathan NAU" a écrit dans le message de news:
%
Bonjour

j'ai un probleme que je ne comprend vraiment pas.
J'ai un requette de la forme :
SELECT * FROM maTable
WHERE
intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent
AND
intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot
AND
intNiveau >= @intNiveauRoot

qui s'execute instantanement et retourne 1 ligne

Mais avec la requette :
SELECT * FROM maTable
WHERE
intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent
AND
intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot

qui n'est pas moins restrictive, et retourne bien 1 seul enregistrement,
mais elle prend 3 minutes pour s'executer.

dans ma table j'ai les index :
-pour la cle primaires
-sur intBordGauche
-sur intBordDroit
-sur intNiveau
-et un sur intBordGauche , intBordDroit et intNiveau

Avais vous une idee pour de savoir d'ou vient le probleme ?

Nathan



Avatar
Nathan NAU
Je dirait que le niveau est moin restrictif que le reste car avec :
SELECT COUNT(*) FROM maTable
WHERE
intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent;

il renvoir 1 , instantanement
avec :
SELECT COUNT(*) FROM maTable
WHERE
intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot

il renvoir 1 , instantanement
et avec :
SELECT COUNT(*) FROM maTable
WHERE
intNiveau >= @intNiveauRoot

il renvoir 4139628 , en 30 seconde

Je regarde le lien

Merci


"Patrice" a écrit dans le message de news:
O%
Bonjour,

Commencer par voir le plan d'exécution :
http://support.microsoft.com/kb/243589/FR/

Par exemple il se pourrait que le critère sur le niveau soit bien plus
restrictifs que les critères sur bordgauche/borddroit pris séparemment
(root pour parent pour gauche, parent puis root pour droit ?)

--
Patrice


"Nathan NAU" a écrit dans le message de news:
%
Bonjour

j'ai un probleme que je ne comprend vraiment pas.
J'ai un requette de la forme :
SELECT * FROM maTable
WHERE
intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent
AND
intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot
AND
intNiveau >= @intNiveauRoot

qui s'execute instantanement et retourne 1 ligne

Mais avec la requette :
SELECT * FROM maTable
WHERE
intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent
AND
intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot

qui n'est pas moins restrictive, et retourne bien 1 seul enregistrement,
mais elle prend 3 minutes pour s'executer.

dans ma table j'ai les index :
-pour la cle primaires
-sur intBordGauche
-sur intBordDroit
-sur intNiveau
-et un sur intBordGauche , intBordDroit et intNiveau

Avais vous une idee pour de savoir d'ou vient le probleme ?

Nathan







Avatar
Christian Robert
Il serait aussi interessant de savoir quel index est l'index ordonné...

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD
MCTS & MCITP SQL Server 2005


"Nathan NAU" a écrit :

Je dirait que le niveau est moin restrictif que le reste car avec :
SELECT COUNT(*) FROM maTable
WHERE
intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent;

il renvoir 1 , instantanement
avec :
SELECT COUNT(*) FROM maTable
WHERE
intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot

il renvoir 1 , instantanement
et avec :
SELECT COUNT(*) FROM maTable
WHERE
intNiveau >= @intNiveauRoot

il renvoir 4139628 , en 30 seconde

Je regarde le lien

Merci


"Patrice" a écrit dans le message de news:
O%
> Bonjour,
>
> Commencer par voir le plan d'exécution :
> http://support.microsoft.com/kb/243589/FR/
>
> Par exemple il se pourrait que le critère sur le niveau soit bien plus
> restrictifs que les critères sur bordgauche/borddroit pris séparemment
> (root pour parent pour gauche, parent puis root pour droit ?)
>
> --
> Patrice
>
>
> "Nathan NAU" a écrit dans le message de news:
> %
>> Bonjour
>>
>> j'ai un probleme que je ne comprend vraiment pas.
>> J'ai un requette de la forme :
>> SELECT * FROM maTable
>> WHERE
>> intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent
>> AND
>> intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot
>> AND
>> intNiveau >= @intNiveauRoot
>>
>> qui s'execute instantanement et retourne 1 ligne
>>
>> Mais avec la requette :
>> SELECT * FROM maTable
>> WHERE
>> intBordGauche BETWEEN @intBordGaucheRoot AND @intBordGaucheParent
>> AND
>> intBordDroit BETWEEN @intBordDroitParent AND @intBordDroitRoot
>>
>> qui n'est pas moins restrictive, et retourne bien 1 seul enregistrement,
>> mais elle prend 3 minutes pour s'executer.
>>
>> dans ma table j'ai les index :
>> -pour la cle primaires
>> -sur intBordGauche
>> -sur intBordDroit
>> -sur intNiveau
>> -et un sur intBordGauche , intBordDroit et intNiveau
>>
>> Avais vous une idee pour de savoir d'ou vient le probleme ?
>>
>> Nathan
>>
>
>