OVH Cloud OVH Cloud

Pour les pros de SQL

3 réponses
Avatar
Didier.Piron
Bonjour,

Quelqu'un aurait-il une idée pour optimiser le code la la requête
ci-dessous. Son exécution prend plus de 15 secondes et je souhaiterais
une exécution en moins de 3 secondes.

J'ai 3 tables
Pop4 contient les titres des tâches
POP6 contient les tâches
POP10 contient les sous-tâches

T1, T2 , T3 et T4 représentent les services responsables des titres,
des tâches ou sous-tâches pour chaque trimestre.

Je souhaite réaliser une requête qui reprend les titres:
- qui sont directement de la responsabilité du service "2"
- ou dont une tâche ou une sous-tâche est responsable du service "2".

La requête doit être en écriture ce qui exclu l'utilisation de l'Union


SELECT POP4.*
FROM POP4
WHERE POP4.pop4_id In
( SELECT pop4_id
FROM POP6
WHERE POP6.pop6_id In (SELECT pop6_id FROM POP10
WHERE
POP10.T1='2' OR

POP10.T2='2' OR

POP10.T3='2' OR

POP10.T4='2')
Or POP6.T1 = '2' Or POP6.T2 = '2'
Or POP6.T3 = '2' Or POP6.T4 = '2' )

OR POP4.T1='2' OR POP4.T2='2'
OR POP4.T3='2' OR POP4.T4='2'
ORDER BY POP4.pop4_id;

Didier

3 réponses

Avatar
Gafish
Bonjour,

Juste une petite remarque au passage, est-ce qu'il n'aurait pas été plus
simple au lieu de faire quatre champs trimestres T1,T2... de faire un champ
numéro du trimestre et un champ numéro de service. Car là du coup tu es
obligé de regarder dans tes quatres champs trimestres dans chaque table.

Arnaud

"didier Piron" a écrit dans le message de
news:
Bonjour,

Quelqu'un aurait-il une idée pour optimiser le code la la requête
ci-dessous. Son exécution prend plus de 15 secondes et je souhaiterais
une exécution en moins de 3 secondes.

J'ai 3 tables
Pop4 contient les titres des tâches
POP6 contient les tâches
POP10 contient les sous-tâches

T1, T2 , T3 et T4 représentent les services responsables des titres,
des tâches ou sous-tâches pour chaque trimestre.

Je souhaite réaliser une requête qui reprend les titres:
- qui sont directement de la responsabilité du service "2"
- ou dont une tâche ou une sous-tâche est responsable du service "2".

La requête doit être en écriture ce qui exclu l'utilisation de l'Union


SELECT POP4.*
FROM POP4
WHERE POP4.pop4_id In
( SELECT pop4_id
FROM POP6
WHERE POP6.pop6_id In (SELECT pop6_id FROM POP10
WHERE
POP10.T1='2' OR

POP10.T2='2' OR

POP10.T3='2' OR

POP10.T4='2')
Or POP6.T1 = '2' Or POP6.T2 = '2'
Or POP6.T3 = '2' Or POP6.T4 = '2' )

OR POP4.T1='2' OR POP4.T2='2'
OR POP4.T3='2' OR POP4.T4='2'
ORDER BY POP4.pop4_id;

Didier


Avatar
Sylvain Lafontaine
Première idée: qui vous a montré d'utiliser des IN à la place des Join
habituelles?

Deuxième idée: les premières opérations d'optimisation prennent d'abord
place dans la définition des structures des tables et des index.

Troisième idée: apprenez les ShowPlan de SQL-Server.

Quatrième idée et non la moindre: achetez-vous un bon livre sur
l'optimisation de SQL-Server.

S. L.

"didier Piron" wrote in message
news:
Bonjour,

Quelqu'un aurait-il une idée pour optimiser le code la la requête
ci-dessous. Son exécution prend plus de 15 secondes et je souhaiterais
une exécution en moins de 3 secondes.

J'ai 3 tables
Pop4 contient les titres des tâches
POP6 contient les tâches
POP10 contient les sous-tâches

T1, T2 , T3 et T4 représentent les services responsables des titres,
des tâches ou sous-tâches pour chaque trimestre.

Je souhaite réaliser une requête qui reprend les titres:
- qui sont directement de la responsabilité du service "2"
- ou dont une tâche ou une sous-tâche est responsable du service "2".

La requête doit être en écriture ce qui exclu l'utilisation de l'Union


SELECT POP4.*
FROM POP4
WHERE POP4.pop4_id In
( SELECT pop4_id
FROM POP6
WHERE POP6.pop6_id In (SELECT pop6_id FROM POP10
WHERE
POP10.T1='2' OR

POP10.T2='2' OR

POP10.T3='2' OR

POP10.T4='2')
Or POP6.T1 = '2' Or POP6.T2 = '2'
Or POP6.T3 = '2' Or POP6.T4 = '2' )

OR POP4.T1='2' OR POP4.T2='2'
OR POP4.T3='2' OR POP4.T4='2'
ORDER BY POP4.pop4_id;

Didier


Avatar
Didier.Piron
Non! Toujours pour une question de performance car si tu procèdes de
telle manière, tu dois réaliser 8 requètes ( 4 Left join UNION 4
right join) pour remettre tes trimestres côte à côte.

Didier

"Gafish" wrote in message news:<#...
Bonjour,

Juste une petite remarque au passage, est-ce qu'il n'aurait pas été plus
simple au lieu de faire quatre champs trimestres T1,T2... de faire un champ
numéro du trimestre et un champ numéro de service. Car là du coup tu es
obligé de regarder dans tes quatres champs trimestres dans chaque table.

Arnaud

"didier Piron" a écrit dans le message de
news:
Bonjour,

Quelqu'un aurait-il une idée pour optimiser le code la la requête
ci-dessous. Son exécution prend plus de 15 secondes et je souhaiterais
une exécution en moins de 3 secondes.

J'ai 3 tables
Pop4 contient les titres des tâches
POP6 contient les tâches
POP10 contient les sous-tâches

T1, T2 , T3 et T4 représentent les services responsables des titres,
des tâches ou sous-tâches pour chaque trimestre.

Je souhaite réaliser une requête qui reprend les titres:
- qui sont directement de la responsabilité du service "2"
- ou dont une tâche ou une sous-tâche est responsable du service "2".

La requête doit être en écriture ce qui exclu l'utilisation de l'Union


SELECT POP4.*
FROM POP4
WHERE POP4.pop4_id In
( SELECT pop4_id
FROM POP6
WHERE POP6.pop6_id In (SELECT pop6_id FROM POP10
WHERE
POP10.T1='2' OR

POP10.T2='2' OR

POP10.T3='2' OR

POP10.T4='2')
Or POP6.T1 = '2' Or POP6.T2 = '2'
Or POP6.T3 = '2' Or POP6.T4 = '2' )

OR POP4.T1='2' OR POP4.T2='2'
OR POP4.T3='2' OR POP4.T4='2'
ORDER BY POP4.pop4_id;

Didier