OVH Cloud OVH Cloud

Optimisation

8 réponses
Avatar
hugueslouz
Bonjour,
J'ai une requete suivante dans une application :

SELECT count(1) FROM Ma_Table WHERE col2 = 'Crietere'
AND ((col2 IS NULL) OR len(col3 = 0))

Col2 et col3 sont de type caractere
la table à 700000 lignes, un index existe sur col2 de type quand j'essaie
d'enlever la condition de AND , l'index est utilisé, mais quand toute la
condition est laissé apres where est laissée , l'index n'est pas utilisé je
vois un scan de toute la table.

est-ce il y'a moyen de d'optimiser cette requete?

je vous remercie d'avance de votre aide.

Hugueslouz

8 réponses

Avatar
Patrice
Déjà, le critère de base me parait bizarre (col2='critere' d'une part et
(col2 est null -- mais on a dit que l'on voulait 'critere' ?).

J'ai l'impression que le critère actuel revient à :

WHERE Col2='Critere' AND LEN(col3)=0 alors que tu voulais peut-être
col2='critere' or (col2 is null and len(col3)=0) ???

Attention au raccourci du langage parlé. Quand on dit je veux les voitures
rouges et jaunes cela veut dire je veux les voitures qui sont rouges *ou*
jaunes (pas la même rouge et jaune en même temps).

--
Patrice

"hugueslouz" a écrit dans le message
de news:
Bonjour,
J'ai une requete suivante dans une application :

SELECT count(1) FROM Ma_Table WHERE col2 = 'Crietere'
AND ((col2 IS NULL) OR len(col3 = 0))

Col2 et col3 sont de type caractere
la table à 700000 lignes, un index existe sur col2 de type quand j'essaie
d'enlever la condition de AND , l'index est utilisé, mais quand toute la
condition est laissé apres where est laissée , l'index n'est pas utilisé
je
vois un scan de toute la table.

est-ce il y'a moyen de d'optimiser cette requete?

je vous remercie d'avance de votre aide.

Hugueslouz





Avatar
hugueslouz
je te remercie Patrice, mais c'est vraiment ce que j'ai ecrit, en fait la
deuxieme condition vient d'une autre colonne qui est char(1) et doit etre
null ou 0.
la table fait 700000



"Patrice" a écrit :

Déjà, le critère de base me parait bizarre (col2='critere' d'une part et
(col2 est null -- mais on a dit que l'on voulait 'critere' ?).

J'ai l'impression que le critère actuel revient à :

WHERE Col2='Critere' AND LEN(col3)=0 alors que tu voulais peut-être
col2='critere' or (col2 is null and len(col3)=0) ???

Attention au raccourci du langage parlé. Quand on dit je veux les voitures
rouges et jaunes cela veut dire je veux les voitures qui sont rouges *ou*
jaunes (pas la même rouge et jaune en même temps).

--
Patrice

"hugueslouz" a écrit dans le message
de news:
> Bonjour,
> J'ai une requete suivante dans une application :
>
> SELECT count(1) FROM Ma_Table WHERE col2 = 'Crietere'
> AND ((col2 IS NULL) OR len(col3 = 0))
>
> Col2 et col3 sont de type caractere
> la table à 700000 lignes, un index existe sur col2 de type quand j'essaie
> d'enlever la condition de AND , l'index est utilisé, mais quand toute la
> condition est laissé apres where est laissée , l'index n'est pas utilisé
> je
> vois un scan de toute la table.
>
> est-ce il y'a moyen de d'optimiser cette requete?
>
> je vous remercie d'avance de votre aide.
>
> Hugueslouz
>
>
>





Avatar
Gilles LE BARBIER
Salut,

Optimisation :

préférer count(*) à une autres forme si c'est possible

si j'ai bien compris ton col3 est un char(1)
Dans ta requete tu test sa longueur !!!
Si il peut être à null pourquoi tu ne le test pas

Je traduit ta condition where en littéral

cela donne

(Col2 = 'Crietere' OR col2 IS NULL) AND (Col2 = 'Crietere' OR len(col3 = 0))

col2 est testé 2 fois dans ton premier OR !!!

Je ne sais pas si ma solution est bonne mais je te propose ceci

Select count(*) from ma_table where
ISNULL(Col2, 'Crietere' ) = 'Crietere' AND Col3 IS NULL

A+

Gilles





"hugueslouz" a écrit dans le message
de news:
Bonjour,
J'ai une requete suivante dans une application :

SELECT count(1) FROM Ma_Table WHERE col2 = 'Crietere'
AND ((col2 IS NULL) OR len(col3 = 0))

Col2 et col3 sont de type caractere
la table à 700000 lignes, un index existe sur col2 de type quand j'essaie
d'enlever la condition de AND , l'index est utilisé, mais quand toute la
condition est laissé apres where est laissée , l'index n'est pas utilisé
je
vois un scan de toute la table.

est-ce il y'a moyen de d'optimiser cette requete?

je vous remercie d'avance de votre aide.

Hugueslouz





Avatar
Patrice
Oui mais avec pour que A AND B soit vrai, il faut que A soit vrai et que B
soit vrai. Comme la partie col2 IS NULL de B est contradictoire avec A,
c'est comme si on n'avait que le critère sur COL3 dans B...

Essaie d'afficher les lignes :

SELECT * FROM Ma_Table WHERE col2 = 'Crietere'
AND ((col2 IS NULL) OR len(col3 = 0))

Tu ne verras à mon avis jamais une colonne COL2 NULL...

SELECT * FROM Ma_Table WHERE col2 = 'Crietere' AND LEN(col3)=0 devrait te
donner le même nombre de lignes

--
Patrice

"hugueslouz" a écrit dans le message
de news:
je te remercie Patrice, mais c'est vraiment ce que j'ai ecrit, en fait la
deuxieme condition vient d'une autre colonne qui est char(1) et doit etre
null ou 0.
la table fait 700000



"Patrice" a écrit :

Déjà, le critère de base me parait bizarre (col2='critere' d'une part et
(col2 est null -- mais on a dit que l'on voulait 'critere' ?).

J'ai l'impression que le critère actuel revient à :

WHERE Col2='Critere' AND LEN(col3)=0 alors que tu voulais peut-être
col2='critere' or (col2 is null and len(col3)=0) ???

Attention au raccourci du langage parlé. Quand on dit je veux les
voitures
rouges et jaunes cela veut dire je veux les voitures qui sont rouges *ou*
jaunes (pas la même rouge et jaune en même temps).

--
Patrice

"hugueslouz" a écrit dans le
message
de news:
> Bonjour,
> J'ai une requete suivante dans une application :
>
> SELECT count(1) FROM Ma_Table WHERE col2 = 'Crietere'
> AND ((col2 IS NULL) OR len(col3 = 0))
>
> Col2 et col3 sont de type caractere
> la table à 700000 lignes, un index existe sur col2 de type quand
> j'essaie
> d'enlever la condition de AND , l'index est utilisé, mais quand toute
> la
> condition est laissé apres where est laissée , l'index n'est pas
> utilisé
> je
> vois un scan de toute la table.
>
> est-ce il y'a moyen de d'optimiser cette requete?
>
> je vous remercie d'avance de votre aide.
>
> Hugueslouz
>
>
>







Avatar
Gilles LE BARBIER
Je me suis planté :-)

Je traduit ta condition where en littéral

cela donne

(Col2 = 'Crietere' AND col2 IS NULL) OR (Col2 = 'Crietere' AND len(col3 =
0))

Premier test impossible

d'ou simplification
Col2 = 'Crietere' AND len(col3 = 0)




"Gilles LE BARBIER" a écrit dans le message de
news: eMSHhW%
Salut,

Optimisation :

préférer count(*) à une autres forme si c'est possible

si j'ai bien compris ton col3 est un char(1)
Dans ta requete tu test sa longueur !!!
Si il peut être à null pourquoi tu ne le test pas

Je traduit ta condition where en littéral

cela donne

(Col2 = 'Crietere' OR col2 IS NULL) AND (Col2 = 'Crietere' OR len(col3 =
0))

col2 est testé 2 fois dans ton premier OR !!!

Je ne sais pas si ma solution est bonne mais je te propose ceci

Select count(*) from ma_table where
ISNULL(Col2, 'Crietere' ) = 'Crietere' AND Col3 IS NULL

A+

Gilles





"hugueslouz" a écrit dans le
message de news:
Bonjour,
J'ai une requete suivante dans une application :

SELECT count(1) FROM Ma_Table WHERE col2 = 'Crietere'
AND ((col2 IS NULL) OR len(col3 = 0))

Col2 et col3 sont de type caractere
la table à 700000 lignes, un index existe sur col2 de type quand j'essaie
d'enlever la condition de AND , l'index est utilisé, mais quand toute la
condition est laissé apres where est laissée , l'index n'est pas utilisé
je
vois un scan de toute la table.

est-ce il y'a moyen de d'optimiser cette requete?

je vous remercie d'avance de votre aide.

Hugueslouz








Avatar
Gilles LE BARBIER
A j'avais pas vu :-)

merci patrice
"Patrice" a écrit dans le message de news:
uZ4e5n%
Oui mais avec pour que A AND B soit vrai, il faut que A soit vrai et que B
soit vrai. Comme la partie col2 IS NULL de B est contradictoire avec A,
c'est comme si on n'avait que le critère sur COL3 dans B...

Essaie d'afficher les lignes :

SELECT * FROM Ma_Table WHERE col2 = 'Crietere'
AND ((col2 IS NULL) OR len(col3 = 0))

Tu ne verras à mon avis jamais une colonne COL2 NULL...

SELECT * FROM Ma_Table WHERE col2 = 'Crietere' AND LEN(col3)=0 devrait te
donner le même nombre de lignes

--
Patrice

"hugueslouz" a écrit dans le
message de news:
je te remercie Patrice, mais c'est vraiment ce que j'ai ecrit, en fait la
deuxieme condition vient d'une autre colonne qui est char(1) et doit etre
null ou 0.
la table fait 700000



"Patrice" a écrit :

Déjà, le critère de base me parait bizarre (col2='critere' d'une part et
(col2 est null -- mais on a dit que l'on voulait 'critere' ?).

J'ai l'impression que le critère actuel revient à :

WHERE Col2='Critere' AND LEN(col3)=0 alors que tu voulais peut-être
col2='critere' or (col2 is null and len(col3)=0) ???

Attention au raccourci du langage parlé. Quand on dit je veux les
voitures
rouges et jaunes cela veut dire je veux les voitures qui sont rouges
*ou*
jaunes (pas la même rouge et jaune en même temps).

--
Patrice

"hugueslouz" a écrit dans le
message
de news:
> Bonjour,
> J'ai une requete suivante dans une application :
>
> SELECT count(1) FROM Ma_Table WHERE col2 = 'Crietere'
> AND ((col2 IS NULL) OR len(col3 = 0))
>
> Col2 et col3 sont de type caractere
> la table à 700000 lignes, un index existe sur col2 de type quand
> j'essaie
> d'enlever la condition de AND , l'index est utilisé, mais quand toute
> la
> condition est laissé apres where est laissée , l'index n'est pas
> utilisé
> je
> vois un scan de toute la table.
>
> est-ce il y'a moyen de d'optimiser cette requete?
>
> je vous remercie d'avance de votre aide.
>
> Hugueslouz
>
>
>











Avatar
Patrice
En complément LEN(col3) ne sera pas égal à 0 si col3 est NULL comme tu
sembles le penser.

La longueur d'une "valeur inconnue" est elle-même une "valeur inconnue" et
non pas 0.

Pour revenir au sujet que t'affiches un set showplan_text on, les
statistiques sont-elles à jour ?

--
Patrice

"Patrice" a écrit dans le message de news:
uZ4e5n%
Oui mais avec pour que A AND B soit vrai, il faut que A soit vrai et que B
soit vrai. Comme la partie col2 IS NULL de B est contradictoire avec A,
c'est comme si on n'avait que le critère sur COL3 dans B...

Essaie d'afficher les lignes :

SELECT * FROM Ma_Table WHERE col2 = 'Crietere'
AND ((col2 IS NULL) OR len(col3 = 0))

Tu ne verras à mon avis jamais une colonne COL2 NULL...

SELECT * FROM Ma_Table WHERE col2 = 'Crietere' AND LEN(col3)=0 devrait te
donner le même nombre de lignes

--
Patrice

"hugueslouz" a écrit dans le
message de news:
je te remercie Patrice, mais c'est vraiment ce que j'ai ecrit, en fait la
deuxieme condition vient d'une autre colonne qui est char(1) et doit etre
null ou 0.
la table fait 700000



"Patrice" a écrit :

Déjà, le critère de base me parait bizarre (col2='critere' d'une part et
(col2 est null -- mais on a dit que l'on voulait 'critere' ?).

J'ai l'impression que le critère actuel revient à :

WHERE Col2='Critere' AND LEN(col3)=0 alors que tu voulais peut-être
col2='critere' or (col2 is null and len(col3)=0) ???

Attention au raccourci du langage parlé. Quand on dit je veux les
voitures
rouges et jaunes cela veut dire je veux les voitures qui sont rouges
*ou*
jaunes (pas la même rouge et jaune en même temps).

--
Patrice

"hugueslouz" a écrit dans le
message
de news:
> Bonjour,
> J'ai une requete suivante dans une application :
>
> SELECT count(1) FROM Ma_Table WHERE col2 = 'Crietere'
> AND ((col2 IS NULL) OR len(col3 = 0))
>
> Col2 et col3 sont de type caractere
> la table à 700000 lignes, un index existe sur col2 de type quand
> j'essaie
> d'enlever la condition de AND , l'index est utilisé, mais quand toute
> la
> condition est laissé apres where est laissée , l'index n'est pas
> utilisé
> je
> vois un scan de toute la table.
>
> est-ce il y'a moyen de d'optimiser cette requete?
>
> je vous remercie d'avance de votre aide.
>
> Hugueslouz
>
>
>











Avatar
Gilles LE BARBIER
en plus il était écrit len (col3 = 0)

une faute de frappe surement !!


Gilles