ODBC - SQL - Analyse des ventes - Problème de performances
Mer 25 Mai 2011 - 10:46
(je viens d'envoyer le email à ODBC Acomba, mais je m'essaye ici aussi pour notre bien à tous....)
La situation
Lorsque j’exécute la requête [que j’ai simplifié] suivante (ramener les total des ventes par Client/Produit pour une période donnée):
Problème : Toutefois, si je change le filtre pour avoir plus qu’une seule journée:
Alors la requête prend 600 secondes et plus à revenir!
Note : la table Invoicing contient environ 200K lignes et la Table InvoicingLine environ 1M
Ma question :
Est-ce que je m’y prend de la bonne façon pour ramasser plusieurs jours??
Note 2 : Et je veux éviter de faire de la programamtion (VB, C# et compagnie).
Note 3 : Nous avons développé un système qui "synchronise" Acomba sur un Serveur SQL, mais j'aimerais éviter cette solution pour un simple rapport...
La situation
Lorsque j’exécute la requête [que j’ai simplifié] suivante (ramener les total des ventes par Client/Produit pour une période donnée):
- Code:
select Invoicing.InCustomerSupplierNumber,
Product.PrNumber,
Product.PrDescription1,
sum(IlInvoicedQty) as QteVendue,
sum(IlInvoicedQty * IlCost) as CoutantTotalReel,
sum(IlInvoicedQty * IlSellingPrice) as VendantTotalReel
from { OJ Invoicing
inner join InvoicingLine
inner join Product
on InvoicingLine.IlProductCP = Product.RecCardPos
on InvoicingLine.IlInvoicingCP = Invoicing.RecCardPos
}
Where InDate = {d '2010-01-05'}
group by Invoicing.InCustomerSupplierNumber,
Product.PrNumber,
Product.PrDescription1
Problème : Toutefois, si je change le filtre pour avoir plus qu’une seule journée:
- Code:
Where InDate between {d '2010-01-05'} and {d '2010-01-06'}
- Code:
Where InDate in ({d '2010-01-05'}, {d '2010-01-06'})
- Code:
Where InDate >= {d '2010-01-05'} and InDate <= {d '2010-01-06'}
Alors la requête prend 600 secondes et plus à revenir!
Note : la table Invoicing contient environ 200K lignes et la Table InvoicingLine environ 1M
Ma question :
Est-ce que je m’y prend de la bonne façon pour ramasser plusieurs jours??
Note 2 : Et je veux éviter de faire de la programamtion (VB, C# et compagnie).
Note 3 : Nous avons développé un système qui "synchronise" Acomba sur un Serveur SQL, mais j'aimerais éviter cette solution pour un simple rapport...
- Lartis
- Nombre de messages : 640
Ville : Laval
Date d'inscription : 03/04/2007
Fiche d'Entreprise
Nom de l'entreprise: Groupe Conseil Lartis Inc.
Re: ODBC - SQL - Analyse des ventes - Problème de performances
Jeu 2 Juin 2011 - 23:30
As-tu essayé
Where (InDate = {d '2010-01-05'}) OR (InDate = {d '2010-01-05'})
J'ai l'impression que c'est une question d'index sur le champ date qui est efficace pour = mais pas avec < et >.
Where (InDate = {d '2010-01-05'}) OR (InDate = {d '2010-01-05'})
J'ai l'impression que c'est une question d'index sur le champ date qui est efficace pour = mais pas avec < et >.
- Jeremie
- Nombre de messages : 123
Date d'inscription : 11/08/2010
Fiche d'Entreprise
Nom de l'entreprise:
Re: ODBC - SQL - Analyse des ventes - Problème de performances
Ven 3 Juin 2011 - 10:26
Votre requête semble bonne, mais honnêtement ... faut pas oublier que l"ODBC Acomba est pas super rapide non plus.
Juste pour récupérer un numéro de facture, en local j'ai un délais de 6 secondes.
une fois chez le client, ça grimpe à 3 minutes pour enregistrer une simple facture.
Hier, un de mes clients, mas fait la remarque suivant. "Dans un module qui va dans Acomba, si le bouton enregistrer reste pas enfoncé 3 ou 4 secondes, je me demande toujours si l'enregistrement à bien été faites."
Mais je suis curieux de lire la réponses que vous aurez des gens d'acomba.
@Lartis
En faites, pas vraiment.
Ça pas rapport avec le =, mais plus avec le SUM() et le Group.
Puisqu'il veut avoir le total des factures entre entre deux date pour chaque client et produit.
Acomba doit travailler plus, donc faire travailler le disque dur ...
Je ne crois pas que ça sois l'explication la plus scientifique et je suis peut être dans le champs gauche, mais selon mes observations plus la requête SQL est complexe, plus Acomba à de la misère.
Et cela dépend aussi de la configuration.
Si Acomba est sur une vielle machine, si le serveur est surchargé etc etc etc ...
Remarquez que c'est la même chose avec SQL Serveur, sauf que lui il est plus optimisé.
Et avec 200k d'enregistrement ... même SQL Server travaillerait.
Moins, mais suffisamment pour que cela paraisse.
Juste pour récupérer un numéro de facture, en local j'ai un délais de 6 secondes.
une fois chez le client, ça grimpe à 3 minutes pour enregistrer une simple facture.
Hier, un de mes clients, mas fait la remarque suivant. "Dans un module qui va dans Acomba, si le bouton enregistrer reste pas enfoncé 3 ou 4 secondes, je me demande toujours si l'enregistrement à bien été faites."
Mais je suis curieux de lire la réponses que vous aurez des gens d'acomba.
@Lartis
En faites, pas vraiment.
Ça pas rapport avec le =, mais plus avec le SUM() et le Group.
Puisqu'il veut avoir le total des factures entre entre deux date pour chaque client et produit.
Acomba doit travailler plus, donc faire travailler le disque dur ...
Je ne crois pas que ça sois l'explication la plus scientifique et je suis peut être dans le champs gauche, mais selon mes observations plus la requête SQL est complexe, plus Acomba à de la misère.
Et cela dépend aussi de la configuration.
Si Acomba est sur une vielle machine, si le serveur est surchargé etc etc etc ...
Remarquez que c'est la même chose avec SQL Serveur, sauf que lui il est plus optimisé.
Et avec 200k d'enregistrement ... même SQL Server travaillerait.
Moins, mais suffisamment pour que cela paraisse.
Re: ODBC - SQL - Analyse des ventes - Problème de performances
Ven 3 Juin 2011 - 10:38
je ne suis pas ben ben correct! j'ai eu la réponse d'Acomba la semaine dernière en fait et je ne l'ai pas posté..tut tut..!
voici la réponse :
Nous avions déjà remarqué que TransactionHeaderDetail était plus vite que Invoicing et InvoicingLine, mais bon, on se dompte...! j'imagine qu'une requête qui n'a besoin que de l'entête aura avantage à aller dans Invoicing seulement, et si on veut du détail, alors utiliser la genre de vue TransactionHeaderDetail.
Et nous aussi, c'est un peu long créer des factures (3-5 secondes).
voici la réponse :
Bonjour M. L’Abbé-Deslauriers,
Nous avons révisé votre requête SQL et voici quelques observations :
• Vous pouvez utilisez la table « TransactionHeaderDetail » ce qui permet d’éliminer une jointure dans votre requête. (Voir exemple ci-bas).
• Lorsque vous voulez filtrer sur les dates, vous devriez toujours utiliser les opérations (i.e. « Where InDate >= {d '2000-01-26'} and InDate <= {d '2000-01-27'} ). Si vous utilisez les commandes « Between » ou « In », ceux-ci augmente le temps d’exécution de la requête
Voici votre requête utilisant la table « TransactionHeaderDetail » :
Select TransactionHeaderDetail.InCustomerSupplierNumber,
Product.PrNumber,
Product.PrDescription1,
sum(IlInvoicedQty) as QteVendue,
sum(IlInvoicedQty * IlCost) as CoutantTotalReel,
sum(IlInvoicedQty * IlSellingPrice) as VendantTotalReel
from { OJ TransactionHeaderDetail
inner join Product
on TransactionHeaderDetail.IlProductCP = Product.RecCardPos
}
Where InDate >= {d '2010-01-05'} and InDate <= {d '2010-01-06'}
group by TransactionHeaderDetail.InCustomerSupplierNumber,
Product.PrNumber,
Product.PrDescription1
Si vous avez d’autres questions, n’hésitez pas à nous écrire de nouveau.
Salutations,
Nous avions déjà remarqué que TransactionHeaderDetail était plus vite que Invoicing et InvoicingLine, mais bon, on se dompte...! j'imagine qu'une requête qui n'a besoin que de l'entête aura avantage à aller dans Invoicing seulement, et si on veut du détail, alors utiliser la genre de vue TransactionHeaderDetail.
Et nous aussi, c'est un peu long créer des factures (3-5 secondes).
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum