Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VB6 + SQL2K PB Requete Select + union trés longue dans une transaction ADO.

7 réponses
Avatar
Olivier BESSON
Bonjour,

J'ai une grosse requete union que vous trouverez ci dessous.
Si je la lance sur mes données dans l'analyseur elle est quasi instantanée
(trés peu de données)
Si je vide mes tables et les charge avec les mêmes données depuis mon
frontal VB dans une transaction de l'objet ADO Connection (afin de controler
mes données insérées avant de faire un commit), elle dure plus de 1 minute.
Est-ce normal car je ne voit pas du tout pourquoi il y a une telle
différence ???
J'ai essayé d'en faire une proc. stock et c'est la même chose ???
Quelqu'un aurait-il une piste ?

Merci d'avance pour vos réponses.

Pour info : Je fait mes tests sur mon PC en local.

Olivier


SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients en anomalie' AS ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'NON' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE IND_ANOMALIE IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 ventes' AS ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_VENTE_VTE WHERE IND_ID = IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 fidelité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE IND_ID = IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 lignes' AS ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID =
VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 fidélité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.VTE_ID
AND FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''un autre client'
AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.VTE_ID
AND IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.BTQ_ID
AND BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID AND
FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
client' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID AND
IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.BTQ_ID AND
BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de vente' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_LIGNE_VENTE_LVT LVT) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de ventes avec un numéro de ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_LIGNE_VENTE_LVT LVT
WHERE VTE_ID IS NULL AND LVT_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un numéro de ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 4 ou 6 mais
pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_TYPE_LIGNE_FIDELITE IN (4, 6)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 888 ou 999
et une vente associée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NOT NULL AND FID_TYPE_LIGNE_FIDELITE IN (888, 999)
) ANO

7 réponses

Avatar
bruno reiter [MVP]
déjà, cette formulation pourrait peut-etre simplifier ta requete :

SELECT 'QUIKSILVER' AS ANO_SOURCE,
'Clients en anomalie' AS ANO_LIBELLE,
(SELECT COUNT(*) FROM T_INDIVIDU_IND
WHERE IND_ANOMALIE IS NOT NULL) AS ANO_QUANTITE,
'NON' AS ANO_BLOQUANTE,
'Tous les clients' AS TOT_LIBELLE,
(SELECT COUNT(*) FROM T_INDIVIDU_IND )
UNION
...

ensuite comment vois-tu la différence si dans ton code tu ne fais pas la
même chose que dans l'analyseur de req?

le fait d'inclure dans une transaction d'autres opérations rallonge
forcément.

... si j'ai bien compris

br


"Olivier BESSON" wrote in message
news:
Bonjour,

J'ai une grosse requete union que vous trouverez ci dessous.
Si je la lance sur mes données dans l'analyseur elle est quasi instantanée
(trés peu de données)
Si je vide mes tables et les charge avec les mêmes données depuis mon
frontal VB dans une transaction de l'objet ADO Connection (afin de


controler
mes données insérées avant de faire un commit), elle dure plus de 1


minute.
Est-ce normal car je ne voit pas du tout pourquoi il y a une telle
différence ???
J'ai essayé d'en faire une proc. stock et c'est la même chose ???
Quelqu'un aurait-il une piste ?

Merci d'avance pour vos réponses.

Pour info : Je fait mes tests sur mon PC en local.

Olivier


SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients en anomalie' AS ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'NON' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE IND_ANOMALIE IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 ventes' AS


ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_VENTE_VTE WHERE IND_ID = IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 fidelité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE IND_ID IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 lignes' AS


ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID > VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 fidélité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.VTE_ID
AND FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''un autre


client'
AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.VTE_ID
AND IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.BTQ_ID
AND BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID AND
FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
client' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID AND
IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.BTQ_ID AND
BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de vente' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_LIGNE_VENTE_LVT LVT) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de ventes avec un numéro de ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_LIGNE_VENTE_LVT LVT
WHERE VTE_ID IS NULL AND LVT_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un numéro de


ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 4 ou 6


mais
pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_TYPE_LIGNE_FIDELITE IN (4, 6)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 888 ou


999
et une vente associée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NOT NULL AND FID_TYPE_LIGNE_FIDELITE IN (888, 999)
) ANO





Avatar
Sylvain Lafontaine
Probablement un problème de compilation dû à des statistiques insuffisantes.
Ré-essayez votre procédure stockée avec l'option WITH RECOMPILE et regardez
également les plans d'exécution dans le Query Analyser.

Notez que les plans d'exécutions pourront être différents selon que la
première compilation se fera avec ou sans données et que l'option WITH
RECOMPILE aura également un effet.

Regardez aussi la possibilité d'utiliser UNION ALL au lieu de UNION; cela
avec ou sans Select Distinct.

Finalement, vous devriez laisser tomber les majuscules et écrire en
minuscules; cela va être plus lisible.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Olivier BESSON" wrote in message
news:
Bonjour,

J'ai une grosse requete union que vous trouverez ci dessous.
Si je la lance sur mes données dans l'analyseur elle est quasi instantanée
(trés peu de données)
Si je vide mes tables et les charge avec les mêmes données depuis mon
frontal VB dans une transaction de l'objet ADO Connection (afin de
controler mes données insérées avant de faire un commit), elle dure plus
de 1 minute.
Est-ce normal car je ne voit pas du tout pourquoi il y a une telle
différence ???
J'ai essayé d'en faire une proc. stock et c'est la même chose ???
Quelqu'un aurait-il une piste ?

Merci d'avance pour vos réponses.

Pour info : Je fait mes tests sur mon PC en local.

Olivier


SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients en anomalie' AS ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'NON' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE IND_ANOMALIE IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 ventes' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_VENTE_VTE WHERE IND_ID = IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 fidelité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE IND_ID = IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 lignes' AS ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID =
VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 fidélité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.VTE_ID
AND FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''un autre client'
AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.VTE_ID
AND IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.BTQ_ID
AND BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID AND
FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
client' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID AND
IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.BTQ_ID AND
BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de vente' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_LIGNE_VENTE_LVT LVT) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de ventes avec un numéro de ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_LIGNE_VENTE_LVT LVT
WHERE VTE_ID IS NULL AND LVT_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un numéro de
ticket mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI'
AS ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 4 ou 6
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_TYPE_LIGNE_FIDELITE IN (4, 6)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 888 ou 999
et une vente associée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NOT NULL AND FID_TYPE_LIGNE_FIDELITE IN (888, 999)
) ANO





Avatar
Fred BROUARD
Sylvain Lafontaine a écrit:
Probablement un problème de compilation dû à des statistiques insuffisantes.
Ré-essayez votre procédure stockée avec l'option WITH RECOMPILE et regardez
également les plans d'exécution dans le Query Analyser.

Notez que les plans d'exécutions pourront être différents selon que la
première compilation se fera avec ou sans données et que l'option WITH
RECOMPILE aura également un effet.

Regardez aussi la possibilité d'utiliser UNION ALL au lieu de UNION; cela
avec ou sans Select Distinct.

Finalement, vous devriez laisser tomber les majuscules et écrire en
minuscules; cela va être plus lisible.



Cela peu s'avérer une erreur, en plus de ne pas être dans les règles de l'art !
1) le SGBDR peu avoir été isntallé avec une collation forte et dans ce cas les
noms des objets étant sensible à la casse l'écriture majuscule est requise si la
création des objets c'est faite en majuscule.

2) une des règles de l'art est de TOUJOURS décrire ses objets SGBDR en majsucule
afin des les distinguer dans les programmes du code client :
MAJUSCULE => code exécuté sur le serveur
minsucule => code exécuté sur le client.

A +






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Sylvain Lafontaine
Hum, la première des règles de l'art est d'être lisible, avant tout.

Il n'y a aucun argument demandant à ce que tout ou partie d'un code soit
écrit exclusivement en majuscules qui tienne puisque cette section sera
moins lisible et par conséquent, plus difficile à comprendre et source de
plus d'erreurs.

Pour ce qui est que de ne mettre que quelques mots-clef - comme SELECT -
tout en majuscule, certains sont pour avec le raisonnement que le cerveau
apprend à les reconnaître en les mémorisant sous forme d'idéogramme
puisqu'ils ne sont pas nombreux. C'est une idée qui se tient mais
personnellement, je ne l'aime pas car il ne suffit pas de reconnaître
certains mots-clef du reste du texte au premier coup d'oeil pour décoder le
texte, il faut également le lire. Hors, les segments de texte en majuscule
freinent l'oeil; c'est donc un bien pour un mal et à mon avis, le mal est
plus grand que le bien ici.

Pour le reste, plusieurs personnens confondent souvent la lisibilité avec la
visibilité. Les panneaux avertisseurs sont écrits en majuscules car ils
doivent être visibles de loin et les lettres majuscules sont plus visibles
et plus facilement décodables de loin que les minuscules. Cependant, pour
les textes complexes qui sont proches de l'oeil, la lisibilité devient
beaucoup plus importante que la visibilité. (À moins, bien entendu, que
vous n'ayez choisi une taille de fonte vraiment minuscule.)

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Fred BROUARD" wrote in message
news:%


Sylvain Lafontaine a écrit:
Probablement un problème de compilation dû à des statistiques
insuffisantes. Ré-essayez votre procédure stockée avec l'option WITH
RECOMPILE et regardez également les plans d'exécution dans le Query
Analyser.

Notez que les plans d'exécutions pourront être différents selon que la
première compilation se fera avec ou sans données et que l'option WITH
RECOMPILE aura également un effet.

Regardez aussi la possibilité d'utiliser UNION ALL au lieu de UNION; cela
avec ou sans Select Distinct.

Finalement, vous devriez laisser tomber les majuscules et écrire en
minuscules; cela va être plus lisible.



Cela peu s'avérer une erreur, en plus de ne pas être dans les règles de
l'art !
1) le SGBDR peu avoir été isntallé avec une collation forte et dans ce cas
les noms des objets étant sensible à la casse l'écriture majuscule est
requise si la création des objets c'est faite en majuscule.

2) une des règles de l'art est de TOUJOURS décrire ses objets SGBDR en
majsucule afin des les distinguer dans les programmes du code client :
MAJUSCULE => code exécuté sur le serveur
minsucule => code exécuté sur le client.

A +






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************



Avatar
Olivier BESSON
Bonjour,

Merci à tous pour vos réponse, je vais essayer la solution en simplifiant le
texte de la requete comme ci dessous.
En fait pour voir la différence il faut que j'explique un peu plus
l'ensemble :
Je remonte des données dans une bdd à partir de fichiers et j'ai besoin de
faire de gros controles de validation.
Certains controles de validation peuvent être faits par des règles
d'integrité mais d'autres non.
Afin de vérifier la qualité des données, j'ai contruit cette grosse requete
et je voudrait la lancer à la fin de ma remontée juste avant de faire un
Commit mais :
Je part d'une base vide, je fais une remontée de fichiers, je commit. Si je
lance maintenant la requete dans query analyzer elle dure 1 seconde.
Je part d'une base vide, je fais une remontée de fichiers, je lance la même
requete depuis le programme avant de commiter, elle dure 1 minute.

N.B. : Pour ce qui est du SQL, j'ai été formé par F. BROUARD et je suit
précisément cette règle de tout ecrire en majscule pour bien séparer mon
code source de mon code SQL. Dans le Q.A., le fait d'avoir que des
majuscules n'est pas trés génant car il y a les couleurs. De toute façon
aucune solution n'est réellement satisfaisante c'est toujours une affaire de
compromis et de subjectivité. La seule règle pour moi est que chacun
détermine des règles qui lui conviennent et surtout qu'il s'y tienne.

Merci, je vous tiendrais au courant.


"bruno reiter [MVP]" <remove.this! a écrit dans le message
de news:
déjà, cette formulation pourrait peut-etre simplifier ta requete :

SELECT 'QUIKSILVER' AS ANO_SOURCE,
'Clients en anomalie' AS ANO_LIBELLE,
(SELECT COUNT(*) FROM T_INDIVIDU_IND
WHERE IND_ANOMALIE IS NOT NULL) AS ANO_QUANTITE,
'NON' AS ANO_BLOQUANTE,
'Tous les clients' AS TOT_LIBELLE,
(SELECT COUNT(*) FROM T_INDIVIDU_IND )
UNION
...

ensuite comment vois-tu la différence si dans ton code tu ne fais pas la
même chose que dans l'analyseur de req?

le fait d'inclure dans une transaction d'autres opérations rallonge
forcément.

... si j'ai bien compris

br


"Olivier BESSON" wrote in message
news:
Bonjour,

J'ai une grosse requete union que vous trouverez ci dessous.
Si je la lance sur mes données dans l'analyseur elle est quasi
instantanée
(trés peu de données)
Si je vide mes tables et les charge avec les mêmes données depuis mon
frontal VB dans une transaction de l'objet ADO Connection (afin de


controler
mes données insérées avant de faire un commit), elle dure plus de 1


minute.
Est-ce normal car je ne voit pas du tout pourquoi il y a une telle
différence ???
J'ai essayé d'en faire une proc. stock et c'est la même chose ???
Quelqu'un aurait-il une piste ?

Merci d'avance pour vos réponses.

Pour info : Je fait mes tests sur mon PC en local.

Olivier


SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients en anomalie' AS
ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'NON' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE IND_ANOMALIE IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 ventes' AS


ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_VENTE_VTE WHERE IND_ID = IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 fidelité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE IND_ID > IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 lignes' AS


ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID >> VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 fidélité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID > VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.VTE_ID
AND FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''un autre


client'
AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.VTE_ID
AND IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID = VTE.BTQ_ID
AND BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID
AND
FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
client' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID
AND
IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.BTQ_ID
AND
BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de vente' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_LIGNE_VENTE_LVT LVT) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de ventes avec un numéro de
ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_LIGNE_VENTE_LVT LVT
WHERE VTE_ID IS NULL AND LVT_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un numéro de


ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 4 ou 6


mais
pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_TYPE_LIGNE_FIDELITE IN (4, 6)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE, TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 888 ou


999
et une vente associée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NOT NULL AND FID_TYPE_LIGNE_FIDELITE IN (888, 999)
) ANO









Avatar
Sylvain Lafontaine
Dans votre message initial, il était loin d'être clair que la différence
entre les deux résultats - soit une seconde vs 1 minute - était que l'un
était fait avant un commit et l'autre après. On avait plutôt l'impression
que vous mesuriez cette différence entre Query Analyser d'une part et ADO
d'autre part.

Il est parfaitement normal que votre résultat avant le commit soit plus long
car les indexes n'ont pas été rebâtis et les données doivent être lus en
bonne partie à partir du fichier Log.

Vous devriez refaire votre test en ouvrant la transaction dans Query
Analyser au lieu d'ADO.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Olivier BESSON" wrote in message
news:
Bonjour,

Merci à tous pour vos réponse, je vais essayer la solution en simplifiant
le texte de la requete comme ci dessous.
En fait pour voir la différence il faut que j'explique un peu plus
l'ensemble :
Je remonte des données dans une bdd à partir de fichiers et j'ai besoin de
faire de gros controles de validation.
Certains controles de validation peuvent être faits par des règles
d'integrité mais d'autres non.
Afin de vérifier la qualité des données, j'ai contruit cette grosse
requete et je voudrait la lancer à la fin de ma remontée juste avant de
faire un Commit mais :
Je part d'une base vide, je fais une remontée de fichiers, je commit. Si
je lance maintenant la requete dans query analyzer elle dure 1 seconde.
Je part d'une base vide, je fais une remontée de fichiers, je lance la
même requete depuis le programme avant de commiter, elle dure 1 minute.

N.B. : Pour ce qui est du SQL, j'ai été formé par F. BROUARD et je suit
précisément cette règle de tout ecrire en majscule pour bien séparer mon
code source de mon code SQL. Dans le Q.A., le fait d'avoir que des
majuscules n'est pas trés génant car il y a les couleurs. De toute façon
aucune solution n'est réellement satisfaisante c'est toujours une affaire
de compromis et de subjectivité. La seule règle pour moi est que chacun
détermine des règles qui lui conviennent et surtout qu'il s'y tienne.

Merci, je vous tiendrais au courant.


"bruno reiter [MVP]" <remove.this! a écrit dans le
message de news:
déjà, cette formulation pourrait peut-etre simplifier ta requete :

SELECT 'QUIKSILVER' AS ANO_SOURCE,
'Clients en anomalie' AS ANO_LIBELLE,
(SELECT COUNT(*) FROM T_INDIVIDU_IND
WHERE IND_ANOMALIE IS NOT NULL) AS ANO_QUANTITE,
'NON' AS ANO_BLOQUANTE,
'Tous les clients' AS TOT_LIBELLE,
(SELECT COUNT(*) FROM T_INDIVIDU_IND )
UNION
...

ensuite comment vois-tu la différence si dans ton code tu ne fais pas la
même chose que dans l'analyseur de req?

le fait d'inclure dans une transaction d'autres opérations rallonge
forcément.

... si j'ai bien compris

br


"Olivier BESSON" wrote in message
news:
Bonjour,

J'ai une grosse requete union que vous trouverez ci dessous.
Si je la lance sur mes données dans l'analyseur elle est quasi
instantanée
(trés peu de données)
Si je vide mes tables et les charge avec les mêmes données depuis mon
frontal VB dans une transaction de l'objet ADO Connection (afin de


controler
mes données insérées avant de faire un commit), elle dure plus de 1


minute.
Est-ce normal car je ne voit pas du tout pourquoi il y a une telle
différence ???
J'ai essayé d'en faire une proc. stock et c'est la même chose ???
Quelqu'un aurait-il une piste ?

Merci d'avance pour vos réponses.

Pour info : Je fait mes tests sur mon PC en local.

Olivier


SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients en anomalie' AS
ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'NON' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE IND_ANOMALIE IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 ventes' AS


ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_VENTE_VTE WHERE IND_ID = IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 fidelité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE IND_ID >> IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 lignes' AS


ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID >>> VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 fidélité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID >> VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID =
VTE.VTE_ID
AND FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''un autre


client'
AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID =
VTE.VTE_ID
AND IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID =
VTE.BTQ_ID
AND BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID
AND
FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
client' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID
AND
IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.BTQ_ID
AND
BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de vente' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_LIGNE_VENTE_LVT LVT) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de ventes avec un numéro de
ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_LIGNE_VENTE_LVT LVT
WHERE VTE_ID IS NULL AND LVT_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un numéro de


ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 4 ou 6


mais
pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_TYPE_LIGNE_FIDELITE IN (4, 6)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 888 ou


999
et une vente associée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI'
AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NOT NULL AND FID_TYPE_LIGNE_FIDELITE IN (888, 999)
) ANO













Avatar
Olivier BESSON
Bonjour,
Merci pour votre réponse.
Désolé pour la clarté de l'expliquation.
En fait, je me doutais d'une réponse tel que celle là mais ça me semblait
réellement bizarre vu que les requetes sont executées sur à peu près 1000,
2000, et 6000 lignes ce qui n'est pas beaucoup même inclus dans une
transaction.
Je vais essayer en mettant la trans. dans le Q.A. mais c'est bien plus lourd
car j'ai 2 jours d'écriture pour simuler ce que fait mon V.B.
Merci pour tout.

"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)> a
écrit dans le message de news:
Dans votre message initial, il était loin d'être clair que la différence
entre les deux résultats - soit une seconde vs 1 minute - était que l'un
était fait avant un commit et l'autre après. On avait plutôt l'impression
que vous mesuriez cette différence entre Query Analyser d'une part et ADO
d'autre part.

Il est parfaitement normal que votre résultat avant le commit soit plus
long car les indexes n'ont pas été rebâtis et les données doivent être lus
en bonne partie à partir du fichier Log.

Vous devriez refaire votre test en ouvrant la transaction dans Query
Analyser au lieu d'ADO.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Olivier BESSON" wrote in message
news:
Bonjour,

Merci à tous pour vos réponse, je vais essayer la solution en simplifiant
le texte de la requete comme ci dessous.
En fait pour voir la différence il faut que j'explique un peu plus
l'ensemble :
Je remonte des données dans une bdd à partir de fichiers et j'ai besoin
de faire de gros controles de validation.
Certains controles de validation peuvent être faits par des règles
d'integrité mais d'autres non.
Afin de vérifier la qualité des données, j'ai contruit cette grosse
requete et je voudrait la lancer à la fin de ma remontée juste avant de
faire un Commit mais :
Je part d'une base vide, je fais une remontée de fichiers, je commit. Si
je lance maintenant la requete dans query analyzer elle dure 1 seconde.
Je part d'une base vide, je fais une remontée de fichiers, je lance la
même requete depuis le programme avant de commiter, elle dure 1 minute.

N.B. : Pour ce qui est du SQL, j'ai été formé par F. BROUARD et je suit
précisément cette règle de tout ecrire en majscule pour bien séparer mon
code source de mon code SQL. Dans le Q.A., le fait d'avoir que des
majuscules n'est pas trés génant car il y a les couleurs. De toute façon
aucune solution n'est réellement satisfaisante c'est toujours une affaire
de compromis et de subjectivité. La seule règle pour moi est que chacun
détermine des règles qui lui conviennent et surtout qu'il s'y tienne.

Merci, je vous tiendrais au courant.


"bruno reiter [MVP]" <remove.this! a écrit dans le
message de news:
déjà, cette formulation pourrait peut-etre simplifier ta requete :

SELECT 'QUIKSILVER' AS ANO_SOURCE,
'Clients en anomalie' AS ANO_LIBELLE,
(SELECT COUNT(*) FROM T_INDIVIDU_IND
WHERE IND_ANOMALIE IS NOT NULL) AS ANO_QUANTITE,
'NON' AS ANO_BLOQUANTE,
'Tous les clients' AS TOT_LIBELLE,
(SELECT COUNT(*) FROM T_INDIVIDU_IND )
UNION
...

ensuite comment vois-tu la différence si dans ton code tu ne fais pas la
même chose que dans l'analyseur de req?

le fait d'inclure dans une transaction d'autres opérations rallonge
forcément.

... si j'ai bien compris

br


"Olivier BESSON" wrote in message
news:
Bonjour,

J'ai une grosse requete union que vous trouverez ci dessous.
Si je la lance sur mes données dans l'analyseur elle est quasi
instantanée
(trés peu de données)
Si je vide mes tables et les charge avec les mêmes données depuis mon
frontal VB dans une transaction de l'objet ADO Connection (afin de


controler
mes données insérées avant de faire un commit), elle dure plus de 1


minute.
Est-ce normal car je ne voit pas du tout pourquoi il y a une telle
différence ???
J'ai essayé d'en faire une proc. stock et c'est la même chose ???
Quelqu'un aurait-il une piste ?

Merci d'avance pour vos réponses.

Pour info : Je fait mes tests sur mon PC en local.

Olivier


SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients en anomalie' AS
ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'NON' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE IND_ANOMALIE IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 ventes' AS


ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_VENTE_VTE WHERE IND_ID =
IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Tous les clients' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_INDIVIDU_IND IND) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Clients avec 0 fidelité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_INDIVIDU_IND IND
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE IND_ID >>> IND.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 lignes' AS


ANO_LIBELLE,
COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID >>>> VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'QUIKSILVER' AS ANO_SOURCE, 'Ventes avec 0 fidélité' AS
ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'A VOIR' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE NOT EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID >>> VTE.VTE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID =
VTE.VTE_ID
AND FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''un autre


client'
AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID =
VTE.VTE_ID
AND IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec des lignes d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_LIGNE_VENTE_LVT WHERE VTE_ID =
VTE.BTQ_ID
AND BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
remontée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID
AND
FRE_ID != VTE.FRE_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
client' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.VTE_ID
AND
IND_ID != VTE.IND_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les ventes' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE
FROM T_VENTE_VTE VTE) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Ventes avec une fidélité d''une autre
boutique' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_VENTE_VTE VTE
WHERE EXISTS (SELECT * FROM T_FIDELITE_FID WHERE VTE_ID = VTE.BTQ_ID
AND
BTQ_ID != VTE.BTQ_ID)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de vente' AS TOT_LIBELLE, COUNT(*) AS
TOT_QUANTITE FROM T_LIGNE_VENTE_LVT LVT) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de ventes avec un numéro de
ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_LIGNE_VENTE_LVT LVT
WHERE VTE_ID IS NULL AND LVT_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*)
AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un numéro de


ticket
mais pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_NUMERO_TICKET IS NOT NULL
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*)
AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 4 ou 6


mais
pas de vente' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI' AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NULL AND FID_TYPE_LIGNE_FIDELITE IN (4, 6)
) ANO
UNION
SELECT ANO_SOURCE, ANO_LIBELLE, ANO_QUANTITE, ANO_BLOQUANTE,
TOT_LIBELLE,
TOT_QUANTITE
FROM (SELECT 'Toutes les lignes de fidélité' AS TOT_LIBELLE, COUNT(*)
AS
TOT_QUANTITE FROM T_FIDELITE_FID FID) TOT CROSS JOIN
(
SELECT 'CORUS' AS ANO_SOURCE, 'Lignes de fidélité avec un type 888 ou


999
et une vente associée' AS ANO_LIBELLE, COUNT(*) AS ANO_QUANTITE, 'OUI'
AS
ANO_BLOQUANTE
FROM T_FIDELITE_FID FID
WHERE VTE_ID IS NOT NULL AND FID_TYPE_LIGNE_FIDELITE IN (888, 999)
) ANO