Newsgroup: it.comp.appl.access
Titolo: query lenta o query con differenze sugli arrotondamenti

ciao a tutti
ho questa query d'unione:
 
Select
Qry_Importi_IdSconto.IdCarico,
Qry_Importi_IdSconto.ImportoLordo,
Qry_Importi_IdSconto.IdSconto,
Qry_Importi_IdSconto.IdSconto2,
Qry_Importi_IdSconto.TotSconto,
Qry_Importi_IdSconto.MioSconto,
Qry_Importi_IdSconto.ScontoAg,
Qry_Importi_IdSconto.Netto,
Qry_Importi_IdSconto.Spese
From Qry_Importi_IdSconto
UNION Select
Qry_Importi_IdSconto2.IdCarico,
Qry_Importi_IdSconto2.ImportoLordo,
Qry_Importi_IdSconto2.IdSconto,
Qry_Importi_IdSconto2.IdSconto2,
Qry_Importi_IdSconto2.TotSconto,
Qry_Importi_IdSconto2.MioSconto,
Qry_Importi_IdSconto2.ScontoAg,
Qry_Importi_IdSconto2.Netto,
Qry_Importi_IdSconto2.Spese
From Qry_Importi_IdSconto2;
 
 
formata da queste due query:
 
query1:
 
SELECT 
B.IdCarico, 
Sum(fctRound(IIf(nz([IdSconto],0)=0,0,nz([Quantità],0)*nz([Prezzo],0)))) AS ImportoLordo, 
B.IdSconto, 0 AS IdSconto2, 
Sum(fctRound(nz([IdSconto],0)*nz([Quantità],0)*nz([Prezzo],0)/100)) AS TotSconto, 
Sum(fctRound(IIf(nz([A].[IdAgColl],0)=0,nz([IdSconto],0)*nz([Quantità],0)*nz([Prezzo],0)/100,(nz([IdSconto],0)*nz([Quantità],0)*nz([Prezzo],0)/100)/2))) AS MioSconto, 
Sum(fctRound(IIf(nz([IdAgColl],0)=0,0,nz([IdSconto],0)*nz([Quantità],0)*nz([Prezzo],0)/100)/2)) AS ScontoAg, 
nz([ImportoLordo],0)-nz([MioSconto],0)-nz([ScontoAG],0) AS Netto, Sum(nz(Analisi,0)+nz(SpeseVarie,0)) AS Spese
FROM TbProdotti AS D 
INNER JOIN ((TbOrdini AS A 
INNER JOIN TbCarichi AS B 
ON A.IdOrdine = B.IdOrdine) 
INNER JOIN DettaglioCarichi AS C 
ON B.IdCarico = C.IdCarico) 
ON D.IdProdotto = C.IdProdotto
WHERE D.Categoria<>"Imballi"
GROUP BY B.IdCarico, B.IdSconto, B.IdSconto2;
 
query2:
 
SELECT 
A.IdCarico, 
Sum(fctRound(IIf(nz([A].[IdSconto],0)<>0,0,nz([Quantità],0)*nz([Prezzo],0)))) AS ImportoLordo, 
A.IdSconto2 AS IdSconto, 
A.IdSconto2, 
Sum(fctRound(nz([IdSconto],0)*(nz([Quantità],0)*nz([Prezzo],0)+nz(DiffImp,0))/100)) AS TotSconto, 
Sum(fctRound(nz([IdSconto],0)*(nz([Quantità],0)*nz([Prezzo],0)+nz(DiffImp,0))/100)) AS MioSconto, 
0 AS ScontoAg, 
nz([ImportoLordo],0)-nz([MioSconto],0)-nz([ScontoAG],0) AS Netto, 
0 AS Spese
FROM TbProdotti AS C 
INNER JOIN (TbCarichi AS A 
INNER JOIN DettaglioCarichi AS B 
ON A.IdCarico = B.IdCarico) 
ON C.IdProdotto = B.IdProdotto
WHERE A.IdSconto=0 AND A.IdSconto2<>0 OR A.IdSconto2<>0 AND C.Categoria<>"Imballi"
GROUP BY A.IdCarico, A.IdSconto2;
 
Ora se sostituisco la query1 con quest'ultima query
 
SELECT 
Qry_Carichi.IdCarico, 
IIf(nz([IdSconto],0)=0,0,[G].[ImportoLordo]) AS ImportoLordo, 
Qry_Carichi.IdSconto, 
0 AS IdSconto2, 
fctRound(nz([IdSconto],0)*[ImportoLordo]/100) AS TotSconto, 
IIf(nz([IdAgColl],0)=0,[TotSconto],[TotSconto]/2) AS MioSconto, 
IIf(nz([IdAgColl],0)<>0,[TotSconto]/2,0) AS ScontoAg, 
nz([ImportoLordo],0)-nz([MioSconto],0)-nz([ScontoAg],0) AS Netto, 
G.Spese
FROM (Qry_Carichi 
LEFT JOIN G 
ON Qry_Carichi.IdCarico = G.FK_IdCarico) 
LEFT JOIN G_Imballi 
ON Qry_Carichi.IdCarico = G_Imballi.FK_IdCarico;
 
le prestazioni migliorano (in considerazione che i record sono circa 3000), a discapito
degli arrotondamenti.
 
Come posso fare?
grazie

 ...
Prova se diventi più veloce con
 
UNION ALL
 
che diverso da UNION non tenta di raggruppare i dati.
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 


ciao Karl, grazie
con UNION ALL
0.234375 invece di 0.386
 
le due query si possono migliorare?

 le due query si possono migliorare?
 
Dipende di dettagli, ma puoi provare di eliminare molte funzioni come 
nz() che non servono per le somme. Se vedo bene al esempio di "query1" 
sarebbe:
 
SELECT
 
B.IdCarico,
 
Sum(IIf(isnull([IdSconto]),0,fctRound([Quantità]*[Prezzo]))) AS 
ImportoLordo,
 
B.IdSconto, 0 AS IdSconto2,
 
Sum(fctRound([IdSconto]*[Quantità]*[Prezzo]/100)) AS TotSconto,
 
Sum(IIf(isnull([A].[IdAgColl]),fctRound([IdSconto]*[Quantità]*[Prezzo]/100),fctRound([IdSconto]*[Quantità]*[Prezzo]/100/2))) 
AS MioSconto,
 
Sum(IIf(isnull([IdAgColl]),0,fctRound([IdSconto]*[Quantità]*[Prezzo]/100)/2))) 
AS ScontoAg,
 
nz([ImportoLordo],0)-nz([MioSconto],0)-nz([ScontoAG],0) AS Netto, 
Sum(nz(Analisi,0)+nz(SpeseVarie,0)) AS Spese
 
FROM ...


 Secondi, minuti, anni...?
 
anni naturalmente
;-))
 
cut
___________
 
grazie Karl
in effetti cosi va molto meglio;
 
in questt'ultima posso farci ancora qualcosa?
 
SELECT 
TbCarichi.IdCarico, 
IIf(nz([IdSconto],0)=0,0,[G_IdSconto].[ImportoLordo]) AS ImportoLordo, 
TbCarichi.IdSconto, 0 AS IdSconto2, G_IdSconto.TotSconto, 
FctRound(IIf(nz([IdAgColl],0)<>0,[TotSconto]/2,[TotSconto])) AS MioSconto, 
FctRound(IIf(nz([IdAgColl],0)<>0,[TotSconto]/2,0)) AS ScontoAg, 
nz([ImportoLordo],0)-nz([MioSconto],0)-nz([ScontoAg],0) AS Netto, 
[Analisi]+[SpeseVarie] AS Spese
FROM TbOrdini 
INNER JOIN (TbCarichi 
INNER JOIN G_IdSconto 
ON TbCarichi.IdCarico = G_IdSconto.IdCarico) 
ON TbOrdini.IdOrdine = TbCarichi.IdOrdine;
 
grazie ancora

 ON TbOrdini.IdOrdine = TbCarichi.IdOrdine;
 
 
SELECT
TbCarichi.IdCarico,
 
IIf(isnull([IdSconto]),0,[G_IdSconto].[ImportoLordo]) AS ImportoLordo,
 
TbCarichi.IdSconto, 0 AS IdSconto2, G_IdSconto.TotSconto,
 
IIf(isnull([IdAgColl]),[TotSconto],FctRound([TotSconto]/2)) AS MioSconto,
 
IIf(isnull([IdAgColl]),0,FctRound([TotSconto]/2)) AS ScontoAg,
 
nz([ImportoLordo],0)-nz([MioSconto],0)-nz([ScontoAg],0) AS Netto,
[Analisi]+[SpeseVarie] AS Spese
 



grazie Karl