Optimiser une requête de type trableau croisé

Le
Damien
Bonjour,
Sur SQL 2000, j'ai la requête suivante :

SELECT
agences.nom,
'S1'=count(DISTINCT CASE societes.nom WHEN 'S1' THEN cp_contrat END),
'S2'=count(DISTINCT CASE societes.nom WHEN 'S2' THEN cp_contrat END),
'S3'=count(DISTINCT CASE societes.nom WHEN 'S3' THEN cp_contrat END),
'S4'=count(DISTINCT CASE societes.nom WHEN 'S4' THEN cp_contrat END)
FROM factures
INNER JOIN mois_comptable ON
mois_comptable.cp_temps = factures.cp_mois_comptable
INNER JOIN groupe ON
factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
INNER JOIN societes ON
groupe.code_societe = societes.code_societe
INNER JOIN agences ON
groupe.code_agence = agences.code_agence
WHERE
mois_comptable.AAAAMM Between '200303' And '200403'
GROUP BY
agences.nom

L'idée, c'est d'afficher le nombre de contrats par société et par agence du
groupe
sur une période donnée. C'est donc un tableau croisé (dynamique).

La requête met environ 60 s à l'execution

Les jointures sont très rapides et s'éxécute en 4 à 5 seconde maxi

ainsi :

SELECT
agences.nom,
count(cp_contrat)
FROM factures
INNER JOIN mois_comptable ON
mois_comptable.cp_temps = factures.cp_mois_comptable
INNER JOIN groupe ON
factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
INNER JOIN societes ON
groupe.code_societe = societes.code_societe
INNER JOIN agences ON
groupe.code_agence = agences.code_agence
WHERE
mois_comptable.AAAAMM Between '200303' And '200403'
GROUP BY
agences.nom

prend 5 secondes

Les problèmes viennent semble-t-il des Count distinct sur les colonnes
pivot.

comment puis-je optimiser ça ?

Merci de votre aide

Damien
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Steve Kass
Le #11722681
Damien,

Est-ce que cette requête donne le même résultat plus rapidement?

select
agences.nom,
count(case when nom = 'S1' then 1 end) S1,
count(case when nom = 'S2' then 1 end) S2,
count(case when nom = 'S3' then 1 end) S3,
count(case when nom = 'S4' then 1 end) S4
from (
select
agences.nom,
societes.nom,
cp_contrat
from <jointure>
where societes.nom in ('S1','S2','S3','S4')
group by agence.nom, societes.nom, cp_contrat
) t

Steve Kass
Drew University

"Damien" news:
Bonjour,
Sur SQL 2000, j'ai la requête suivante :

SELECT
agences.nom,
'S1'=count(DISTINCT CASE societes.nom WHEN 'S1' THEN cp_contrat END),
'S2'=count(DISTINCT CASE societes.nom WHEN 'S2' THEN cp_contrat END),
'S3'=count(DISTINCT CASE societes.nom WHEN 'S3' THEN cp_contrat END),
'S4'=count(DISTINCT CASE societes.nom WHEN 'S4' THEN cp_contrat END)
FROM factures
INNER JOIN mois_comptable ON
mois_comptable.cp_temps = factures.cp_mois_comptable
INNER JOIN groupe ON
factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
INNER JOIN societes ON
groupe.code_societe = societes.code_societe
INNER JOIN agences ON
groupe.code_agence = agences.code_agence
WHERE
mois_comptable.AAAAMM Between '200303' And '200403'
GROUP BY
agences.nom

L'idée, c'est d'afficher le nombre de contrats par société et par agence


du
groupe
sur une période donnée. C'est donc un tableau croisé (dynamique).

La requête met environ 60 s à l'execution

Les jointures sont très rapides et s'éxécute en 4 à 5 seconde maxi

ainsi :

SELECT
agences.nom,
count(cp_contrat)
FROM factures
INNER JOIN mois_comptable ON
mois_comptable.cp_temps = factures.cp_mois_comptable
INNER JOIN groupe ON
factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
INNER JOIN societes ON
groupe.code_societe = societes.code_societe
INNER JOIN agences ON
groupe.code_agence = agences.code_agence
WHERE
mois_comptable.AAAAMM Between '200303' And '200403'
GROUP BY
agences.nom

prend 5 secondes

Les problèmes viennent semble-t-il des Count distinct sur les colonnes
pivot.

comment puis-je optimiser ça ?

Merci de votre aide

Damien




Damien
Le #11722031
Bonjour Steve.

Magnifique !!

Le temps d'exécution est divisé par 5 ..ce qui nous fait environ 12
secondes... ce qui est très acceptable.
Petit oubli, il faut ajouter un Group By t.agences.nom à la fin de la
requête.

Merci beaucoup

Damien

"Steve Kass"
Damien,

Est-ce que cette requête donne le même résultat plus rapidement?

select
agences.nom,
count(case when nom = 'S1' then 1 end) S1,
count(case when nom = 'S2' then 1 end) S2,
count(case when nom = 'S3' then 1 end) S3,
count(case when nom = 'S4' then 1 end) S4
from (
select
agences.nom,
societes.nom,
cp_contrat
from <jointure>
where societes.nom in ('S1','S2','S3','S4')
group by agence.nom, societes.nom, cp_contrat
) t

Steve Kass
Drew University

"Damien" news:
> Bonjour,
> Sur SQL 2000, j'ai la requête suivante :
>
> SELECT
> agences.nom,
> 'S1'=count(DISTINCT CASE societes.nom WHEN 'S1' THEN cp_contrat END),
> 'S2'=count(DISTINCT CASE societes.nom WHEN 'S2' THEN cp_contrat END),
> 'S3'=count(DISTINCT CASE societes.nom WHEN 'S3' THEN cp_contrat END),
> 'S4'=count(DISTINCT CASE societes.nom WHEN 'S4' THEN cp_contrat END)
> FROM factures
> INNER JOIN mois_comptable ON
> mois_comptable.cp_temps = factures.cp_mois_comptable
> INNER JOIN groupe ON
> factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
> INNER JOIN societes ON
> groupe.code_societe = societes.code_societe
> INNER JOIN agences ON
> groupe.code_agence = agences.code_agence
> WHERE
> mois_comptable.AAAAMM Between '200303' And '200403'
> GROUP BY
> agences.nom
>
> L'idée, c'est d'afficher le nombre de contrats par société et par agence
du
> groupe
> sur une période donnée. C'est donc un tableau croisé (dynamique).
>
> La requête met environ 60 s à l'execution
>
> Les jointures sont très rapides et s'éxécute en 4 à 5 seconde maxi
>
> ainsi :
>
> SELECT
> agences.nom,
> count(cp_contrat)
> FROM factures
> INNER JOIN mois_comptable ON
> mois_comptable.cp_temps = factures.cp_mois_comptable
> INNER JOIN groupe ON
> factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
> INNER JOIN societes ON
> groupe.code_societe = societes.code_societe
> INNER JOIN agences ON
> groupe.code_agence = agences.code_agence
> WHERE
> mois_comptable.AAAAMM Between '200303' And '200403'
> GROUP BY
> agences.nom
>
> prend 5 secondes
>
> Les problèmes viennent semble-t-il des Count distinct sur les colonnes
> pivot.
>
> comment puis-je optimiser ça ?
>
> Merci de votre aide
>
> Damien
>
>




Publicité
Poster une réponse
Anonyme