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
mes données insérées avant de faire un commit), elle dure plus de 1
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
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
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
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
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
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
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
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
mes données insérées avant de faire un commit), elle dure plus de 1
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
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
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
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
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
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
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
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
mes données insérées avant de faire un commit), elle dure plus de 1
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
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
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
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
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
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
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
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
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
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
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.
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.
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 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 ***********************
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 ***********************
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 ***********************
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
controlermes 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
ticketmais 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
maispas 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
999et 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
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" <o.besson@community.nospam> wrote in message
news:ukx6amI4FHA.3400@tk2msftngp13.phx.gbl...
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
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
controlermes 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
ticketmais 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
maispas 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
999et 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
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
controlermes 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
ticketmais 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
maispas 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
999et 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
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!.br33@bol.com.br> a écrit dans le
message de news: OIgHQOJ4FHA.2552@TK2MSFTNGP10.phx.gbl...
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" <o.besson@community.nospam> wrote in message
news:ukx6amI4FHA.3400@tk2msftngp13.phx.gbl...
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
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
controlermes 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
ticketmais 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
maispas 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
999et 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
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
controlermes 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
ticketmais 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
maispas 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
999et 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
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" <o.besson@community.nospam> wrote in message
news:egKRL0R4FHA.3876@TK2MSFTNGP09.phx.gbl...
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!.br33@bol.com.br> a écrit dans le
message de news: OIgHQOJ4FHA.2552@TK2MSFTNGP10.phx.gbl...
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" <o.besson@community.nospam> wrote in message
news:ukx6amI4FHA.3400@tk2msftngp13.phx.gbl...
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
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
controlermes 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
ticketmais 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
maispas 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
999et 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