OVH Cloud OVH Cloud

Optimisation !

5 réponses
Avatar
[Bruno]
Bonjour à tous.

Quel conseils pouvez-vous me donner pour optimiser les temps de réponses de
mes requêtes ?

L'ordre des clauses "WHERE" est-il important ?




Pour exemple, ci-dessous, l'une de mes requêtes :

SELECT
annonceur.annonceur_raisonsocial_publique,
annonceur.annonceur_adresse_distribution,
annonceur.annonceur_adresse_voie_n,
annonceur.annonceur_adresse_voie_nom,
annonceur.annonceur_adresse_codepostal,
annonceur.annonceur_adresse_localite_nom,
annonceur.annonceur_photo1_actif,
annonceur.annonceur_photo1,
annonceur.annonceur_phone1_type,
annonceur.annonceur_estara,
annonceur.annonceur_phone1,
annonceur.annonceur_phone2_type,
annonceur.annonceur_phone2,
annonceur.annonceur_phone3_type,
annonceur.annonceur_phone3,
annonceur.annonceur_phone4_type,
annonceur.annonceur_phone4,
annonceur.annonceur_phone5_type,
annonceur.annonceur_phone5,
mproduit.mproduit_index,
mproduit.mproduit_motcle,
mproduit.mproduit_nom,
mproduit.mproduit_resume,
mproduit.mproduit_photo1,
mproduit.mproduit_photo1_actif,
mproduit.mproduit_prix_type,
mproduit.mproduit_prix,
mproduit.mproduit_prix_info,
aa002_annonceur_mproduit.aa002_parution_tri
FROM
aa002_annonceur_mproduit
INNER JOIN annonceur ON aa002_annonceur_mproduit.aa002_annonceur_ref =
annonceur.annonceur_index
INNER JOIN mproduit ON aa002_annonceur_mproduit.aa002_mproduit_ref =
mproduit.mproduit_index
WHERE
mproduit.mproduit_actif = 1
AND annonceur.annonceur_actif = 1
AND annonceur.annonceur_mbase_actif = 1
AND mproduit.mproduit_web_actif = 1
AND aa002_annonceur_mproduit.aa002_actif = 1
AND aa002_annonceur_mproduit.aa002_parution_actif = 1
AND aa002_annonceur_mproduit.aa002_date_parution_debut < CURRENT_TIMESTAMP
AND aa002_annonceur_mproduit.aa002_date_parution_fin > CURRENT_TIMESTAMP
AND mproduit.mproduit_type = 0
AND annonceur.annonceur_type = 2
AND mproduit.mproduit_prix_type > 0
AND aa002_annonceur_mproduit.aa002_localite_codepostal LIKE '%75001%'
AND annonceur.annonceur_adresse_codepostal LIKE '%75001%'
AND (mproduit.mproduit_motcle LIKE '%stylo%' OR
mproduit.mproduit_ref_constructeur LIKE '%stylo%')

5 réponses

Avatar
Lucazeau Daniel
"[Bruno]" <brunonewsgroup[@]wanadoo.fr> a écrit dans news:bn6uj6$sc2$1
@news-reader1.wanadoo.fr:

L'ordre des clauses "WHERE" est-il important ?




Oui, on met toujours les clauses les plus restrictives (a priori) en début
de la clause WHERE entière.

--
Daniel Lucazeau ~ Informaticien Freelance
Ajornet ~ http://www.ajornet.fr/
Avatar
Fred BROUARD
Ce n'est pas à priori l'ordr des prédicats de la clause WHERE qui va
faire gagner du temps dans cette requête. Les optimiseurs sont là pour
ça, heureusement.

En revanche c'est dans la modèlisation des données que l'on trouve les
erreurs les plus flagrantes et donc celles qui font perdre le plus de
temps...

L'exemple de cette requête est particulièrement flagrant...

En effet on retrouve le couple de données :
annonceur_phoneX_type / annonceur_phoneX
5 fois....

Outre que c'est anormal, c'est le point qui fera perdre le plus de temps
dans l'exécution de la requête.

Il aurait fallut créer une table des téléphones et une table de jointure
entre annonceur et téléphone...

exemple :

CREATE TABLE T_PHONE_PHN
(PHN_ID INTEGER NOT NULL PRIMARY KEY IDENTITY,
PHN_TYPE VARCHAR(32),
PHN_NUMBER CHAR(20))

CREATE TABLE TJ_PHONE_ANNONCEUR_PAN
(annonceur_clef ...
FOREIGN_KEY REFERENCES annonceur (annonceur_clef),
PHN_ID INTEGER NOT NULL
FOREIGN_KEY REFERENCES T_PHONE_PHN (PHN_ID),
CONSTRAINT PK_PAN PRIMARY KEY (annonceur_clef ... , PHN_ID)

Le mieux aurait été aussi d'externaliser le type de téléphone à l'aide
d'une table de référence...

A lire sur le sujet :
http://sqlpro.developpez.com/OptimSQL/SQL_optim.html

A +


[Bruno] a écrit:
Bonjour à tous.

Quel conseils pouvez-vous me donner pour optimiser les temps de réponses de
mes requêtes ?

L'ordre des clauses "WHERE" est-il important ?




Pour exemple, ci-dessous, l'une de mes requêtes :

SELECT
annonceur.annonceur_raisonsocial_publique,
annonceur.annonceur_adresse_distribution,
annonceur.annonceur_adresse_voie_n,
annonceur.annonceur_adresse_voie_nom,
annonceur.annonceur_adresse_codepostal,
annonceur.annonceur_adresse_localite_nom,
annonceur.annonceur_photo1_actif,
annonceur.annonceur_photo1,
annonceur.annonceur_phone1_type,
annonceur.annonceur_estara,
annonceur.annonceur_phone1,
annonceur.annonceur_phone2_type,
annonceur.annonceur_phone2,


> annonceur.annonceur_phone3_type,
> annonceur.annonceur_phone3,
annonceur.annonceur_phone4_type,
annonceur.annonceur_phone4,
annonceur.annonceur_phone5_type,
annonceur.annonceur_phone5,
mproduit.mproduit_index,
mproduit.mproduit_motcle,
mproduit.mproduit_nom,
mproduit.mproduit_resume,
mproduit.mproduit_photo1,
mproduit.mproduit_photo1_actif,
mproduit.mproduit_prix_type,
mproduit.mproduit_prix,
mproduit.mproduit_prix_info,
aa002_annonceur_mproduit.aa002_parution_tri
FROM
aa002_annonceur_mproduit
INNER JOIN annonceur ON aa002_annonceur_mproduit.aa002_annonceur_ref > annonceur.annonceur_index
INNER JOIN mproduit ON aa002_annonceur_mproduit.aa002_mproduit_ref > mproduit.mproduit_index
WHERE
mproduit.mproduit_actif = 1
AND annonceur.annonceur_actif = 1
AND annonceur.annonceur_mbase_actif = 1
AND mproduit.mproduit_web_actif = 1
AND aa002_annonceur_mproduit.aa002_actif = 1
AND aa002_annonceur_mproduit.aa002_parution_actif = 1
AND aa002_annonceur_mproduit.aa002_date_parution_debut < CURRENT_TIMESTAMP
AND aa002_annonceur_mproduit.aa002_date_parution_fin > CURRENT_TIMESTAMP
AND mproduit.mproduit_type = 0
AND annonceur.annonceur_type = 2
AND mproduit.mproduit_prix_type > 0
AND aa002_annonceur_mproduit.aa002_localite_codepostal LIKE '%75001%'
AND annonceur.annonceur_adresse_codepostal LIKE '%75001%'
AND (mproduit.mproduit_motcle LIKE '%stylo%' OR
mproduit.mproduit_ref_constructeur LIKE '%stylo%')





--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
[Bruno]
Merci messieurs pour ces conseils.


"Fred BROUARD" a écrit dans le message de news:

Ce n'est pas à priori l'ordr des prédicats de la clause WHERE qui va
faire gagner du temps dans cette requête. Les optimiseurs sont là pour
ça, heureusement.

En revanche c'est dans la modèlisation des données que l'on trouve les
erreurs les plus flagrantes et donc celles qui font perdre le plus de
temps...

L'exemple de cette requête est particulièrement flagrant...

En effet on retrouve le couple de données :
annonceur_phoneX_type / annonceur_phoneX
5 fois....

Outre que c'est anormal, c'est le point qui fera perdre le plus de temps
dans l'exécution de la requête.

Il aurait fallut créer une table des téléphones et une table de jointure
entre annonceur et téléphone...

exemple :

CREATE TABLE T_PHONE_PHN
(PHN_ID INTEGER NOT NULL PRIMARY KEY IDENTITY,
PHN_TYPE VARCHAR(32),
PHN_NUMBER CHAR(20))

CREATE TABLE TJ_PHONE_ANNONCEUR_PAN
(annonceur_clef ...
FOREIGN_KEY REFERENCES annonceur (annonceur_clef),
PHN_ID INTEGER NOT NULL
FOREIGN_KEY REFERENCES T_PHONE_PHN (PHN_ID),
CONSTRAINT PK_PAN PRIMARY KEY (annonceur_clef ... , PHN_ID)

Le mieux aurait été aussi d'externaliser le type de téléphone à l'aide
d'une table de référence...

A lire sur le sujet :
http://sqlpro.developpez.com/OptimSQL/SQL_optim.html

A +


[Bruno] a écrit:
> Bonjour à tous.
>
> Quel conseils pouvez-vous me donner pour optimiser les temps de réponses


de
> mes requêtes ?
>
> L'ordre des clauses "WHERE" est-il important ?
>
>
>
>
> Pour exemple, ci-dessous, l'une de mes requêtes :
>
> SELECT
> annonceur.annonceur_raisonsocial_publique,
> annonceur.annonceur_adresse_distribution,
> annonceur.annonceur_adresse_voie_n,
> annonceur.annonceur_adresse_voie_nom,
> annonceur.annonceur_adresse_codepostal,
> annonceur.annonceur_adresse_localite_nom,
> annonceur.annonceur_photo1_actif,
> annonceur.annonceur_photo1,
> annonceur.annonceur_phone1_type,
> annonceur.annonceur_estara,
> annonceur.annonceur_phone1,
> annonceur.annonceur_phone2_type,
> annonceur.annonceur_phone2,
> annonceur.annonceur_phone3_type,
> annonceur.annonceur_phone3,
> annonceur.annonceur_phone4_type,
> annonceur.annonceur_phone4,
> annonceur.annonceur_phone5_type,
> annonceur.annonceur_phone5,
> mproduit.mproduit_index,
> mproduit.mproduit_motcle,
> mproduit.mproduit_nom,
> mproduit.mproduit_resume,
> mproduit.mproduit_photo1,
> mproduit.mproduit_photo1_actif,
> mproduit.mproduit_prix_type,
> mproduit.mproduit_prix,
> mproduit.mproduit_prix_info,
> aa002_annonceur_mproduit.aa002_parution_tri
> FROM
> aa002_annonceur_mproduit
> INNER JOIN annonceur ON aa002_annonceur_mproduit.aa002_annonceur_ref > > annonceur.annonceur_index
> INNER JOIN mproduit ON aa002_annonceur_mproduit.aa002_mproduit_ref > > mproduit.mproduit_index
> WHERE
> mproduit.mproduit_actif = 1
> AND annonceur.annonceur_actif = 1
> AND annonceur.annonceur_mbase_actif = 1
> AND mproduit.mproduit_web_actif = 1
> AND aa002_annonceur_mproduit.aa002_actif = 1
> AND aa002_annonceur_mproduit.aa002_parution_actif = 1
> AND aa002_annonceur_mproduit.aa002_date_parution_debut <


CURRENT_TIMESTAMP
> AND aa002_annonceur_mproduit.aa002_date_parution_fin >


CURRENT_TIMESTAMP
> AND mproduit.mproduit_type = 0
> AND annonceur.annonceur_type = 2
> AND mproduit.mproduit_prix_type > 0
> AND aa002_annonceur_mproduit.aa002_localite_codepostal LIKE '%75001%'
> AND annonceur.annonceur_adresse_codepostal LIKE '%75001%'
> AND (mproduit.mproduit_motcle LIKE '%stylo%' OR
> mproduit.mproduit_ref_constructeur LIKE '%stylo%')
>
>

--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************



Avatar
Lionel Pénuchot
Bonjour,

Juste pour confirmer ce que dit Fred;)

Cordialement,
LionelP

"[Bruno]" <brunonewsgroup[@]wanadoo.fr> wrote in message
news:bn6uj6$sc2$


Bonjour à tous.

Quel conseils pouvez-vous me donner pour optimiser les temps de réponses


de
mes requêtes ?

L'ordre des clauses "WHERE" est-il important ?




Pour exemple, ci-dessous, l'une de mes requêtes :

SELECT
annonceur.annonceur_raisonsocial_publique,
annonceur.annonceur_adresse_distribution,
annonceur.annonceur_adresse_voie_n,
annonceur.annonceur_adresse_voie_nom,
annonceur.annonceur_adresse_codepostal,
annonceur.annonceur_adresse_localite_nom,
annonceur.annonceur_photo1_actif,
annonceur.annonceur_photo1,
annonceur.annonceur_phone1_type,
annonceur.annonceur_estara,
annonceur.annonceur_phone1,
annonceur.annonceur_phone2_type,
annonceur.annonceur_phone2,
annonceur.annonceur_phone3_type,
annonceur.annonceur_phone3,
annonceur.annonceur_phone4_type,
annonceur.annonceur_phone4,
annonceur.annonceur_phone5_type,
annonceur.annonceur_phone5,
mproduit.mproduit_index,
mproduit.mproduit_motcle,
mproduit.mproduit_nom,
mproduit.mproduit_resume,
mproduit.mproduit_photo1,
mproduit.mproduit_photo1_actif,
mproduit.mproduit_prix_type,
mproduit.mproduit_prix,
mproduit.mproduit_prix_info,
aa002_annonceur_mproduit.aa002_parution_tri
FROM
aa002_annonceur_mproduit
INNER JOIN annonceur ON aa002_annonceur_mproduit.aa002_annonceur_ref > annonceur.annonceur_index
INNER JOIN mproduit ON aa002_annonceur_mproduit.aa002_mproduit_ref > mproduit.mproduit_index
WHERE
mproduit.mproduit_actif = 1
AND annonceur.annonceur_actif = 1
AND annonceur.annonceur_mbase_actif = 1
AND mproduit.mproduit_web_actif = 1
AND aa002_annonceur_mproduit.aa002_actif = 1
AND aa002_annonceur_mproduit.aa002_parution_actif = 1
AND aa002_annonceur_mproduit.aa002_date_parution_debut <


CURRENT_TIMESTAMP
AND aa002_annonceur_mproduit.aa002_date_parution_fin > CURRENT_TIMESTAMP
AND mproduit.mproduit_type = 0
AND annonceur.annonceur_type = 2
AND mproduit.mproduit_prix_type > 0
AND aa002_annonceur_mproduit.aa002_localite_codepostal LIKE '%75001%'
AND annonceur.annonceur_adresse_codepostal LIKE '%75001%'
AND (mproduit.mproduit_motcle LIKE '%stylo%' OR
mproduit.mproduit_ref_constructeur LIKE '%stylo%')




Avatar
bruno reiter [MVP]
l'ordre des conditions du where peut avoir une importance à l'exécution de la
requête (par à la création du plan d'exécution). dans le cas où on a plusieurs
clauses reliées par and, il s'arrête de tester à la première condition non
remplie (j'ai oublié le nom de cette méthode)

dans ton exemple, c'est à mon avis les like avec joker qui pourrissent le plan
d'exécution et obligent à faire du scan

br



"[Bruno]" <brunonewsgroup[@]wanadoo.fr> wrote in message
news:bn6uj6$sc2$


Bonjour à tous.

Quel conseils pouvez-vous me donner pour optimiser les temps de réponses de
mes requêtes ?

L'ordre des clauses "WHERE" est-il important ?




Pour exemple, ci-dessous, l'une de mes requêtes :

SELECT
annonceur.annonceur_raisonsocial_publique,
annonceur.annonceur_adresse_distribution,
annonceur.annonceur_adresse_voie_n,
annonceur.annonceur_adresse_voie_nom,
annonceur.annonceur_adresse_codepostal,
annonceur.annonceur_adresse_localite_nom,
annonceur.annonceur_photo1_actif,
annonceur.annonceur_photo1,
annonceur.annonceur_phone1_type,
annonceur.annonceur_estara,
annonceur.annonceur_phone1,
annonceur.annonceur_phone2_type,
annonceur.annonceur_phone2,
annonceur.annonceur_phone3_type,
annonceur.annonceur_phone3,
annonceur.annonceur_phone4_type,
annonceur.annonceur_phone4,
annonceur.annonceur_phone5_type,
annonceur.annonceur_phone5,
mproduit.mproduit_index,
mproduit.mproduit_motcle,
mproduit.mproduit_nom,
mproduit.mproduit_resume,
mproduit.mproduit_photo1,
mproduit.mproduit_photo1_actif,
mproduit.mproduit_prix_type,
mproduit.mproduit_prix,
mproduit.mproduit_prix_info,
aa002_annonceur_mproduit.aa002_parution_tri
FROM
aa002_annonceur_mproduit
INNER JOIN annonceur ON aa002_annonceur_mproduit.aa002_annonceur_ref > annonceur.annonceur_index
INNER JOIN mproduit ON aa002_annonceur_mproduit.aa002_mproduit_ref > mproduit.mproduit_index
WHERE
mproduit.mproduit_actif = 1
AND annonceur.annonceur_actif = 1
AND annonceur.annonceur_mbase_actif = 1
AND mproduit.mproduit_web_actif = 1
AND aa002_annonceur_mproduit.aa002_actif = 1
AND aa002_annonceur_mproduit.aa002_parution_actif = 1
AND aa002_annonceur_mproduit.aa002_date_parution_debut < CURRENT_TIMESTAMP
AND aa002_annonceur_mproduit.aa002_date_parution_fin > CURRENT_TIMESTAMP
AND mproduit.mproduit_type = 0
AND annonceur.annonceur_type = 2
AND mproduit.mproduit_prix_type > 0
AND aa002_annonceur_mproduit.aa002_localite_codepostal LIKE '%75001%'
AND annonceur.annonceur_adresse_codepostal LIKE '%75001%'
AND (mproduit.mproduit_motcle LIKE '%stylo%' OR
mproduit.mproduit_ref_constructeur LIKE '%stylo%')